Skip to content

Commit c8363ab

Browse files
committed
Add supporting patterns for extadd pairwise
1 parent 9798039 commit c8363ab

File tree

2 files changed

+30
-32
lines changed

2 files changed

+30
-32
lines changed

llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,6 +1541,32 @@ def : Pat<(v4i32 (int_wasm_extadd_pairwise_signed (v8i16 V128:$in))),
15411541
def : Pat<(v8i16 (int_wasm_extadd_pairwise_signed (v16i8 V128:$in))),
15421542
(extadd_pairwise_s_I16x8 V128:$in)>;
15431543

1544+
multiclass ExtAddPairwiseShuffle<ValueType from_ty, ValueType to_ty, string suffix,
1545+
int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7,
1546+
int b0, int b1, int b2, int b3, int b4, int b5, int b6, int b7> {
1547+
foreach sign = ["s", "u"] in {
1548+
def : Pat<(to_ty (add
1549+
(!cast<SDNode>("extend_low_"#sign) (from_ty (wasm_shuffle (from_ty V128:$vec), (from_ty V128:$undef),
1550+
(i32 a0), (i32 a1), (i32 a2), (i32 a3),
1551+
(i32 a4), (i32 a5), (i32 a6), (i32 a7),
1552+
(i32 srcvalue), (i32 srcvalue), (i32 srcvalue), (i32 srcvalue),
1553+
(i32 srcvalue), (i32 srcvalue), (i32 srcvalue), (i32 srcvalue)))),
1554+
(!cast<SDNode>("extend_low_"#sign) (from_ty (wasm_shuffle (from_ty V128:$vec), (from_ty V128:$undef),
1555+
(i32 b0), (i32 b1), (i32 b2), (i32 b3),
1556+
(i32 b4), (i32 b5), (i32 b6), (i32 b7),
1557+
(i32 srcvalue), (i32 srcvalue), (i32 srcvalue), (i32 srcvalue),
1558+
(i32 srcvalue), (i32 srcvalue), (i32 srcvalue), (i32 srcvalue)))))),
1559+
(!cast<Instruction>("extadd_pairwise_"#sign#"_"#suffix) V128:$vec)>;
1560+
}
1561+
}
1562+
1563+
defm : ExtAddPairwiseShuffle<v8i16, v4i32, "I32x4",
1564+
0, 1, 4, 5, 8, 9, 12, 13,
1565+
2, 3, 6, 7, 10, 11, 14, 15>;
1566+
defm : ExtAddPairwiseShuffle<v16i8, v8i16, "I16x8",
1567+
0, 2, 4, 6, 8, 10, 12, 14,
1568+
1, 3, 5, 7, 9, 11, 13, 15>;
1569+
15441570
// f64x2 <-> f32x4 conversions
15451571
def demote_t : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>]>;
15461572
def demote_zero : SDNode<"WebAssemblyISD::DEMOTE_ZERO", demote_t>;

