Skip to content

Commit 5c67e3d

Browse files
dbriemannTheRealMDoerr
authored andcommitted
8361353: [PPC64] C2: Add nodes UMulHiL, CmpUL3, UMinV, UMaxV, NegVI
Reviewed-by: mdoerr, rrich
1 parent 2349304 commit 5c67e3d

File tree

4 files changed

+107
-1
lines changed

4 files changed

+107
-1
lines changed

src/hotspot/cpu/ppc/assembler_ppc.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,7 @@ class Assembler : public AbstractAssembler {
757757
VCTZH_OPCODE = (4u << OPCODE_SHIFT | 29u << 16 | 1538u),
758758
VCTZW_OPCODE = (4u << OPCODE_SHIFT | 30u << 16 | 1538u),
759759
VCTZD_OPCODE = (4u << OPCODE_SHIFT | 31u << 16 | 1538u),
760+
VNEGW_OPCODE = (4u << OPCODE_SHIFT | 6u << 16 | 1538u),
760761

761762
// Vector Floating-Point
762763
// not implemented yet
@@ -2372,6 +2373,7 @@ class Assembler : public AbstractAssembler {
23722373
inline void vctzh( VectorRegister d, VectorRegister b);
23732374
inline void vctzw( VectorRegister d, VectorRegister b);
23742375
inline void vctzd( VectorRegister d, VectorRegister b);
2376+
inline void vnegw( VectorRegister d, VectorRegister b);
23752377
// Vector Floating-Point not implemented yet
23762378
inline void mtvscr( VectorRegister b);
23772379
inline void mfvscr( VectorRegister d);

src/hotspot/cpu/ppc/assembler_ppc.inline.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,9 @@ inline void Assembler::vctzd( VectorRegister d, VectorRegister b)
10921092
inline void Assembler::mtvscr( VectorRegister b) { emit_int32( MTVSCR_OPCODE | vrb(b)); }
10931093
inline void Assembler::mfvscr( VectorRegister d) { emit_int32( MFVSCR_OPCODE | vrt(d)); }
10941094

1095+
// Vector Negate Word (introduced with Power 9)
1096+
inline void Assembler::vnegw( VectorRegister d, VectorRegister b) { emit_int32( VNEGW_OPCODE | vrt(d) | vrb(b)); }
1097+
10951098
// AES (introduced with Power 8)
10961099
inline void Assembler::vcipher( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCIPHER_OPCODE | vrt(d) | vra(a) | vrb(b)); }
10971100
inline void Assembler::vcipherlast( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCIPHERLAST_OPCODE | vrt(d) | vra(a) | vrb(b)); }

