@@ -146,6 +146,31 @@ source %{
146
146
case Op_ExtractL:
147
147
case Op_ExtractS:
148
148
case Op_ExtractUB:
149
+ // Vector API specific
150
+ case Op_AndReductionV:
151
+ case Op_OrReductionV:
152
+ case Op_XorReductionV:
153
+ case Op_MaxReductionV:
154
+ case Op_MinReductionV:
155
+ case Op_LoadVectorGather:
156
+ case Op_StoreVectorScatter:
157
+ case Op_VectorBlend:
158
+ case Op_VectorCast:
159
+ case Op_VectorCastB2X:
160
+ case Op_VectorCastD2X:
161
+ case Op_VectorCastF2X:
162
+ case Op_VectorCastI2X:
163
+ case Op_VectorCastL2X:
164
+ case Op_VectorCastS2X:
165
+ case Op_VectorInsert:
166
+ case Op_VectorLoadConst:
167
+ case Op_VectorLoadMask:
168
+ case Op_VectorLoadShuffle:
169
+ case Op_VectorMaskCmp:
170
+ case Op_VectorRearrange:
171
+ case Op_VectorReinterpret:
172
+ case Op_VectorStoreMask:
173
+ case Op_VectorTest:
149
174
return false;
150
175
default:
151
176
return true;
@@ -507,15 +532,38 @@ instruct vpopcountI(vReg dst, vReg src) %{
507
532
__ sve_cnt(as_FloatRegister($dst$$reg), __ S, ptrue, as_FloatRegister($src$$reg));
508
533
%}
509
534
ins_pipe(pipe_slow);
510
- %}
535
+ %}dnl
511
536
537
+ dnl
538
+ dnl REDUCE_ADD_EXT($1, $2, $3, $4, $5, $6, $7 )
539
+ dnl REDUCE_ADD_EXT(insn_name, op_name, reg_dst, reg_src, size, elem_type, insn1)
540
+ define ( `REDUCE_ADD_EXT' , `
541
+ instruct $1 ( $3 dst , $4 src1 , vReg src2 , vRegD tmp ) %{
542
+ predicate ( UseSVE > 0 && n->in ( 2 ) - >bottom_type ( ) - >is_vect ( ) - >length_in_bytes ( ) >= 16 &&
543
+ n->in ( 2 ) - >bottom_type ( ) - >is_vect ( ) - >element_basic_type ( ) == $6 ) ;
544
+ match ( Set dst ( $2 src1 src2 )) ;
545
+ effect ( TEMP_DEF dst , TEMP tmp ) ;
546
+ ins_cost ( SVE_COST ) ;
547
+ format %{ "sve_uaddv $tmp , $src2\t# vector ( sve ) ( $5 ) \n\t"
548
+ "smov $dst , $tmp , $5 , 0\n\t"
549
+ "addw $dst , $dst , $src1\n\t"
550
+ "$7 $dst , $dst\t # add reduction $5" %}
551
+ ins_encode %{
552
+ __ sve_uaddv ( as_FloatRegister ( $tmp$$reg ) , __ $5 ,
553
+ ptrue , as_FloatRegister ( $src2$$reg )) ;
554
+ __ smov ( $dst$$Register , as_FloatRegister ( $tmp$$reg ) , __ $5 , 0 ) ;
555
+ __ addw ( $dst$$Register , $dst$$Register , $src1$$Register ) ;
556
+ __ $7 ( $dst$$Register , $dst$$Register ) ;
557
+ %}
558
+ ins_pipe ( pipe_slow ) ;
559
+ %}' ) dnl
512
560
dnl
513
561
dnl REDUCE_ADD($1, $2, $3, $4, $5, $6, $7 )
514
562
dnl REDUCE_ADD(insn_name, op_name, reg_dst, reg_src, size, elem_type, insn1)
515
563
define ( `REDUCE_ADD' , `
516
564
instruct $1 ( $3 dst , $4 src1 , vReg src2 , vRegD tmp ) %{
517
565
predicate ( UseSVE > 0 && n->in ( 2 ) - >bottom_type ( ) - >is_vect ( ) - >length_in_bytes ( ) >= 16 &&
518
- ELEMENT_SHORT_CHAR ( $6 , n->in ( 2 )) ) ;
566
+ n->in ( 2 ) - >bottom_type ( ) - >is_vect ( ) - >element_basic_type ( ) == $6 ) ;
519
567
match ( Set dst ( $2 src1 src2 )) ;
520
568
effect ( TEMP_DEF dst , TEMP tmp ) ;
521
569
ins_cost ( SVE_COST ) ;
@@ -545,8 +593,10 @@ instruct $1($3 src1_dst, vReg src2) %{
545
593
%}
546
594
ins_pipe ( pipe_slow ) ;
547
595
%}' ) dnl
548
- dnl
596
+
549
597
// vector add reduction
598
+ REDUCE_ADD_EXT(reduce_addB, AddReductionVI, iRegINoSp, iRegIorL2I, B, T_BYTE, sxtb)
599
+ REDUCE_ADD_EXT(reduce_addS, AddReductionVI, iRegINoSp, iRegIorL2I, H, T_SHORT, sxth)
550
600
REDUCE_ADD(reduce_addI, AddReductionVI, iRegINoSp, iRegIorL2I, S, T_INT, addw)
551
601
REDUCE_ADD(reduce_addL, AddReductionVL, iRegLNoSp, iRegL, D, T_LONG, add)
552
602
REDUCE_ADDF(reduce_addF, AddReductionVF, vRegF, S)
1 commit comments
bridgekeeper[bot] commentedon Oct 21, 2020
Review
Issues