Skip to content

Commit 786f8ea

Browse files
authored
wasm2c: Implement big-endian SIMD (#2340)
1 parent 0388727 commit 786f8ea

File tree

6 files changed

+762
-75
lines changed

6 files changed

+762
-75
lines changed

src/c-writer.cc

Lines changed: 64 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,9 +1297,11 @@ void CWriter::Write(const Const& const_) {
12971297
break;
12981298
}
12991299
case Type::V128: {
1300-
Writef("simde_wasm_i32x4_const(0x%08x, 0x%08x, 0x%08x, 0x%08x)",
1301-
const_.vec128().u32(0), const_.vec128().u32(1),
1302-
const_.vec128().u32(2), const_.vec128().u32(3));
1300+
Writef("v128_const(0x%02x", const_.vec128().u8(0));
1301+
for (int i = 1; i < 16; i++) {
1302+
Writef(", 0x%02x", const_.vec128().u8(i));
1303+
}
1304+
Write(")");
13031305
break;
13041306
}
13051307

@@ -4178,11 +4180,11 @@ void CWriter::Write(const BinaryExpr& expr) {
41784180
break;
41794181

41804182
case Opcode::I8X16NarrowI16X8S:
4181-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i8x16_narrow_i16x8");
4183+
WritePrefixBinaryExpr(expr.opcode, "v128_i8x16_narrow_i16x8");
41824184
break;
41834185

41844186
case Opcode::I8X16NarrowI16X8U:
4185-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_u8x16_narrow_i16x8");
4187+
WritePrefixBinaryExpr(expr.opcode, "v128_u8x16_narrow_i16x8");
41864188
break;
41874189

41884190
case Opcode::I8X16Shl:
@@ -4210,7 +4212,7 @@ void CWriter::Write(const BinaryExpr& expr) {
42104212
break;
42114213

42124214
case Opcode::I8X16Swizzle:
4213-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i8x16_swizzle");
4215+
WritePrefixBinaryExpr(expr.opcode, "v128_i8x16_swizzle");
42144216
break;
42154217

42164218
case Opcode::I16X8Add:
@@ -4230,19 +4232,19 @@ void CWriter::Write(const BinaryExpr& expr) {
42304232
break;
42314233

42324234
case Opcode::I16X8ExtmulHighI8X16S:
4233-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i16x8_extmul_high_i8x16");
4235+
WritePrefixBinaryExpr(expr.opcode, "v128_i16x8_extmul_high_i8x16");
42344236
break;
42354237

42364238
case Opcode::I16X8ExtmulHighI8X16U:
4237-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_u16x8_extmul_high_u8x16");
4239+
WritePrefixBinaryExpr(expr.opcode, "v128_u16x8_extmul_high_u8x16");
42384240
break;
42394241

42404242
case Opcode::I16X8ExtmulLowI8X16S:
4241-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i16x8_extmul_low_i8x16");
4243+
WritePrefixBinaryExpr(expr.opcode, "v128_i16x8_extmul_low_i8x16");
42424244
break;
42434245

42444246
case Opcode::I16X8ExtmulLowI8X16U:
4245-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_u16x8_extmul_low_u8x16");
4247+
WritePrefixBinaryExpr(expr.opcode, "v128_u16x8_extmul_low_u8x16");
42464248
break;
42474249

42484250
case Opcode::I16X8MaxS:
@@ -4266,11 +4268,11 @@ void CWriter::Write(const BinaryExpr& expr) {
42664268
break;
42674269

42684270
case Opcode::I16X8NarrowI32X4S:
4269-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i16x8_narrow_i32x4");
4271+
WritePrefixBinaryExpr(expr.opcode, "v128_i16x8_narrow_i32x4");
42704272
break;
42714273

42724274
case Opcode::I16X8NarrowI32X4U:
4273-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_u16x8_narrow_i32x4");
4275+
WritePrefixBinaryExpr(expr.opcode, "v128_u16x8_narrow_i32x4");
42744276
break;
42754277

42764278
case Opcode::I16X8Q15mulrSatS:
@@ -4310,19 +4312,19 @@ void CWriter::Write(const BinaryExpr& expr) {
43104312
break;
43114313

43124314
case Opcode::I32X4ExtmulHighI16X8S:
4313-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i32x4_extmul_high_i16x8");
4315+
WritePrefixBinaryExpr(expr.opcode, "v128_i32x4_extmul_high_i16x8");
43144316
break;
43154317

43164318
case Opcode::I32X4ExtmulHighI16X8U:
4317-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_u32x4_extmul_high_u16x8");
4319+
WritePrefixBinaryExpr(expr.opcode, "v128_u32x4_extmul_high_u16x8");
43184320
break;
43194321

43204322
case Opcode::I32X4ExtmulLowI16X8S:
4321-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i32x4_extmul_low_i16x8");
4323+
WritePrefixBinaryExpr(expr.opcode, "v128_i32x4_extmul_low_i16x8");
43224324
break;
43234325

43244326
case Opcode::I32X4ExtmulLowI16X8U:
4325-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_u32x4_extmul_low_u16x8");
4327+
WritePrefixBinaryExpr(expr.opcode, "v128_u32x4_extmul_low_u16x8");
43264328
break;
43274329

43284330
case Opcode::I32X4MaxS:
@@ -4366,19 +4368,19 @@ void CWriter::Write(const BinaryExpr& expr) {
43664368
break;
43674369

43684370
case Opcode::I64X2ExtmulHighI32X4S:
4369-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i64x2_extmul_high_i32x4");
4371+
WritePrefixBinaryExpr(expr.opcode, "v128_i64x2_extmul_high_i32x4");
43704372
break;
43714373

43724374
case Opcode::I64X2ExtmulHighI32X4U:
4373-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_u64x2_extmul_high_u32x4");
4375+
WritePrefixBinaryExpr(expr.opcode, "v128_u64x2_extmul_high_u32x4");
43744376
break;
43754377

43764378
case Opcode::I64X2ExtmulLowI32X4S:
4377-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_i64x2_extmul_low_i32x4");
4379+
WritePrefixBinaryExpr(expr.opcode, "v128_i64x2_extmul_low_i32x4");
43784380
break;
43794381

43804382
case Opcode::I64X2ExtmulLowI32X4U:
4381-
WritePrefixBinaryExpr(expr.opcode, "simde_wasm_u64x2_extmul_low_u32x4");
4383+
WritePrefixBinaryExpr(expr.opcode, "v128_u64x2_extmul_low_u32x4");
43824384
break;
43834385

43844386
case Opcode::I64X2Mul:
@@ -4898,13 +4900,11 @@ void CWriter::Write(const ConvertExpr& expr) {
48984900
break;
48994901

49004902
case Opcode::I32X4TruncSatF64X2SZero:
4901-
WriteSimpleUnaryExpr(expr.opcode,
4902-
"simde_wasm_i32x4_trunc_sat_f64x2_zero");
4903+
WriteSimpleUnaryExpr(expr.opcode, "v128_i32x4_trunc_sat_f64x2_zero");
49034904
break;
49044905

49054906
case Opcode::I32X4TruncSatF64X2UZero:
4906-
WriteSimpleUnaryExpr(expr.opcode,
4907-
"simde_wasm_u32x4_trunc_sat_f64x2_zero");
4907+
WriteSimpleUnaryExpr(expr.opcode, "v128_u32x4_trunc_sat_f64x2_zero");
49084908
break;
49094909

49104910
case Opcode::F32X4ConvertI32X4S:
@@ -4916,19 +4916,19 @@ void CWriter::Write(const ConvertExpr& expr) {
49164916
break;
49174917

49184918
case Opcode::F32X4DemoteF64X2Zero:
4919-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_f32x4_demote_f64x2_zero");
4919+
WriteSimpleUnaryExpr(expr.opcode, "v128_f32x4_demote_f64x2_zero");
49204920
break;
49214921

49224922
case Opcode::F64X2ConvertLowI32X4S:
4923-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_f64x2_convert_low_i32x4");
4923+
WriteSimpleUnaryExpr(expr.opcode, "v128_f64x2_convert_low_i32x4");
49244924
break;
49254925

49264926
case Opcode::F64X2ConvertLowI32X4U:
4927-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_f64x2_convert_low_u32x4");
4927+
WriteSimpleUnaryExpr(expr.opcode, "v128_f64x2_convert_low_u32x4");
49284928
break;
49294929

49304930
case Opcode::F64X2PromoteLowF32X4:
4931-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_f64x2_promote_low_f32x4");
4931+
WriteSimpleUnaryExpr(expr.opcode, "v128_f64x2_promote_low_f32x4");
49324932
break;
49334933

49344934
default:
@@ -5120,7 +5120,7 @@ void CWriter::Write(const UnaryExpr& expr) {
51205120
break;
51215121

51225122
case Opcode::I8X16Bitmask:
5123-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i8x16_bitmask");
5123+
WriteSimpleUnaryExpr(expr.opcode, "v128_i8x16_bitmask");
51245124
break;
51255125

51265126
case Opcode::I8X16Neg:
@@ -5144,7 +5144,7 @@ void CWriter::Write(const UnaryExpr& expr) {
51445144
break;
51455145

51465146
case Opcode::I16X8Bitmask:
5147-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i16x8_bitmask");
5147+
WriteSimpleUnaryExpr(expr.opcode, "v128_i16x8_bitmask");
51485148
break;
51495149

51505150
case Opcode::I16X8ExtaddPairwiseI8X16S:
@@ -5158,19 +5158,19 @@ void CWriter::Write(const UnaryExpr& expr) {
51585158
break;
51595159

51605160
case Opcode::I16X8ExtendHighI8X16S:
5161-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i16x8_extend_high_i8x16");
5161+
WriteSimpleUnaryExpr(expr.opcode, "v128_i16x8_extend_high_i8x16");
51625162
break;
51635163

51645164
case Opcode::I16X8ExtendHighI8X16U:
5165-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_u16x8_extend_high_u8x16");
5165+
WriteSimpleUnaryExpr(expr.opcode, "v128_u16x8_extend_high_u8x16");
51665166
break;
51675167

51685168
case Opcode::I16X8ExtendLowI8X16S:
5169-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i16x8_extend_low_i8x16");
5169+
WriteSimpleUnaryExpr(expr.opcode, "v128_i16x8_extend_low_i8x16");
51705170
break;
51715171

51725172
case Opcode::I16X8ExtendLowI8X16U:
5173-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_u16x8_extend_low_u8x16");
5173+
WriteSimpleUnaryExpr(expr.opcode, "v128_u16x8_extend_low_u8x16");
51745174
break;
51755175

51765176
case Opcode::I16X8Neg:
@@ -5190,7 +5190,7 @@ void CWriter::Write(const UnaryExpr& expr) {
51905190
break;
51915191

51925192
case Opcode::I32X4Bitmask:
5193-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i32x4_bitmask");
5193+
WriteSimpleUnaryExpr(expr.opcode, "v128_i32x4_bitmask");
51945194
break;
51955195

51965196
case Opcode::I32X4ExtaddPairwiseI16X8S:
@@ -5204,19 +5204,19 @@ void CWriter::Write(const UnaryExpr& expr) {
52045204
break;
52055205

52065206
case Opcode::I32X4ExtendHighI16X8S:
5207-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i32x4_extend_high_i16x8");
5207+
WriteSimpleUnaryExpr(expr.opcode, "v128_i32x4_extend_high_i16x8");
52085208
break;
52095209

52105210
case Opcode::I32X4ExtendHighI16X8U:
5211-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_u32x4_extend_high_u16x8");
5211+
WriteSimpleUnaryExpr(expr.opcode, "v128_u32x4_extend_high_u16x8");
52125212
break;
52135213

52145214
case Opcode::I32X4ExtendLowI16X8S:
5215-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i32x4_extend_low_i16x8");
5215+
WriteSimpleUnaryExpr(expr.opcode, "v128_i32x4_extend_low_i16x8");
52165216
break;
52175217

52185218
case Opcode::I32X4ExtendLowI16X8U:
5219-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_u32x4_extend_low_u16x8");
5219+
WriteSimpleUnaryExpr(expr.opcode, "v128_u32x4_extend_low_u16x8");
52205220
break;
52215221

52225222
case Opcode::I32X4Neg:
@@ -5236,23 +5236,23 @@ void CWriter::Write(const UnaryExpr& expr) {
52365236
break;
52375237

52385238
case Opcode::I64X2Bitmask:
5239-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i64x2_bitmask");
5239+
WriteSimpleUnaryExpr(expr.opcode, "v128_i64x2_bitmask");
52405240
break;
52415241

52425242
case Opcode::I64X2ExtendHighI32X4S:
5243-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i64x2_extend_high_i32x4");
5243+
WriteSimpleUnaryExpr(expr.opcode, "v128_i64x2_extend_high_i32x4");
52445244
break;
52455245

52465246
case Opcode::I64X2ExtendHighI32X4U:
5247-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_u64x2_extend_high_u32x4");
5247+
WriteSimpleUnaryExpr(expr.opcode, "v128_u64x2_extend_high_u32x4");
52485248
break;
52495249

52505250
case Opcode::I64X2ExtendLowI32X4S:
5251-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_i64x2_extend_low_i32x4");
5251+
WriteSimpleUnaryExpr(expr.opcode, "v128_i64x2_extend_low_i32x4");
52525252
break;
52535253

52545254
case Opcode::I64X2ExtendLowI32X4U:
5255-
WriteSimpleUnaryExpr(expr.opcode, "simde_wasm_u64x2_extend_low_u32x4");
5255+
WriteSimpleUnaryExpr(expr.opcode, "v128_u64x2_extend_low_u32x4");
52565256
break;
52575257

52585258
case Opcode::I64X2Neg:
@@ -5360,85 +5360,85 @@ void CWriter::Write(const SimdLaneOpExpr& expr) {
53605360

53615361
switch (expr.opcode) {
53625362
case Opcode::I8X16ExtractLaneS: {
5363-
Write(StackVar(0, result_type), " = simde_wasm_i8x16_extract_lane(",
5363+
Write(StackVar(0, result_type), " = v128_i8x16_extract_lane(",
53645364
StackVar(0), ", ", expr.val, ");", Newline());
53655365
DropTypes(1);
53665366
break;
53675367
}
53685368
case Opcode::I8X16ExtractLaneU: {
5369-
Write(StackVar(0, result_type), " = simde_wasm_u8x16_extract_lane(",
5369+
Write(StackVar(0, result_type), " = v128_u8x16_extract_lane(",
53705370
StackVar(0), ", ", expr.val, ");", Newline());
53715371
DropTypes(1);
53725372
break;
53735373
}
53745374
case Opcode::I16X8ExtractLaneS: {
5375-
Write(StackVar(0, result_type), " = simde_wasm_i16x8_extract_lane(",
5375+
Write(StackVar(0, result_type), " = v128_i16x8_extract_lane(",
53765376
StackVar(0), ", ", expr.val, ");", Newline());
53775377
DropTypes(1);
53785378
break;
53795379
}
53805380
case Opcode::I16X8ExtractLaneU: {
5381-
Write(StackVar(0, result_type), " = simde_wasm_u16x8_extract_lane(",
5381+
Write(StackVar(0, result_type), " = v128_u16x8_extract_lane(",
53825382
StackVar(0), ", ", expr.val, ");", Newline());
53835383
DropTypes(1);
53845384
break;
53855385
}
53865386
case Opcode::I32X4ExtractLane: {
5387-
Write(StackVar(0, result_type), " = simde_wasm_i32x4_extract_lane(",
5387+
Write(StackVar(0, result_type), " = v128_i32x4_extract_lane(",
53885388
StackVar(0), ", ", expr.val, ");", Newline());
53895389
DropTypes(1);
53905390
break;
53915391
}
53925392
case Opcode::I64X2ExtractLane: {
5393-
Write(StackVar(0, result_type), " = simde_wasm_i64x2_extract_lane(",
5393+
Write(StackVar(0, result_type), " = v128_i64x2_extract_lane(",
53945394
StackVar(0), ", ", expr.val, ");", Newline());
53955395
DropTypes(1);
53965396
break;
53975397
}
53985398
case Opcode::F32X4ExtractLane: {
5399-
Write(StackVar(0, result_type), " = simde_wasm_f32x4_extract_lane(",
5399+
Write(StackVar(0, result_type), " = v128_f32x4_extract_lane(",
54005400
StackVar(0), ", ", expr.val, ");", Newline());
54015401
DropTypes(1);
54025402
break;
54035403
}
54045404
case Opcode::F64X2ExtractLane: {
5405-
Write(StackVar(0, result_type), " = simde_wasm_f64x2_extract_lane(",
5405+
Write(StackVar(0, result_type), " = v128_f64x2_extract_lane(",
54065406
StackVar(0), ", ", expr.val, ");", Newline());
54075407
DropTypes(1);
54085408
break;
54095409
}
54105410
case Opcode::I8X16ReplaceLane: {
5411-
Write(StackVar(1, result_type), " = simde_wasm_i8x16_replace_lane(",
5411+
Write(StackVar(1, result_type), " = v128_i8x16_replace_lane(",
54125412
StackVar(1), ", ", expr.val, ", ", StackVar(0), ");", Newline());
54135413
DropTypes(2);
54145414
break;
54155415
}
54165416
case Opcode::I16X8ReplaceLane: {
5417-
Write(StackVar(1, result_type), " = simde_wasm_i16x8_replace_lane(",
5417+
Write(StackVar(1, result_type), " = v128_i16x8_replace_lane(",
54185418
StackVar(1), ", ", expr.val, ", ", StackVar(0), ");", Newline());
54195419
DropTypes(2);
54205420
break;
54215421
}
54225422
case Opcode::I32X4ReplaceLane: {
5423-
Write(StackVar(1, result_type), " = simde_wasm_i32x4_replace_lane(",
5423+
Write(StackVar(1, result_type), " = v128_i32x4_replace_lane(",
54245424
StackVar(1), ", ", expr.val, ", ", StackVar(0), ");", Newline());
54255425
DropTypes(2);
54265426
break;
54275427
}
54285428
case Opcode::I64X2ReplaceLane: {
5429-
Write(StackVar(1, result_type), " = simde_wasm_i64x2_replace_lane(",
5429+
Write(StackVar(1, result_type), " = v128_i64x2_replace_lane(",
54305430
StackVar(1), ", ", expr.val, ", ", StackVar(0), ");", Newline());
54315431
DropTypes(2);
54325432
break;
54335433
}
54345434
case Opcode::F32X4ReplaceLane: {
5435-
Write(StackVar(1, result_type), " = simde_wasm_f32x4_replace_lane(",
5435+
Write(StackVar(1, result_type), " = v128_f32x4_replace_lane(",
54365436
StackVar(1), ", ", expr.val, ", ", StackVar(0), ");", Newline());
54375437
DropTypes(2);
54385438
break;
54395439
}
54405440
case Opcode::F64X2ReplaceLane: {
5441-
Write(StackVar(1, result_type), " = simde_wasm_f64x2_replace_lane(",
5441+
Write(StackVar(1, result_type), " = v128_f64x2_replace_lane(",
54425442
StackVar(1), ", ", expr.val, ", ", StackVar(0), ");", Newline());
54435443
DropTypes(2);
54445444
break;
@@ -5507,14 +5507,12 @@ void CWriter::Write(const SimdShuffleOpExpr& expr) {
55075507
Type result_type = expr.opcode.GetResultType();
55085508
switch (expr.opcode) {
55095509
case Opcode::I8X16Shuffle: {
5510-
Write(StackVar(1, result_type), " = simde_wasm_i8x16_shuffle(",
5511-
StackVar(1), ", ", StackVar(0), ", ", expr.val.u8(0), ", ",
5512-
expr.val.u8(1), ", ", expr.val.u8(2), ", ", expr.val.u8(3), ", ",
5513-
expr.val.u8(4), ", ", expr.val.u8(5), ", ", expr.val.u8(6), ", ",
5514-
expr.val.u8(7), ", ", expr.val.u8(8), ", ", expr.val.u8(9), ", ",
5515-
expr.val.u8(10), ", ", expr.val.u8(11), ", ", expr.val.u8(12), ", ",
5516-
expr.val.u8(13), ", ", expr.val.u8(14), ", ", expr.val.u8(15), ");",
5517-
Newline());
5510+
Write(StackVar(1, result_type), " = v128_i8x16_shuffle(", StackVar(1),
5511+
", ", StackVar(0));
5512+
for (int i = 0; i < 16; i++) {
5513+
Write(", ", expr.val.u8(i));
5514+
}
5515+
Write(");", Newline());
55185516
DropTypes(2);
55195517
break;
55205518
}

0 commit comments

Comments
 (0)