@@ -101,6 +101,27 @@ source %{
101
101
return vt->element_basic_type();
102
102
}
103
103
104
+ static Assembler::SIMD_RegVariant elemBytes_to_regVariant(int esize) {
105
+ switch(esize) {
106
+ case 1:
107
+ return Assembler::B;
108
+ case 2:
109
+ return Assembler::H;
110
+ case 4:
111
+ return Assembler::S;
112
+ case 8:
113
+ return Assembler::D;
114
+ default:
115
+ assert(false, "unsupported");
116
+ ShouldNotReachHere();
117
+ }
118
+ return Assembler::INVALID;
119
+ }
120
+
121
+ static Assembler::SIMD_RegVariant elemType_to_regVariant(BasicType bt) {
122
+ return elemBytes_to_regVariant(type2aelembytes(bt));
123
+ }
124
+
104
125
typedef void (C2_MacroAssembler::* sve_mem_insn_predicate)(FloatRegister Rt, Assembler::SIMD_RegVariant T,
105
126
PRegister Pg, const Address &adr);
106
127
@@ -464,56 +485,44 @@ instruct vdivD(vReg dst_src1, vReg src2) %{
464
485
ins_pipe(pipe_slow);
465
486
%}
466
487
467
- // vector max
468
-
469
- instruct vmaxF(vReg dst_src1, vReg src2) %{
470
- predicate(UseSVE > 0 && n->as_Vector()->length() >= 4 &&
471
- n->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
472
- match(Set dst_src1 (MaxV dst_src1 src2));
473
- ins_cost(SVE_COST);
474
- format %{ "sve_fmax $dst_src1, $dst_src1, $src2\t # vector (sve) (S)" %}
475
- ins_encode %{
476
- __ sve_fmax(as_FloatRegister($dst_src1$$reg), __ S,
477
- ptrue, as_FloatRegister($src2$$reg));
478
- %}
479
- ins_pipe(pipe_slow);
480
- %}
481
-
482
- instruct vmaxD(vReg dst_src1, vReg src2) %{
483
- predicate(UseSVE > 0 && n->as_Vector()->length() >= 2 &&
484
- n->bottom_type()->is_vect()->element_basic_type() == T_DOUBLE);
485
- match(Set dst_src1 (MaxV dst_src1 src2));
486
- ins_cost(SVE_COST);
487
- format %{ "sve_fmax $dst_src1, $dst_src1, $src2\t # vector (sve) (D)" %}
488
- ins_encode %{
489
- __ sve_fmax(as_FloatRegister($dst_src1$$reg), __ D,
490
- ptrue, as_FloatRegister($src2$$reg));
491
- %}
492
- ins_pipe(pipe_slow);
493
- %}
488
+ // vector min/max
494
489
495
- instruct vminF(vReg dst_src1, vReg src2) %{
496
- predicate(UseSVE > 0 && n->as_Vector()->length() >= 4 &&
497
- n->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
490
+ instruct vmin(vReg dst_src1, vReg src2) %{
491
+ predicate(UseSVE > 0 && n->as_Vector()->length_in_bytes() >= 16);
498
492
match(Set dst_src1 (MinV dst_src1 src2));
499
493
ins_cost(SVE_COST);
500
- format %{ "sve_fmin $dst_src1, $dst_src1, $src2\t # vector (sve) (S )" %}
494
+ format %{ "sve_min $dst_src1, $dst_src1, $src2\t # vector (sve)" %}
501
495
ins_encode %{
502
- __ sve_fmin(as_FloatRegister($dst_src1$$reg), __ S,
503
- ptrue, as_FloatRegister($src2$$reg));
496
+ BasicType bt = vector_element_basic_type(this);
497
+ Assembler::SIMD_RegVariant size = elemType_to_regVariant(bt);
498
+ if (is_floating_point_type(bt)) {
499
+ __ sve_fmin(as_FloatRegister($dst_src1$$reg), size,
500
+ ptrue, as_FloatRegister($src2$$reg));
501
+ } else {
502
+ assert(is_integral_type(bt), "Unsupported type");
503
+ __ sve_smin(as_FloatRegister($dst_src1$$reg), size,
504
+ ptrue, as_FloatRegister($src2$$reg));
505
+ }
504
506
%}
505
507
ins_pipe(pipe_slow);
506
508
%}
507
509
508
- instruct vminD(vReg dst_src1, vReg src2) %{
509
- predicate(UseSVE > 0 && n->as_Vector()->length() >= 2 &&
510
- n->bottom_type()->is_vect()->element_basic_type() == T_DOUBLE);
511
- match(Set dst_src1 (MinV dst_src1 src2));
510
+ instruct vmax(vReg dst_src1, vReg src2) %{
511
+ predicate(UseSVE > 0 && n->as_Vector()->length_in_bytes() >= 16);
512
+ match(Set dst_src1 (MaxV dst_src1 src2));
512
513
ins_cost(SVE_COST);
513
- format %{ "sve_fmin $dst_src1, $dst_src1, $src2\t # vector (sve) (D )" %}
514
+ format %{ "sve_max $dst_src1, $dst_src1, $src2\t # vector (sve)" %}
514
515
ins_encode %{
515
- __ sve_fmin(as_FloatRegister($dst_src1$$reg), __ D,
516
- ptrue, as_FloatRegister($src2$$reg));
516
+ BasicType bt = vector_element_basic_type(this);
517
+ Assembler::SIMD_RegVariant size = elemType_to_regVariant(bt);
518
+ if (is_floating_point_type(bt)) {
519
+ __ sve_fmax(as_FloatRegister($dst_src1$$reg), size,
520
+ ptrue, as_FloatRegister($src2$$reg));
521
+ } else {
522
+ assert(is_integral_type(bt), "Unsupported type");
523
+ __ sve_smax(as_FloatRegister($dst_src1$$reg), size,
524
+ ptrue, as_FloatRegister($src2$$reg));
525
+ }
517
526
%}
518
527
ins_pipe(pipe_slow);
519
528
%}
0 commit comments