@@ -2193,6 +2193,7 @@ bool Matcher::match_rule_supported(int opcode) {
2193
2193
case Op_DivVD:
2194
2194
case Op_AbsVF:
2195
2195
case Op_AbsVD:
2196
+ case Op_NegVI:
2196
2197
case Op_NegVF:
2197
2198
case Op_NegVD:
2198
2199
case Op_SqrtVF:
@@ -2203,6 +2204,8 @@ bool Matcher::match_rule_supported(int opcode) {
2203
2204
case Op_RoundDoubleModeV:
2204
2205
case Op_MinV:
2205
2206
case Op_MaxV:
2207
+ case Op_UMinV:
2208
+ case Op_UMaxV:
2206
2209
case Op_AndV:
2207
2210
case Op_OrV:
2208
2211
case Op_XorV:
@@ -2268,7 +2271,11 @@ bool Matcher::match_rule_supported_vector(int opcode, int vlen, BasicType bt) {
2268
2271
// MaxV, MinV need types == INT || LONG.
2269
2272
case Op_MaxV:
2270
2273
case Op_MinV:
2274
+ case Op_UMinV:
2275
+ case Op_UMaxV:
2271
2276
return bt == T_INT || bt == T_LONG;
2277
+ case Op_NegVI:
2278
+ return PowerArchitecturePPC64 >= 9 && bt == T_INT;
2272
2279
}
2273
2280
return true; // Per default match rules are supported.
2274
2281
}
@@ -8422,6 +8429,18 @@ instruct mulHighL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{
8422
8429
ins_pipe(pipe_class_default);
8423
8430
%}
8424
8431
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
+
8425
8444
// Immediate Multiplication
8426
8445
instruct mulL_reg_imm16(iRegLdst dst, iRegLsrc src1, immL16 src2) %{
8427
8446
match(Set dst (MulL src1 src2));
@@ -10783,6 +10802,36 @@ instruct cmpL3_reg_reg(iRegIdst dst, iRegLsrc src1, iRegLsrc src2, flagsRegCR0 c
10783
10802
ins_pipe(pipe_class_default);
10784
10803
%}
10785
10804
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
+
10786
10835
// Implicit range checks.
10787
10836
// A range check in the ideal world has one of the following shapes:
10788
10837
// - (If le (CmpU length index)), (IfTrue throw exception)
@@ -13347,6 +13396,46 @@ instruct vmax_reg(vecX dst, vecX src1, vecX src2) %{
13347
13396
ins_pipe(pipe_class_default);
13348
13397
%}
13349
13398
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
+
13350
13439
instruct vand(vecX dst, vecX src1, vecX src2) %{
13351
13440
match(Set dst (AndV src1 src2));
13352
13441
size(4);
@@ -13507,6 +13596,17 @@ instruct vneg2D_reg(vecX dst, vecX src) %{
13507
13596
ins_pipe(pipe_class_default);
13508
13597
%}
13509
13598
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
+
13510
13610
// Vector Square Root Instructions
13511
13611
13512
13612
instruct vsqrt4F_reg(vecX dst, vecX src) %{
0 commit comments