@@ -3831,12 +3831,17 @@ Expression* TranslateToFuzzReader::makeUnary(Type type) {
3831
3831
}
3832
3832
case Type::v128: {
3833
3833
assert (wasm.features .hasSIMD ());
3834
- // TODO: Add the other SIMD unary ops
3835
- return buildUnary ({pick (AnyTrueVec128,
3836
- AllTrueVecI8x16,
3837
- AllTrueVecI16x8,
3838
- AllTrueVecI32x4),
3839
- make (Type::v128)});
3834
+ auto op = pick (FeatureOptions<UnaryOp>().add (FeatureSet::SIMD,
3835
+ AnyTrueVec128,
3836
+ AllTrueVecI8x16,
3837
+ AllTrueVecI16x8,
3838
+ AllTrueVecI32x4,
3839
+ AllTrueVecI64x2,
3840
+ BitmaskVecI8x16,
3841
+ BitmaskVecI16x8,
3842
+ BitmaskVecI32x4,
3843
+ BitmaskVecI64x2));
3844
+ return buildUnary ({op, make (Type::v128)});
3840
3845
}
3841
3846
case Type::none:
3842
3847
case Type::unreachable:
@@ -3945,46 +3950,76 @@ Expression* TranslateToFuzzReader::makeUnary(Type type) {
3945
3950
case 3 :
3946
3951
return buildUnary ({SplatVecF64x2, make (Type::f64 )});
3947
3952
case 4 :
3948
- return buildUnary (
3949
- {pick (FeatureOptions<UnaryOp>()
3950
- .add (FeatureSet::SIMD,
3951
- NotVec128,
3952
- // TODO: add additional SIMD instructions
3953
- NegVecI8x16,
3954
- NegVecI16x8,
3955
- NegVecI32x4,
3956
- NegVecI64x2,
3957
- AbsVecF32x4,
3958
- NegVecF32x4,
3959
- SqrtVecF32x4,
3960
- AbsVecF64x2,
3961
- NegVecF64x2,
3962
- SqrtVecF64x2,
3963
- TruncSatSVecF32x4ToVecI32x4,
3964
- TruncSatUVecF32x4ToVecI32x4,
3965
- ConvertSVecI32x4ToVecF32x4,
3966
- ConvertUVecI32x4ToVecF32x4,
3967
- ExtendLowSVecI8x16ToVecI16x8,
3968
- ExtendHighSVecI8x16ToVecI16x8,
3969
- ExtendLowUVecI8x16ToVecI16x8,
3970
- ExtendHighUVecI8x16ToVecI16x8,
3971
- ExtendLowSVecI16x8ToVecI32x4,
3972
- ExtendHighSVecI16x8ToVecI32x4,
3973
- ExtendLowUVecI16x8ToVecI32x4,
3974
- ExtendHighUVecI16x8ToVecI32x4)
3975
- .add (FeatureSet::FP16,
3976
- AbsVecF16x8,
3977
- NegVecF16x8,
3978
- SqrtVecF16x8,
3979
- CeilVecF16x8,
3980
- FloorVecF16x8,
3981
- TruncVecF16x8,
3982
- NearestVecF16x8,
3983
- TruncSatSVecF16x8ToVecI16x8,
3984
- TruncSatUVecF16x8ToVecI16x8,
3985
- ConvertSVecI16x8ToVecF16x8,
3986
- ConvertUVecI16x8ToVecF16x8)),
3987
- make (Type::v128)});
3953
+ return buildUnary ({pick (FeatureOptions<UnaryOp>()
3954
+ .add (FeatureSet::SIMD,
3955
+ NotVec128,
3956
+ AbsVecI8x16,
3957
+ AbsVecI16x8,
3958
+ AbsVecI32x4,
3959
+ AbsVecI64x2,
3960
+ PopcntVecI8x16,
3961
+ NegVecI8x16,
3962
+ NegVecI16x8,
3963
+ NegVecI32x4,
3964
+ NegVecI64x2,
3965
+ AbsVecF32x4,
3966
+ NegVecF32x4,
3967
+ SqrtVecF32x4,
3968
+ CeilVecF32x4,
3969
+ FloorVecF32x4,
3970
+ TruncVecF32x4,
3971
+ NearestVecF32x4,
3972
+ AbsVecF64x2,
3973
+ NegVecF64x2,
3974
+ SqrtVecF64x2,
3975
+ CeilVecF64x2,
3976
+ FloorVecF64x2,
3977
+ TruncVecF64x2,
3978
+ NearestVecF64x2,
3979
+ ExtAddPairwiseSVecI8x16ToI16x8,
3980
+ ExtAddPairwiseUVecI8x16ToI16x8,
3981
+ ExtAddPairwiseSVecI16x8ToI32x4,
3982
+ ExtAddPairwiseUVecI16x8ToI32x4,
3983
+ TruncSatSVecF32x4ToVecI32x4,
3984
+ TruncSatUVecF32x4ToVecI32x4,
3985
+ ConvertSVecI32x4ToVecF32x4,
3986
+ ConvertUVecI32x4ToVecF32x4,
3987
+ ExtendLowSVecI8x16ToVecI16x8,
3988
+ ExtendHighSVecI8x16ToVecI16x8,
3989
+ ExtendLowUVecI8x16ToVecI16x8,
3990
+ ExtendHighUVecI8x16ToVecI16x8,
3991
+ ExtendLowSVecI16x8ToVecI32x4,
3992
+ ExtendHighSVecI16x8ToVecI32x4,
3993
+ ExtendLowUVecI16x8ToVecI32x4,
3994
+ ExtendHighUVecI16x8ToVecI32x4,
3995
+ ExtendLowSVecI32x4ToVecI64x2,
3996
+ ExtendHighSVecI32x4ToVecI64x2,
3997
+ ExtendLowUVecI32x4ToVecI64x2,
3998
+ ExtendHighUVecI32x4ToVecI64x2,
3999
+ ConvertLowSVecI32x4ToVecF64x2,
4000
+ ConvertLowUVecI32x4ToVecF64x2,
4001
+ TruncSatZeroSVecF64x2ToVecI32x4,
4002
+ TruncSatZeroUVecF64x2ToVecI32x4,
4003
+ DemoteZeroVecF64x2ToVecF32x4,
4004
+ PromoteLowVecF32x4ToVecF64x2)
4005
+ .add (FeatureSet::RelaxedSIMD,
4006
+ RelaxedTruncSVecF32x4ToVecI32x4,
4007
+ RelaxedTruncUVecF32x4ToVecI32x4,
4008
+ RelaxedTruncZeroSVecF64x2ToVecI32x4,
4009
+ RelaxedTruncZeroUVecF64x2ToVecI32x4)
4010
+ .add (FeatureSet::FP16,
4011
+ AbsVecF16x8,
4012
+ NegVecF16x8,
4013
+ SqrtVecF16x8,
4014
+ CeilVecF16x8,
4015
+ FloorVecF16x8,
4016
+ TruncVecF16x8,
4017
+ NearestVecF16x8,
4018
+ TruncSatSVecF16x8ToVecI16x8,
4019
+ TruncSatUVecF16x8ToVecI16x8,
4020
+ ConvertSVecI16x8ToVecF16x8,
4021
+ ConvertUVecI16x8ToVecF16x8)),
4022
+ make (Type::v128)});
3988
4023
}
3989
4024
WASM_UNREACHABLE (" invalid value" );
3990
4025
}
@@ -4146,6 +4181,12 @@ Expression* TranslateToFuzzReader::makeBinary(Type type) {
4146
4181
LeUVecI32x4,
4147
4182
GeSVecI32x4,
4148
4183
GeUVecI32x4,
4184
+ EqVecI64x2,
4185
+ NeVecI64x2,
4186
+ LtSVecI64x2,
4187
+ GtSVecI64x2,
4188
+ LeSVecI64x2,
4189
+ GeSVecI64x2,
4149
4190
EqVecF32x4,
4150
4191
NeVecF32x4,
4151
4192
LtVecF32x4,
@@ -4158,6 +4199,8 @@ Expression* TranslateToFuzzReader::makeBinary(Type type) {
4158
4199
GtVecF64x2,
4159
4200
LeVecF64x2,
4160
4201
GeVecF64x2,
4202
+
4203
+ // SIMD arithmetic
4161
4204
AndVec128,
4162
4205
OrVec128,
4163
4206
XorVec128,
@@ -4172,9 +4215,7 @@ Expression* TranslateToFuzzReader::makeBinary(Type type) {
4172
4215
MinUVecI8x16,
4173
4216
MaxSVecI8x16,
4174
4217
MaxUVecI8x16,
4175
- // TODO: avgr_u
4176
- // TODO: q15mulr_sat_s
4177
- // TODO: extmul
4218
+ AvgrUVecI8x16,
4178
4219
AddVecI16x8,
4179
4220
AddSatSVecI16x8,
4180
4221
AddSatUVecI16x8,
@@ -4186,6 +4227,12 @@ Expression* TranslateToFuzzReader::makeBinary(Type type) {
4186
4227
MinUVecI16x8,
4187
4228
MaxSVecI16x8,
4188
4229
MaxUVecI16x8,
4230
+ AvgrUVecI16x8,
4231
+ Q15MulrSatSVecI16x8,
4232
+ ExtMulLowSVecI16x8,
4233
+ ExtMulHighSVecI16x8,
4234
+ ExtMulLowUVecI16x8,
4235
+ ExtMulHighUVecI16x8,
4189
4236
AddVecI32x4,
4190
4237
SubVecI32x4,
4191
4238
MulVecI32x4,
@@ -4194,24 +4241,41 @@ Expression* TranslateToFuzzReader::makeBinary(Type type) {
4194
4241
MaxSVecI32x4,
4195
4242
MaxUVecI32x4,
4196
4243
DotSVecI16x8ToVecI32x4,
4244
+ ExtMulLowSVecI32x4,
4245
+ ExtMulHighSVecI32x4,
4246
+ ExtMulLowUVecI32x4,
4247
+ ExtMulHighUVecI32x4,
4197
4248
AddVecI64x2,
4198
4249
SubVecI64x2,
4250
+ MulVecI64x2,
4251
+ ExtMulLowSVecI64x2,
4252
+ ExtMulHighSVecI64x2,
4253
+ ExtMulLowUVecI64x2,
4254
+ ExtMulHighUVecI64x2,
4199
4255
AddVecF32x4,
4200
4256
SubVecF32x4,
4201
4257
MulVecF32x4,
4202
4258
DivVecF32x4,
4203
4259
MinVecF32x4,
4204
4260
MaxVecF32x4,
4261
+ PMinVecF32x4,
4262
+ PMaxVecF32x4,
4205
4263
AddVecF64x2,
4206
4264
SubVecF64x2,
4207
4265
MulVecF64x2,
4208
4266
DivVecF64x2,
4209
4267
MinVecF64x2,
4210
4268
MaxVecF64x2,
4269
+ PMinVecF64x2,
4270
+ PMaxVecF64x2,
4271
+
4272
+ // SIMD Conversion
4211
4273
NarrowSVecI16x8ToVecI8x16,
4212
4274
NarrowUVecI16x8ToVecI8x16,
4213
4275
NarrowSVecI32x4ToVecI16x8,
4214
4276
NarrowUVecI32x4ToVecI16x8,
4277
+
4278
+ // SIMD Swizzle
4215
4279
SwizzleVecI8x16)
4216
4280
.add (FeatureSet::FP16,
4217
4281
EqVecF16x8,
@@ -4226,7 +4290,9 @@ Expression* TranslateToFuzzReader::makeBinary(Type type) {
4226
4290
MulVecF16x8,
4227
4291
DivVecF16x8,
4228
4292
MinVecF16x8,
4229
- MaxVecF16x8)),
4293
+ MaxVecF16x8,
4294
+ PMinVecF16x8,
4295
+ PMaxVecF16x8)),
4230
4296
make (Type::v128),
4231
4297
make (Type::v128)});
4232
4298
}
@@ -4559,7 +4625,6 @@ Expression* TranslateToFuzzReader::makeSIMDShift() {
4559
4625
}
4560
4626
4561
4627
Expression* TranslateToFuzzReader::makeSIMDLoad () {
4562
- // TODO: add Load{32,64}Zero if merged to proposal
4563
4628
SIMDLoadOp op = pick (Load8SplatVec128,
4564
4629
Load16SplatVec128,
4565
4630
Load32SplatVec128,
@@ -4569,7 +4634,9 @@ Expression* TranslateToFuzzReader::makeSIMDLoad() {
4569
4634
Load16x4SVec128,
4570
4635
Load16x4UVec128,
4571
4636
Load32x2SVec128,
4572
- Load32x2UVec128);
4637
+ Load32x2UVec128,
4638
+ Load32ZeroVec128,
4639
+ Load64ZeroVec128);
4573
4640
Address offset = logify (get ());
4574
4641
Address align;
4575
4642
switch (op) {
@@ -4592,8 +4659,11 @@ Expression* TranslateToFuzzReader::makeSIMDLoad() {
4592
4659
align = pick (1 , 2 , 4 , 8 );
4593
4660
break ;
4594
4661
case Load32ZeroVec128:
4662
+ align = 4 ;
4663
+ break ;
4595
4664
case Load64ZeroVec128:
4596
- WASM_UNREACHABLE (" Unexpected SIMD loads" );
4665
+ align = 8 ;
4666
+ break ;
4597
4667
}
4598
4668
Expression* ptr = makePointer ();
4599
4669
return builder.makeSIMDLoad (op, offset, align, ptr, wasm.memories [0 ]->name );
0 commit comments