xref: /llvm-project/llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll (revision 73856247eef35f5336e485dc009842a5b991c421)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
3
4; Test SIMD v128.load{32,64}_zero instructions
5
6target triple = "wasm32-unknown-unknown"
7
8;===----------------------------------------------------------------------------
9; v128.load32_zero
10;===----------------------------------------------------------------------------
11
12define <4 x i32> @load_zero_i32_no_offset(ptr %p) {
13; CHECK-LABEL: load_zero_i32_no_offset:
14; CHECK:         .functype load_zero_i32_no_offset (i32) -> (v128)
15; CHECK-NEXT:  # %bb.0:
16; CHECK-NEXT:    local.get 0
17; CHECK-NEXT:    v128.load32_zero 0
18; CHECK-NEXT:    # fallthrough-return
19  %x = load i32, ptr %p
20  %v = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
21  ret <4 x i32> %v
22}
23
24define <4 x i32> @load_zero_i32_with_folded_offset(ptr %p) {
25; CHECK-LABEL: load_zero_i32_with_folded_offset:
26; CHECK:         .functype load_zero_i32_with_folded_offset (i32) -> (v128)
27; CHECK-NEXT:  # %bb.0:
28; CHECK-NEXT:    local.get 0
29; CHECK-NEXT:    v128.load32_zero 24
30; CHECK-NEXT:    # fallthrough-return
31  %q = ptrtoint ptr %p to i32
32  %r = add nuw i32 %q, 24
33  %s = inttoptr i32 %r to ptr
34  %x = load i32, ptr %s
35  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
36  ret <4 x i32> %t
37}
38
39define <4 x i32> @load_zero_i32_with_folded_gep_offset(ptr %p) {
40; CHECK-LABEL: load_zero_i32_with_folded_gep_offset:
41; CHECK:         .functype load_zero_i32_with_folded_gep_offset (i32) -> (v128)
42; CHECK-NEXT:  # %bb.0:
43; CHECK-NEXT:    local.get 0
44; CHECK-NEXT:    v128.load32_zero 24
45; CHECK-NEXT:    # fallthrough-return
46  %s = getelementptr inbounds i32, ptr %p, i32 6
47  %x = load i32, ptr %s
48  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
49  ret <4 x i32> %t
50}
51
52define <4 x i32> @load_zero_i32_with_unfolded_gep_negative_offset(ptr %p) {
53; CHECK-LABEL: load_zero_i32_with_unfolded_gep_negative_offset:
54; CHECK:         .functype load_zero_i32_with_unfolded_gep_negative_offset (i32) -> (v128)
55; CHECK-NEXT:  # %bb.0:
56; CHECK-NEXT:    local.get 0
57; CHECK-NEXT:    i32.const -24
58; CHECK-NEXT:    i32.add
59; CHECK-NEXT:    v128.load32_zero 0
60; CHECK-NEXT:    # fallthrough-return
61  %s = getelementptr inbounds i32, ptr %p, i32 -6
62  %x = load i32, ptr %s
63  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
64  ret <4 x i32> %t
65}
66
67define <4 x i32> @load_zero_i32_with_unfolded_offset(ptr %p) {
68; CHECK-LABEL: load_zero_i32_with_unfolded_offset:
69; CHECK:         .functype load_zero_i32_with_unfolded_offset (i32) -> (v128)
70; CHECK-NEXT:  # %bb.0:
71; CHECK-NEXT:    local.get 0
72; CHECK-NEXT:    i32.const 24
73; CHECK-NEXT:    i32.add
74; CHECK-NEXT:    v128.load32_zero 0
75; CHECK-NEXT:    # fallthrough-return
76  %q = ptrtoint ptr %p to i32
77  %r = add nsw i32 %q, 24
78  %s = inttoptr i32 %r to ptr
79  %x = load i32, ptr %s
80  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
81  ret <4 x i32> %t
82}
83
84define <4 x i32> @load_zero_i32_with_unfolded_gep_offset(ptr %p) {
85; CHECK-LABEL: load_zero_i32_with_unfolded_gep_offset:
86; CHECK:         .functype load_zero_i32_with_unfolded_gep_offset (i32) -> (v128)
87; CHECK-NEXT:  # %bb.0:
88; CHECK-NEXT:    local.get 0
89; CHECK-NEXT:    i32.const 24
90; CHECK-NEXT:    i32.add
91; CHECK-NEXT:    v128.load32_zero 0
92; CHECK-NEXT:    # fallthrough-return
93  %s = getelementptr i32, ptr %p, i32 6
94  %x = load i32, ptr %s
95  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
96  ret <4 x i32> %t
97}
98
99define <4 x i32> @load_zero_i32_from_numeric_address() {
100; CHECK-LABEL: load_zero_i32_from_numeric_address:
101; CHECK:         .functype load_zero_i32_from_numeric_address () -> (v128)
102; CHECK-NEXT:  # %bb.0:
103; CHECK-NEXT:    i32.const 0
104; CHECK-NEXT:    v128.load32_zero 42
105; CHECK-NEXT:    # fallthrough-return
106  %s = inttoptr i32 42 to ptr
107  %x = load i32, ptr %s
108  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
109  ret <4 x i32> %t
110}
111
112@gv_i32 = global i32 0
113define <4 x i32> @load_zero_i32_from_global_address() {
114; CHECK-LABEL: load_zero_i32_from_global_address:
115; CHECK:         .functype load_zero_i32_from_global_address () -> (v128)
116; CHECK-NEXT:  # %bb.0:
117; CHECK-NEXT:    i32.const 0
118; CHECK-NEXT:    v128.load32_zero gv_i32
119; CHECK-NEXT:    # fallthrough-return
120  %x = load i32, ptr @gv_i32
121  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
122  ret <4 x i32> %t
123}
124
125;===----------------------------------------------------------------------------
126; v128.load64_zero
127;===----------------------------------------------------------------------------
128
129define <2 x i64> @load_zero_i64_no_offset(ptr %p) {
130; CHECK-LABEL: load_zero_i64_no_offset:
131; CHECK:         .functype load_zero_i64_no_offset (i32) -> (v128)
132; CHECK-NEXT:  # %bb.0:
133; CHECK-NEXT:    local.get 0
134; CHECK-NEXT:    v128.load64_zero 0
135; CHECK-NEXT:    # fallthrough-return
136  %x = load i64, ptr %p
137  %v = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
138  ret <2 x i64> %v
139}
140
141define <2 x i64> @load_zero_i64_with_folded_offset(ptr %p) {
142; CHECK-LABEL: load_zero_i64_with_folded_offset:
143; CHECK:         .functype load_zero_i64_with_folded_offset (i32) -> (v128)
144; CHECK-NEXT:  # %bb.0:
145; CHECK-NEXT:    local.get 0
146; CHECK-NEXT:    v128.load64_zero 24
147; CHECK-NEXT:    # fallthrough-return
148  %q = ptrtoint ptr %p to i32
149  %r = add nuw i32 %q, 24
150  %s = inttoptr i32 %r to ptr
151  %x = load i64, ptr %s
152  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
153  ret <2 x i64> %t
154}
155
156define <2 x i64> @load_zero_i64_with_folded_gep_offset(ptr %p) {
157; CHECK-LABEL: load_zero_i64_with_folded_gep_offset:
158; CHECK:         .functype load_zero_i64_with_folded_gep_offset (i32) -> (v128)
159; CHECK-NEXT:  # %bb.0:
160; CHECK-NEXT:    local.get 0
161; CHECK-NEXT:    v128.load64_zero 48
162; CHECK-NEXT:    # fallthrough-return
163  %s = getelementptr inbounds i64, ptr %p, i64 6
164  %x = load i64, ptr %s
165  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
166  ret <2 x i64> %t
167}
168
169define <2 x i64> @load_zero_i64_with_unfolded_gep_negative_offset(ptr %p) {
170; CHECK-LABEL: load_zero_i64_with_unfolded_gep_negative_offset:
171; CHECK:         .functype load_zero_i64_with_unfolded_gep_negative_offset (i32) -> (v128)
172; CHECK-NEXT:  # %bb.0:
173; CHECK-NEXT:    local.get 0
174; CHECK-NEXT:    i32.const -48
175; CHECK-NEXT:    i32.add
176; CHECK-NEXT:    v128.load64_zero 0
177; CHECK-NEXT:    # fallthrough-return
178  %s = getelementptr inbounds i64, ptr %p, i64 -6
179  %x = load i64, ptr %s
180  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
181  ret <2 x i64> %t
182}
183
184define <2 x i64> @load_zero_i64_with_unfolded_offset(ptr %p) {
185; CHECK-LABEL: load_zero_i64_with_unfolded_offset:
186; CHECK:         .functype load_zero_i64_with_unfolded_offset (i32) -> (v128)
187; CHECK-NEXT:  # %bb.0:
188; CHECK-NEXT:    local.get 0
189; CHECK-NEXT:    i32.const 24
190; CHECK-NEXT:    i32.add
191; CHECK-NEXT:    v128.load64_zero 0
192; CHECK-NEXT:    # fallthrough-return
193  %q = ptrtoint ptr %p to i32
194  %r = add nsw i32 %q, 24
195  %s = inttoptr i32 %r to ptr
196  %x = load i64, ptr %s
197  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
198  ret <2 x i64> %t
199}
200
201define <2 x i64> @load_zero_i64_with_unfolded_gep_offset(ptr %p) {
202; CHECK-LABEL: load_zero_i64_with_unfolded_gep_offset:
203; CHECK:         .functype load_zero_i64_with_unfolded_gep_offset (i32) -> (v128)
204; CHECK-NEXT:  # %bb.0:
205; CHECK-NEXT:    local.get 0
206; CHECK-NEXT:    i32.const 48
207; CHECK-NEXT:    i32.add
208; CHECK-NEXT:    v128.load64_zero 0
209; CHECK-NEXT:    # fallthrough-return
210  %s = getelementptr i64, ptr %p, i64 6
211  %x = load i64, ptr %s
212  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
213  ret <2 x i64> %t
214}
215
216define <2 x i64> @load_zero_i64_from_numeric_address() {
217; CHECK-LABEL: load_zero_i64_from_numeric_address:
218; CHECK:         .functype load_zero_i64_from_numeric_address () -> (v128)
219; CHECK-NEXT:  # %bb.0:
220; CHECK-NEXT:    i32.const 0
221; CHECK-NEXT:    v128.load64_zero 42
222; CHECK-NEXT:    # fallthrough-return
223  %s = inttoptr i32 42 to ptr
224  %x = load i64, ptr %s
225  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
226  ret <2 x i64> %t
227}
228
229@gv_i64 = global i64 0
230define <2 x i64> @load_zero_i64_from_global_address() {
231; CHECK-LABEL: load_zero_i64_from_global_address:
232; CHECK:         .functype load_zero_i64_from_global_address () -> (v128)
233; CHECK-NEXT:  # %bb.0:
234; CHECK-NEXT:    i32.const 0
235; CHECK-NEXT:    v128.load64_zero gv_i64
236; CHECK-NEXT:    # fallthrough-return
237  %x = load i64, ptr @gv_i64
238  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
239  ret <2 x i64> %t
240}
241