llvm/test/CodeGen/WebAssembly/simd-extadd.ll

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,7 @@ define <8 x i16> @test_extadd_pairwise_i8x16_s(<16 x i8> %v) {
1010
; CHECK: .functype test_extadd_pairwise_i8x16_s (v128) -> (v128)
1111
; CHECK-NEXT: # %bb.0:
1212
; CHECK-NEXT: local.get 0
13-
; CHECK-NEXT: local.get 0
14-
; CHECK-NEXT: i8x16.shuffle 0, 2, 4, 6, 8, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0
15-
; CHECK-NEXT: i16x8.extend_low_i8x16_s
16-
; CHECK-NEXT: local.get 0
17-
; CHECK-NEXT: local.get 0
18-
; CHECK-NEXT: i8x16.shuffle 1, 3, 5, 7, 9, 11, 13, 15, 0, 0, 0, 0, 0, 0, 0, 0
19-
; CHECK-NEXT: i16x8.extend_low_i8x16_s
20-
; CHECK-NEXT: i16x8.add
13+
; CHECK-NEXT: i16x8.extadd_pairwise_i8x16_s
2114
; CHECK-NEXT: # fallthrough-return
2215
%even = shufflevector <16 x i8> %v, <16 x i8> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
2316
%odd = shufflevector <16 x i8> %v, <16 x i8> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
@@ -32,14 +25,7 @@ define <8 x i16> @test_extadd_pairwise_i8x16_u(<16 x i8> %v) {
3225
; CHECK: .functype test_extadd_pairwise_i8x16_u (v128) -> (v128)
3326
; CHECK-NEXT: # %bb.0:
3427
; CHECK-NEXT: local.get 0
35-
; CHECK-NEXT: local.get 0
36-
; CHECK-NEXT: i8x16.shuffle 0, 2, 4, 6, 8, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0
37-
; CHECK-NEXT: i16x8.extend_low_i8x16_u
38-
; CHECK-NEXT: local.get 0
39-
; CHECK-NEXT: local.get 0
40-
; CHECK-NEXT: i8x16.shuffle 1, 3, 5, 7, 9, 11, 13, 15, 0, 0, 0, 0, 0, 0, 0, 0
41-
; CHECK-NEXT: i16x8.extend_low_i8x16_u
42-
; CHECK-NEXT: i16x8.add
28+
; CHECK-NEXT: i16x8.extadd_pairwise_i8x16_u
4329
; CHECK-NEXT: # fallthrough-return
4430
%even = shufflevector <16 x i8> %v, <16 x i8> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
4531
%odd = shufflevector <16 x i8> %v, <16 x i8> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
@@ -54,14 +40,7 @@ define <4 x i32> @test_extadd_pairwise_i16x8_s(<8 x i16> %v) {
5440
; CHECK: .functype test_extadd_pairwise_i16x8_s (v128) -> (v128)
5541
; CHECK-NEXT: # %bb.0:
5642
; CHECK-NEXT: local.get 0
57-
; CHECK-NEXT: local.get 0
58-
; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1
59-
; CHECK-NEXT: i32x4.extend_low_i16x8_s
60-
; CHECK-NEXT: local.get 0
61-
; CHECK-NEXT: local.get 0
62-
; CHECK-NEXT: i8x16.shuffle 2, 3, 6, 7, 10, 11, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
63-
; CHECK-NEXT: i32x4.extend_low_i16x8_s
64-
; CHECK-NEXT: i32x4.add
43+
; CHECK-NEXT: i32x4.extadd_pairwise_i16x8_s
6544
; CHECK-NEXT: # fallthrough-return
6645
%even = shufflevector <8 x i16> %v, <8 x i16> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
6746
%odd = shufflevector <8 x i16> %v, <8 x i16> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
@@ -76,14 +55,7 @@ define <4 x i32> @test_extadd_pairwise_i16x8_u(<8 x i16> %v) {
7655
; CHECK: .functype test_extadd_pairwise_i16x8_u (v128) -> (v128)
7756
; CHECK-NEXT: # %bb.0:
7857
; CHECK-NEXT: local.get 0
79-
; CHECK-NEXT: local.get 0
80-
; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1
81-
; CHECK-NEXT: i32x4.extend_low_i16x8_u
82-
; CHECK-NEXT: local.get 0
83-
; CHECK-NEXT: local.get 0
84-
; CHECK-NEXT: i8x16.shuffle 2, 3, 6, 7, 10, 11, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
85-
; CHECK-NEXT: i32x4.extend_low_i16x8_u
86-
; CHECK-NEXT: i32x4.add
58+
; CHECK-NEXT: i32x4.extadd_pairwise_i16x8_u
8759
; CHECK-NEXT: # fallthrough-return
8860
%even = shufflevector <8 x i16> %v, <8 x i16> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
8961
%odd = shufflevector <8 x i16> %v, <8 x i16> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>

0 commit comments

Comments
 (0)