src/hotspot/cpu/ppc/ppc.ad

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2193,6 +2193,7 @@ bool Matcher::match_rule_supported(int opcode) {
21932193
case Op_DivVD:
21942194
case Op_AbsVF:
21952195
case Op_AbsVD:
2196+
case Op_NegVI:
21962197
case Op_NegVF:
21972198
case Op_NegVD:
21982199
case Op_SqrtVF:
@@ -2203,6 +2204,8 @@ bool Matcher::match_rule_supported(int opcode) {
22032204
case Op_RoundDoubleModeV:
22042205
case Op_MinV:
22052206
case Op_MaxV:
2207+
case Op_UMinV:
2208+
case Op_UMaxV:
22062209
case Op_AndV:
22072210
case Op_OrV:
22082211
case Op_XorV:
@@ -2268,7 +2271,11 @@ bool Matcher::match_rule_supported_vector(int opcode, int vlen, BasicType bt) {
22682271
// MaxV, MinV need types == INT || LONG.
22692272
case Op_MaxV:
22702273
case Op_MinV:
2274+
case Op_UMinV:
2275+
case Op_UMaxV:
22712276
return bt == T_INT || bt == T_LONG;
2277+
case Op_NegVI:
2278+
return PowerArchitecturePPC64 >= 9 && bt == T_INT;
22722279
}
22732280
return true; // Per default match rules are supported.
22742281
}
@@ -8422,6 +8429,18 @@ instruct mulHighL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{
84228429
ins_pipe(pipe_class_default);
84238430
%}
84248431

8432+
instruct uMulHighL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{
8433+
match(Set dst (UMulHiL src1 src2));
8434+
ins_cost(DEFAULT_COST);
8435+
8436+
format %{ "MULHDU $dst $src1, $src2 \t// unsigned long" %}
8437+
size(4);
8438+
ins_encode %{
8439+
__ mulhdu($dst$$Register, $src1$$Register, $src2$$Register);
8440+
%}
8441+
ins_pipe(pipe_class_default);
8442+
%}
8443+
84258444
// Immediate Multiplication
84268445
instruct mulL_reg_imm16(iRegLdst dst, iRegLsrc src1, immL16 src2) %{
84278446
match(Set dst (MulL src1 src2));
@@ -10783,6 +10802,36 @@ instruct cmpL3_reg_reg(iRegIdst dst, iRegLsrc src1, iRegLsrc src2, flagsRegCR0 c
1078310802
ins_pipe(pipe_class_default);
1078410803
%}
1078510804

10805+
instruct cmpU3_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2, flagsRegCR0 cr0) %{
10806+
match(Set dst (CmpU3 src1 src2));
10807+
effect(KILL cr0);
10808+
ins_cost(DEFAULT_COST * 5);
10809+
size((VM_Version::has_brw() ? 16 : 20));
10810+
10811+
format %{ "cmpU3_reg_reg $dst, $src1, $src2" %}
10812+
10813+
ins_encode %{
10814+
__ cmplw(CR0, $src1$$Register, $src2$$Register);
10815+
__ set_cmp3($dst$$Register);
10816+
%}
10817+
ins_pipe(pipe_class_default);
10818+
%}
10819+
10820+
instruct cmpUL3_reg_reg(iRegIdst dst, iRegLsrc src1, iRegLsrc src2, flagsRegCR0 cr0) %{
10821+
match(Set dst (CmpUL3 src1 src2));
10822+
effect(KILL cr0);
10823+
ins_cost(DEFAULT_COST * 5);
10824+
size((VM_Version::has_brw() ? 16 : 20));
10825+
10826+
format %{ "cmpUL3_reg_reg $dst, $src1, $src2" %}
10827+
10828+
ins_encode %{
10829+
__ cmpld(CR0, $src1$$Register, $src2$$Register);
10830+
__ set_cmp3($dst$$Register);
10831+
%}
10832+
ins_pipe(pipe_class_default);
10833+
%}
10834+
1078610835
// Implicit range checks.
1078710836
// A range check in the ideal world has one of the following shapes:
1078810837
// - (If le (CmpU length index)), (IfTrue throw exception)
@@ -13347,6 +13396,46 @@ instruct vmax_reg(vecX dst, vecX src1, vecX src2) %{
1334713396
ins_pipe(pipe_class_default);
1334813397
%}
1334913398

13399+
instruct vminu_reg(vecX dst, vecX src1, vecX src2) %{
13400+
match(Set dst (UMinV src1 src2));
13401+
format %{ "VMINU $dst,$src1,$src2\t// vector unsigned min" %}
13402+
size(4);
13403+
ins_encode %{
13404+
BasicType bt = Matcher::vector_element_basic_type(this);
13405+
switch (bt) {
13406+
case T_INT:
13407+
__ vminuw($dst$$VectorRegister, $src1$$VectorRegister, $src2$$VectorRegister);
13408+
break;
13409+
case T_LONG:
13410+
__ vminud($dst$$VectorRegister, $src1$$VectorRegister, $src2$$VectorRegister);
13411+
break;
13412+
default:
13413+
ShouldNotReachHere();
13414+
}
13415+
%}
13416+
ins_pipe(pipe_class_default);
13417+
%}
13418+
13419+
instruct vmaxu_reg(vecX dst, vecX src1, vecX src2) %{
13420+
match(Set dst (UMaxV src1 src2));
13421+
format %{ "VMAXU $dst,$src1,$src2\t// vector unsigned max" %}
13422+
size(4);
13423+
ins_encode %{
13424+
BasicType bt = Matcher::vector_element_basic_type(this);
13425+
switch (bt) {
13426+
case T_INT:
13427+
__ vmaxuw($dst$$VectorRegister, $src1$$VectorRegister, $src2$$VectorRegister);
13428+
break;
13429+
case T_LONG:
13430+
__ vmaxud($dst$$VectorRegister, $src1$$VectorRegister, $src2$$VectorRegister);
13431+
break;
13432+
default:
13433+
ShouldNotReachHere();
13434+
}
13435+
%}
13436+
ins_pipe(pipe_class_default);
13437+
%}
13438+
1335013439
instruct vand(vecX dst, vecX src1, vecX src2) %{
1335113440
match(Set dst (AndV src1 src2));
1335213441
size(4);
@@ -13507,6 +13596,17 @@ instruct vneg2D_reg(vecX dst, vecX src) %{
1350713596
ins_pipe(pipe_class_default);
1350813597
%}
1350913598

13599+
instruct vneg4I_reg(vecX dst, vecX src) %{
13600+
match(Set dst (NegVI src));
13601+
predicate(PowerArchitecturePPC64 >= 9 && Matcher::vector_element_basic_type(n) == T_INT);
13602+
format %{ "VNEGW $dst,$src\t// negate int vector" %}
13603+
size(4);
13604+
ins_encode %{
13605+
__ vnegw($dst$$VectorRegister, $src$$VectorRegister);
13606+
%}
13607+
ins_pipe(pipe_class_default);
13608+
%}
13609+
1351013610
// Vector Square Root Instructions
1351113611

1351213612
instruct vsqrt4F_reg(vecX dst, vecX src) %{

test/hotspot/jtreg/compiler/intrinsics/TestCompareUnsigned.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
* @test
3131
* @key randomness
3232
* @bug 8283726 8287925
33-
* @requires os.arch=="amd64" | os.arch=="x86_64" | os.arch=="aarch64" | os.arch=="riscv64"
33+
* @requires os.arch=="amd64" | os.arch=="x86_64" | os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="ppc64" | os.arch=="ppc64le"
34+
3435
* @summary Test the intrinsics implementation of Integer/Long::compareUnsigned
3536
* @library /test/lib /
3637
* @run driver compiler.intrinsics.TestCompareUnsigned

0 commit comments

Comments
 (0)