xref: /llvm-project/llvm/test/CodeGen/WebAssembly/simd-vector-trunc.ll (revision 61521a5a3dfbe02326afecd35e70e5956fc05895)
1*61521a5aSJing Bao; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*61521a5aSJing Bao; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
3*61521a5aSJing Bao
4*61521a5aSJing Bao; Test that a vector trunc correctly optimizes and lowers to narrow instructions
5*61521a5aSJing Bao
6*61521a5aSJing Baotarget triple = "wasm32-unknown-unknown"
7*61521a5aSJing Bao
8*61521a5aSJing Baodefine <16 x i8>  @trunc16i64_16i8(<16 x i64> %a) {
9*61521a5aSJing Bao; CHECK-LABEL: trunc16i64_16i8:
10*61521a5aSJing Bao; CHECK:         .functype trunc16i64_16i8 (v128, v128, v128, v128, v128, v128, v128, v128) -> (v128)
11*61521a5aSJing Bao; CHECK-NEXT:    .local v128
12*61521a5aSJing Bao; CHECK-NEXT:  # %bb.0: # %entry
13*61521a5aSJing Bao; CHECK-NEXT:    local.get 0
14*61521a5aSJing Bao; CHECK-NEXT:    v128.const 255, 255
15*61521a5aSJing Bao; CHECK-NEXT:    local.tee 8
16*61521a5aSJing Bao; CHECK-NEXT:    v128.and
17*61521a5aSJing Bao; CHECK-NEXT:    local.get 1
18*61521a5aSJing Bao; CHECK-NEXT:    local.get 8
19*61521a5aSJing Bao; CHECK-NEXT:    v128.and
20*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
21*61521a5aSJing Bao; CHECK-NEXT:    local.get 2
22*61521a5aSJing Bao; CHECK-NEXT:    local.get 8
23*61521a5aSJing Bao; CHECK-NEXT:    v128.and
24*61521a5aSJing Bao; CHECK-NEXT:    local.get 3
25*61521a5aSJing Bao; CHECK-NEXT:    local.get 8
26*61521a5aSJing Bao; CHECK-NEXT:    v128.and
27*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
28*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
29*61521a5aSJing Bao; CHECK-NEXT:    local.get 4
30*61521a5aSJing Bao; CHECK-NEXT:    local.get 8
31*61521a5aSJing Bao; CHECK-NEXT:    v128.and
32*61521a5aSJing Bao; CHECK-NEXT:    local.get 5
33*61521a5aSJing Bao; CHECK-NEXT:    local.get 8
34*61521a5aSJing Bao; CHECK-NEXT:    v128.and
35*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
36*61521a5aSJing Bao; CHECK-NEXT:    local.get 6
37*61521a5aSJing Bao; CHECK-NEXT:    local.get 8
38*61521a5aSJing Bao; CHECK-NEXT:    v128.and
39*61521a5aSJing Bao; CHECK-NEXT:    local.get 7
40*61521a5aSJing Bao; CHECK-NEXT:    local.get 8
41*61521a5aSJing Bao; CHECK-NEXT:    v128.and
42*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
43*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
44*61521a5aSJing Bao; CHECK-NEXT:    i8x16.narrow_i16x8_u
45*61521a5aSJing Bao; CHECK-NEXT:    # fallthrough-return
46*61521a5aSJing Baoentry:
47*61521a5aSJing Bao  %0 = trunc <16 x i64> %a to <16 x i8>
48*61521a5aSJing Bao  ret <16 x i8> %0
49*61521a5aSJing Bao}
50*61521a5aSJing Bao
51*61521a5aSJing Baodefine <16 x i8>  @trunc16i32_16i8(<16 x i32> %a) {
52*61521a5aSJing Bao; CHECK-LABEL: trunc16i32_16i8:
53*61521a5aSJing Bao; CHECK:         .functype trunc16i32_16i8 (v128, v128, v128, v128) -> (v128)
54*61521a5aSJing Bao; CHECK-NEXT:    .local v128
55*61521a5aSJing Bao; CHECK-NEXT:  # %bb.0: # %entry
56*61521a5aSJing Bao; CHECK-NEXT:    local.get 0
57*61521a5aSJing Bao; CHECK-NEXT:    v128.const 255, 255, 255, 255
58*61521a5aSJing Bao; CHECK-NEXT:    local.tee 4
59*61521a5aSJing Bao; CHECK-NEXT:    v128.and
60*61521a5aSJing Bao; CHECK-NEXT:    local.get 1
61*61521a5aSJing Bao; CHECK-NEXT:    local.get 4
62*61521a5aSJing Bao; CHECK-NEXT:    v128.and
63*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
64*61521a5aSJing Bao; CHECK-NEXT:    local.get 2
65*61521a5aSJing Bao; CHECK-NEXT:    local.get 4
66*61521a5aSJing Bao; CHECK-NEXT:    v128.and
67*61521a5aSJing Bao; CHECK-NEXT:    local.get 3
68*61521a5aSJing Bao; CHECK-NEXT:    local.get 4
69*61521a5aSJing Bao; CHECK-NEXT:    v128.and
70*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
71*61521a5aSJing Bao; CHECK-NEXT:    i8x16.narrow_i16x8_u
72*61521a5aSJing Bao; CHECK-NEXT:    # fallthrough-return
73*61521a5aSJing Baoentry:
74*61521a5aSJing Bao  %0 = trunc <16 x i32> %a to <16 x i8>
75*61521a5aSJing Bao  ret <16 x i8> %0
76*61521a5aSJing Bao}
77*61521a5aSJing Bao
78*61521a5aSJing Baodefine <16 x i8>  @trunc16i16_16i8(<16 x i16> %a) {
79*61521a5aSJing Bao; CHECK-LABEL: trunc16i16_16i8:
80*61521a5aSJing Bao; CHECK:         .functype trunc16i16_16i8 (v128, v128) -> (v128)
81*61521a5aSJing Bao; CHECK-NEXT:    .local v128
82*61521a5aSJing Bao; CHECK-NEXT:  # %bb.0: # %entry
83*61521a5aSJing Bao; CHECK-NEXT:    local.get 0
84*61521a5aSJing Bao; CHECK-NEXT:    v128.const 255, 255, 255, 255, 255, 255, 255, 255
85*61521a5aSJing Bao; CHECK-NEXT:    local.tee 2
86*61521a5aSJing Bao; CHECK-NEXT:    v128.and
87*61521a5aSJing Bao; CHECK-NEXT:    local.get 1
88*61521a5aSJing Bao; CHECK-NEXT:    local.get 2
89*61521a5aSJing Bao; CHECK-NEXT:    v128.and
90*61521a5aSJing Bao; CHECK-NEXT:    i8x16.narrow_i16x8_u
91*61521a5aSJing Bao; CHECK-NEXT:    # fallthrough-return
92*61521a5aSJing Baoentry:
93*61521a5aSJing Bao  %0 = trunc <16 x i16> %a to <16 x i8>
94*61521a5aSJing Bao  ret <16 x i8> %0
95*61521a5aSJing Bao}
96*61521a5aSJing Bao
97*61521a5aSJing Baodefine <8 x i16> @trunc8i64_8i16(<8 x i64> %a) {
98*61521a5aSJing Bao; CHECK-LABEL: trunc8i64_8i16:
99*61521a5aSJing Bao; CHECK:         .functype trunc8i64_8i16 (v128, v128, v128, v128) -> (v128)
100*61521a5aSJing Bao; CHECK-NEXT:    .local v128
101*61521a5aSJing Bao; CHECK-NEXT:  # %bb.0: # %entry
102*61521a5aSJing Bao; CHECK-NEXT:    local.get 0
103*61521a5aSJing Bao; CHECK-NEXT:    v128.const 65535, 65535
104*61521a5aSJing Bao; CHECK-NEXT:    local.tee 4
105*61521a5aSJing Bao; CHECK-NEXT:    v128.and
106*61521a5aSJing Bao; CHECK-NEXT:    local.get 1
107*61521a5aSJing Bao; CHECK-NEXT:    local.get 4
108*61521a5aSJing Bao; CHECK-NEXT:    v128.and
109*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
110*61521a5aSJing Bao; CHECK-NEXT:    local.get 2
111*61521a5aSJing Bao; CHECK-NEXT:    local.get 4
112*61521a5aSJing Bao; CHECK-NEXT:    v128.and
113*61521a5aSJing Bao; CHECK-NEXT:    local.get 3
114*61521a5aSJing Bao; CHECK-NEXT:    local.get 4
115*61521a5aSJing Bao; CHECK-NEXT:    v128.and
116*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
117*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
118*61521a5aSJing Bao; CHECK-NEXT:    # fallthrough-return
119*61521a5aSJing Baoentry:
120*61521a5aSJing Bao  %0 = trunc <8 x i64> %a to <8 x i16>
121*61521a5aSJing Bao  ret <8 x i16> %0
122*61521a5aSJing Bao}
123*61521a5aSJing Bao
124*61521a5aSJing Baodefine <8 x i16> @trunc8i32_8i16(<8 x i32> %a) {
125*61521a5aSJing Bao; CHECK-LABEL: trunc8i32_8i16:
126*61521a5aSJing Bao; CHECK:         .functype trunc8i32_8i16 (v128, v128) -> (v128)
127*61521a5aSJing Bao; CHECK-NEXT:    .local v128
128*61521a5aSJing Bao; CHECK-NEXT:  # %bb.0: # %entry
129*61521a5aSJing Bao; CHECK-NEXT:    local.get 0
130*61521a5aSJing Bao; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
131*61521a5aSJing Bao; CHECK-NEXT:    local.tee 2
132*61521a5aSJing Bao; CHECK-NEXT:    v128.and
133*61521a5aSJing Bao; CHECK-NEXT:    local.get 1
134*61521a5aSJing Bao; CHECK-NEXT:    local.get 2
135*61521a5aSJing Bao; CHECK-NEXT:    v128.and
136*61521a5aSJing Bao; CHECK-NEXT:    i16x8.narrow_i32x4_u
137*61521a5aSJing Bao; CHECK-NEXT:    # fallthrough-return
138*61521a5aSJing Baoentry:
139*61521a5aSJing Bao  %0 = trunc <8 x i32> %a to <8 x i16>
140*61521a5aSJing Bao  ret <8 x i16> %0
141*61521a5aSJing Bao}
142