@@ -80,6 +80,17 @@ private abstract static class Shape<E> {
80
80
public final VectorShuffle <E > compressEvensShuffle = VectorShuffle .fromOp (species (), i -> (i * 2 ) % species ().length ());
81
81
public final VectorMask <E > lowMask = VectorMask .fromLong (species (), (1L << (species ().length () / 2 )) - 1 );
82
82
public final VectorMask <E > highMask = VectorMask .fromLong (species (), ((1L << (species ().length () / 2 )) - 1 ) << (species ().length () / 2 ));
83
+ public final VectorMask <E > evensMask ;
84
+ public final VectorMask <E > oddsMask ;
85
+
86
+ protected Shape () {
87
+ boolean [] values = new boolean [species ().length () + 1 ];
88
+ for (int i = 0 ; i < values .length ; i ++) {
89
+ values [i ] = i % 2 == 0 ;
90
+ }
91
+ evensMask = species ().loadMask (values , 0 );
92
+ oddsMask = species ().loadMask (values , 1 );
93
+ }
83
94
84
95
public abstract Vector <E > reinterpret (ByteVector bytes );
85
96
@@ -738,8 +749,8 @@ private static <E> ByteVector unop(ByteVector xBytes, Shape<E> shape, VectorOper
738
749
739
750
private static <E , F > ByteVector extadd_pairwise (ByteVector xBytes , Shape <E > shape , VectorOperators .Conversion <E , F > conv ) {
740
751
Vector <E > x = shape .reinterpret (xBytes );
741
- Vector <F > evens = x .compress (evens ( shape ) ).convert (conv , 0 );
742
- Vector <F > odds = x .compress (odds ( shape ) ).convert (conv , 0 );
752
+ Vector <F > evens = x .compress (shape . evensMask ).convert (conv , 0 );
753
+ Vector <F > odds = x .compress (shape . oddsMask ).convert (conv , 0 );
743
754
Vector <F > result = evens .add (odds );
744
755
return result .reinterpretAsBytes ();
745
756
}
@@ -1045,10 +1056,10 @@ private static <E, F> ByteVector extmul(ByteVector xBytes, ByteVector yBytes, Sh
1045
1056
private static ByteVector i32x4_dot_i16x8_s (ByteVector xBytes , ByteVector yBytes ) {
1046
1057
ShortVector x = xBytes .reinterpretAsShorts ();
1047
1058
ShortVector y = yBytes .reinterpretAsShorts ();
1048
- Vector <Integer > xEvens = castInt128 (x .compress (castShort128Mask (evens ( I16X8 ) )).convert (VectorOperators .S2I , 0 ));
1049
- Vector <Integer > xOdds = castInt128 (x .compress (castShort128Mask (odds ( I16X8 ) )).convert (VectorOperators .S2I , 0 ));
1050
- Vector <Integer > yEvens = castInt128 (y .compress (castShort128Mask (evens ( I16X8 ) )).convert (VectorOperators .S2I , 0 ));
1051
- Vector <Integer > yOdds = castInt128 (y .compress (castShort128Mask (odds ( I16X8 ) )).convert (VectorOperators .S2I , 0 ));
1059
+ Vector <Integer > xEvens = castInt128 (x .compress (castShort128Mask (I16X8 . evensMask )).convert (VectorOperators .S2I , 0 ));
1060
+ Vector <Integer > xOdds = castInt128 (x .compress (castShort128Mask (I16X8 . oddsMask )).convert (VectorOperators .S2I , 0 ));
1061
+ Vector <Integer > yEvens = castInt128 (y .compress (castShort128Mask (I16X8 . evensMask )).convert (VectorOperators .S2I , 0 ));
1062
+ Vector <Integer > yOdds = castInt128 (y .compress (castShort128Mask (I16X8 . oddsMask )).convert (VectorOperators .S2I , 0 ));
1052
1063
Vector <Integer > xMulYEvens = xEvens .mul (yEvens );
1053
1064
Vector <Integer > xMulYOdds = xOdds .mul (yOdds );
1054
1065
Vector <Integer > dot = xMulYEvens .lanewise (VectorOperators .ADD , xMulYOdds );
@@ -1070,10 +1081,10 @@ private static <E> ByteVector pmax(ByteVector xBytes, ByteVector yBytes, Shape<E
1070
1081
}
1071
1082
1072
1083
private static ByteVector i16x8_relaxed_dot_i8x16_i7x16_s (ByteVector x , ByteVector y ) {
1073
- Vector <Short > xEvens = castShort128 (x .compress (castByte128Mask (evens ( I8X16 ) )).convert (VectorOperators .B2S , 0 ));
1074
- Vector <Short > xOdds = castShort128 (x .compress (castByte128Mask (odds ( I8X16 ) )).convert (VectorOperators .B2S , 0 ));
1075
- Vector <Short > yEvens = castShort128 (y .compress (castByte128Mask (evens ( I8X16 ) )).convert (VectorOperators .B2S , 0 ));
1076
- Vector <Short > yOdds = castShort128 (y .compress (castByte128Mask (odds ( I8X16 ) )).convert (VectorOperators .B2S , 0 ));
1084
+ Vector <Short > xEvens = castShort128 (x .compress (castByte128Mask (I8X16 . evensMask )).convert (VectorOperators .B2S , 0 ));
1085
+ Vector <Short > xOdds = castShort128 (x .compress (castByte128Mask (I8X16 . oddsMask )).convert (VectorOperators .B2S , 0 ));
1086
+ Vector <Short > yEvens = castShort128 (y .compress (castByte128Mask (I8X16 . evensMask )).convert (VectorOperators .B2S , 0 ));
1087
+ Vector <Short > yOdds = castShort128 (y .compress (castByte128Mask (I8X16 . oddsMask )).convert (VectorOperators .B2S , 0 ));
1077
1088
Vector <Short > xMulYEvens = xEvens .mul (yEvens );
1078
1089
Vector <Short > xMulYOdds = xOdds .mul (yOdds );
1079
1090
Vector <Short > dot = xMulYEvens .lanewise (VectorOperators .SADD , xMulYOdds );
@@ -1112,15 +1123,15 @@ private static ByteVector f64x2_ternop(ByteVector xBytes, ByteVector yBytes, Byt
1112
1123
1113
1124
private static ByteVector i32x4_relaxed_dot_i8x16_i7x16_add_s (ByteVector x , ByteVector y , ByteVector zBytes ) {
1114
1125
IntVector z = zBytes .reinterpretAsInts ();
1115
- ShortVector xEvens = castShort128 (x .compress (castByte128Mask (evens ( I8X16 ) )).convert (VectorOperators .B2S , 0 ));
1116
- ShortVector xOdds = castShort128 (x .compress (castByte128Mask (odds ( I8X16 ) )).convert (VectorOperators .B2S , 0 ));
1117
- ShortVector yEvens = castShort128 (y .compress (castByte128Mask (evens ( I8X16 ) )).convert (VectorOperators .B2S , 0 ));
1118
- ShortVector yOdds = castShort128 (y .compress (castByte128Mask (odds ( I8X16 ) )).convert (VectorOperators .B2S , 0 ));
1126
+ ShortVector xEvens = castShort128 (x .compress (castByte128Mask (I8X16 . evensMask )).convert (VectorOperators .B2S , 0 ));
1127
+ ShortVector xOdds = castShort128 (x .compress (castByte128Mask (I8X16 . oddsMask )).convert (VectorOperators .B2S , 0 ));
1128
+ ShortVector yEvens = castShort128 (y .compress (castByte128Mask (I8X16 . evensMask )).convert (VectorOperators .B2S , 0 ));
1129
+ ShortVector yOdds = castShort128 (y .compress (castByte128Mask (I8X16 . oddsMask )).convert (VectorOperators .B2S , 0 ));
1119
1130
ShortVector xMulYEvens = xEvens .mul (yEvens );
1120
1131
ShortVector xMulYOdds = xOdds .mul (yOdds );
1121
1132
ShortVector dot = xMulYEvens .lanewise (VectorOperators .SADD , xMulYOdds );
1122
- IntVector dotEvens = castInt128 (dot .compress (castShort128Mask (evens ( I16X8 ) )).convert (VectorOperators .S2I , 0 ));
1123
- IntVector dotOdds = castInt128 (dot .compress (castShort128Mask (odds ( I16X8 ) )).convert (VectorOperators .S2I , 0 ));
1133
+ IntVector dotEvens = castInt128 (dot .compress (castShort128Mask (I16X8 . evensMask )).convert (VectorOperators .S2I , 0 ));
1134
+ IntVector dotOdds = castInt128 (dot .compress (castShort128Mask (I16X8 . oddsMask )).convert (VectorOperators .S2I , 0 ));
1124
1135
IntVector dots = dotEvens .add (dotOdds );
1125
1136
IntVector result = dots .add (z );
1126
1137
return result .reinterpretAsBytes ();
@@ -1231,23 +1242,6 @@ private static <E, F> ByteVector upcastBinopDowncast(ByteVector xBytes, ByteVect
1231
1242
return result .reinterpretAsBytes ();
1232
1243
}
1233
1244
1234
- private static final boolean [] ALTERNATING_BITS ;
1235
-
1236
- static {
1237
- ALTERNATING_BITS = new boolean [I8X16 .species ().length () + 1 ];
1238
- for (int i = 0 ; i < ALTERNATING_BITS .length ; i ++) {
1239
- ALTERNATING_BITS [i ] = i % 2 == 0 ;
1240
- }
1241
- }
1242
-
1243
- private static <E > VectorMask <E > evens (Shape <E > shape ) {
1244
- return VectorMask .fromArray (shape .species (), ALTERNATING_BITS , 0 );
1245
- }
1246
-
1247
- private static <E > VectorMask <E > odds (Shape <E > shape ) {
1248
- return VectorMask .fromArray (shape .species (), ALTERNATING_BITS , 1 );
1249
- }
1250
-
1251
1245
@ Override
1252
1246
public ByteVector fromArray (byte [] bytes , int offset ) {
1253
1247
return ByteVector .fromArray (I8X16 .species (), bytes , offset );
0 commit comments