@@ -87,6 +87,30 @@ define <16 x i8> @bitselect_v16i8(<16 x i8> %v1, <16 x i8> %v2, <16 x i8> %c) {
87
87
ret <16 x i8 > %a
88
88
}
89
89
90
+ ; CHECK-LABEL: narrow_signed_v16i8:
91
+ ; SIMD128-NEXT: .functype narrow_signed_v16i8 (v128, v128) -> (v128){{$}}
92
+ ; SIMD128-NEXT: i8x16.narrow_i16x8_s $push[[R:[0-9]+]]=, $0, $1{{$}}
93
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
94
+ declare <16 x i8 > @llvm.wasm.narrow.signed.v16i8.v8i16 (<8 x i16 >, <8 x i16 >)
95
+ define <16 x i8 > @narrow_signed_v16i8 (<8 x i16 > %low , <8 x i16 > %high ) {
96
+ %a = call <16 x i8 > @llvm.wasm.narrow.signed.v16i8.v8i16 (
97
+ <8 x i16 > %low , <8 x i16 > %high
98
+ )
99
+ ret <16 x i8 > %a
100
+ }
101
+
102
+ ; CHECK-LABEL: narrow_unsigned_v16i8:
103
+ ; SIMD128-NEXT: .functype narrow_unsigned_v16i8 (v128, v128) -> (v128){{$}}
104
+ ; SIMD128-NEXT: i8x16.narrow_i16x8_u $push[[R:[0-9]+]]=, $0, $1{{$}}
105
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
106
+ declare <16 x i8 > @llvm.wasm.narrow.unsigned.v16i8.v8i16 (<8 x i16 >, <8 x i16 >)
107
+ define <16 x i8 > @narrow_unsigned_v16i8 (<8 x i16 > %low , <8 x i16 > %high ) {
108
+ %a = call <16 x i8 > @llvm.wasm.narrow.unsigned.v16i8.v8i16 (
109
+ <8 x i16 > %low , <8 x i16 > %high
110
+ )
111
+ ret <16 x i8 > %a
112
+ }
113
+
90
114
; ==============================================================================
91
115
; 8 x i16
92
116
; ==============================================================================
@@ -166,6 +190,70 @@ define <8 x i16> @bitselect_v8i16(<8 x i16> %v1, <8 x i16> %v2, <8 x i16> %c) {
166
190
ret <8 x i16 > %a
167
191
}
168
192
193
+ ; CHECK-LABEL: narrow_signed_v8i16:
194
+ ; SIMD128-NEXT: .functype narrow_signed_v8i16 (v128, v128) -> (v128){{$}}
195
+ ; SIMD128-NEXT: i16x8.narrow_i32x4_s $push[[R:[0-9]+]]=, $0, $1{{$}}
196
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
197
+ declare <8 x i16 > @llvm.wasm.narrow.signed.v8i16.v4i32 (<4 x i32 >, <4 x i32 >)
198
+ define <8 x i16 > @narrow_signed_v8i16 (<4 x i32 > %low , <4 x i32 > %high ) {
199
+ %a = call <8 x i16 > @llvm.wasm.narrow.signed.v8i16.v4i32 (
200
+ <4 x i32 > %low , <4 x i32 > %high
201
+ )
202
+ ret <8 x i16 > %a
203
+ }
204
+
205
+ ; CHECK-LABEL: narrow_unsigned_v8i16:
206
+ ; SIMD128-NEXT: .functype narrow_unsigned_v8i16 (v128, v128) -> (v128){{$}}
207
+ ; SIMD128-NEXT: i16x8.narrow_i32x4_u $push[[R:[0-9]+]]=, $0, $1{{$}}
208
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
209
+ declare <8 x i16 > @llvm.wasm.narrow.unsigned.v8i16.v4i32 (<4 x i32 >, <4 x i32 >)
210
+ define <8 x i16 > @narrow_unsigned_v8i16 (<4 x i32 > %low , <4 x i32 > %high ) {
211
+ %a = call <8 x i16 > @llvm.wasm.narrow.unsigned.v8i16.v4i32 (
212
+ <4 x i32 > %low , <4 x i32 > %high
213
+ )
214
+ ret <8 x i16 > %a
215
+ }
216
+
217
+ ; CHECK-LABEL: widen_low_signed_v8i16:
218
+ ; SIMD128-NEXT: .functype widen_low_signed_v8i16 (v128) -> (v128){{$}}
219
+ ; SIMD128-NEXT: i16x8.widen_low_i8x16_s $push[[R:[0-9]+]]=, $0{{$}}
220
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
221
+ declare <8 x i16 > @llvm.wasm.widen.low.signed.v8i16.v16i8 (<16 x i8 >)
222
+ define <8 x i16 > @widen_low_signed_v8i16 (<16 x i8 > %v ) {
223
+ %a = call <8 x i16 > @llvm.wasm.widen.low.signed.v8i16.v16i8 (<16 x i8 > %v )
224
+ ret <8 x i16 > %a
225
+ }
226
+
227
+ ; CHECK-LABEL: widen_high_signed_v8i16:
228
+ ; SIMD128-NEXT: .functype widen_high_signed_v8i16 (v128) -> (v128){{$}}
229
+ ; SIMD128-NEXT: i16x8.widen_high_i8x16_s $push[[R:[0-9]+]]=, $0{{$}}
230
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
231
+ declare <8 x i16 > @llvm.wasm.widen.high.signed.v8i16.v16i8 (<16 x i8 >)
232
+ define <8 x i16 > @widen_high_signed_v8i16 (<16 x i8 > %v ) {
233
+ %a = call <8 x i16 > @llvm.wasm.widen.high.signed.v8i16.v16i8 (<16 x i8 > %v )
234
+ ret <8 x i16 > %a
235
+ }
236
+
237
+ ; CHECK-LABEL: widen_low_unsigned_v8i16:
238
+ ; SIMD128-NEXT: .functype widen_low_unsigned_v8i16 (v128) -> (v128){{$}}
239
+ ; SIMD128-NEXT: i16x8.widen_low_i8x16_u $push[[R:[0-9]+]]=, $0{{$}}
240
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
241
+ declare <8 x i16 > @llvm.wasm.widen.low.unsigned.v8i16.v16i8 (<16 x i8 >)
242
+ define <8 x i16 > @widen_low_unsigned_v8i16 (<16 x i8 > %v ) {
243
+ %a = call <8 x i16 > @llvm.wasm.widen.low.unsigned.v8i16.v16i8 (<16 x i8 > %v )
244
+ ret <8 x i16 > %a
245
+ }
246
+
247
+ ; CHECK-LABEL: widen_high_unsigned_v8i16:
248
+ ; SIMD128-NEXT: .functype widen_high_unsigned_v8i16 (v128) -> (v128){{$}}
249
+ ; SIMD128-NEXT: i16x8.widen_high_i8x16_u $push[[R:[0-9]+]]=, $0{{$}}
250
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
251
+ declare <8 x i16 > @llvm.wasm.widen.high.unsigned.v8i16.v16i8 (<16 x i8 >)
252
+ define <8 x i16 > @widen_high_unsigned_v8i16 (<16 x i8 > %v ) {
253
+ %a = call <8 x i16 > @llvm.wasm.widen.high.unsigned.v8i16.v16i8 (<16 x i8 > %v )
254
+ ret <8 x i16 > %a
255
+ }
256
+
169
257
; ==============================================================================
170
258
; 4 x i32
171
259
; ==============================================================================
@@ -223,6 +311,46 @@ define <4 x i32> @trunc_sat_u_v4i32(<4 x float> %x) {
223
311
ret <4 x i32 > %a
224
312
}
225
313
314
+ ; CHECK-LABEL: widen_low_signed_v4i32:
315
+ ; SIMD128-NEXT: .functype widen_low_signed_v4i32 (v128) -> (v128){{$}}
316
+ ; SIMD128-NEXT: i32x4.widen_low_i16x8_s $push[[R:[0-9]+]]=, $0{{$}}
317
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
318
+ declare <4 x i32 > @llvm.wasm.widen.low.signed.v4i32.v8i16 (<8 x i16 >)
319
+ define <4 x i32 > @widen_low_signed_v4i32 (<8 x i16 > %v ) {
320
+ %a = call <4 x i32 > @llvm.wasm.widen.low.signed.v4i32.v8i16 (<8 x i16 > %v )
321
+ ret <4 x i32 > %a
322
+ }
323
+
324
+ ; CHECK-LABEL: widen_high_signed_v4i32:
325
+ ; SIMD128-NEXT: .functype widen_high_signed_v4i32 (v128) -> (v128){{$}}
326
+ ; SIMD128-NEXT: i32x4.widen_high_i16x8_s $push[[R:[0-9]+]]=, $0{{$}}
327
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
328
+ declare <4 x i32 > @llvm.wasm.widen.high.signed.v4i32.v8i16 (<8 x i16 >)
329
+ define <4 x i32 > @widen_high_signed_v4i32 (<8 x i16 > %v ) {
330
+ %a = call <4 x i32 > @llvm.wasm.widen.high.signed.v4i32.v8i16 (<8 x i16 > %v )
331
+ ret <4 x i32 > %a
332
+ }
333
+
334
+ ; CHECK-LABEL: widen_low_unsigned_v4i32:
335
+ ; SIMD128-NEXT: .functype widen_low_unsigned_v4i32 (v128) -> (v128){{$}}
336
+ ; SIMD128-NEXT: i32x4.widen_low_i16x8_u $push[[R:[0-9]+]]=, $0{{$}}
337
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
338
+ declare <4 x i32 > @llvm.wasm.widen.low.unsigned.v4i32.v8i16 (<8 x i16 >)
339
+ define <4 x i32 > @widen_low_unsigned_v4i32 (<8 x i16 > %v ) {
340
+ %a = call <4 x i32 > @llvm.wasm.widen.low.unsigned.v4i32.v8i16 (<8 x i16 > %v )
341
+ ret <4 x i32 > %a
342
+ }
343
+
344
+ ; CHECK-LABEL: widen_high_unsigned_v4i32:
345
+ ; SIMD128-NEXT: .functype widen_high_unsigned_v4i32 (v128) -> (v128){{$}}
346
+ ; SIMD128-NEXT: i32x4.widen_high_i16x8_u $push[[R:[0-9]+]]=, $0{{$}}
347
+ ; SIMD128-NEXT: return $pop[[R]]{{$}}
348
+ declare <4 x i32 > @llvm.wasm.widen.high.unsigned.v4i32.v8i16 (<8 x i16 >)
349
+ define <4 x i32 > @widen_high_unsigned_v4i32 (<8 x i16 > %v ) {
350
+ %a = call <4 x i32 > @llvm.wasm.widen.high.unsigned.v4i32.v8i16 (<8 x i16 > %v )
351
+ ret <4 x i32 > %a
352
+ }
353
+
226
354
; ==============================================================================
227
355
; 2 x i64
228
356
; ==============================================================================
0 commit comments