Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / WebAssembly / i128.ll
blobeae7f5f834dc0f912c4664e489a65cb3d59e3979
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck %s
4 ; Test that basic 128-bit integer operations assemble as expected.
6 target triple = "wasm32-unknown-unknown"
8 declare i128 @llvm.ctlz.i128(i128, i1)
9 declare i128 @llvm.cttz.i128(i128, i1)
10 declare i128 @llvm.ctpop.i128(i128)
12 define i128 @add128(i128 %x, i128 %y) {
13 ; CHECK-LABEL: add128:
14 ; CHECK:         .functype add128 (i32, i64, i64, i64, i64) -> ()
15 ; CHECK-NEXT:  # %bb.0:
16 ; CHECK-NEXT:    local.get $push8=, 0
17 ; CHECK-NEXT:    local.get $push7=, 1
18 ; CHECK-NEXT:    local.get $push6=, 3
19 ; CHECK-NEXT:    i64.add $push5=, $pop7, $pop6
20 ; CHECK-NEXT:    local.tee $push4=, 3, $pop5
21 ; CHECK-NEXT:    i64.store 0($pop8), $pop4
22 ; CHECK-NEXT:    local.get $push13=, 0
23 ; CHECK-NEXT:    local.get $push10=, 2
24 ; CHECK-NEXT:    local.get $push9=, 4
25 ; CHECK-NEXT:    i64.add $push0=, $pop10, $pop9
26 ; CHECK-NEXT:    local.get $push12=, 3
27 ; CHECK-NEXT:    local.get $push11=, 1
28 ; CHECK-NEXT:    i64.lt_u $push1=, $pop12, $pop11
29 ; CHECK-NEXT:    i64.extend_i32_u $push2=, $pop1
30 ; CHECK-NEXT:    i64.add $push3=, $pop0, $pop2
31 ; CHECK-NEXT:    i64.store 8($pop13), $pop3
32 ; CHECK-NEXT:    return
33   %a = add i128 %x, %y
34   ret i128 %a
37 define i128 @sub128(i128 %x, i128 %y) {
38 ; CHECK-LABEL: sub128:
39 ; CHECK:         .functype sub128 (i32, i64, i64, i64, i64) -> ()
40 ; CHECK-NEXT:  # %bb.0:
41 ; CHECK-NEXT:    local.get $push7=, 0
42 ; CHECK-NEXT:    local.get $push6=, 1
43 ; CHECK-NEXT:    local.get $push5=, 3
44 ; CHECK-NEXT:    i64.sub $push0=, $pop6, $pop5
45 ; CHECK-NEXT:    i64.store 0($pop7), $pop0
46 ; CHECK-NEXT:    local.get $push12=, 0
47 ; CHECK-NEXT:    local.get $push9=, 2
48 ; CHECK-NEXT:    local.get $push8=, 4
49 ; CHECK-NEXT:    i64.sub $push1=, $pop9, $pop8
50 ; CHECK-NEXT:    local.get $push11=, 1
51 ; CHECK-NEXT:    local.get $push10=, 3
52 ; CHECK-NEXT:    i64.lt_u $push2=, $pop11, $pop10
53 ; CHECK-NEXT:    i64.extend_i32_u $push3=, $pop2
54 ; CHECK-NEXT:    i64.sub $push4=, $pop1, $pop3
55 ; CHECK-NEXT:    i64.store 8($pop12), $pop4
56 ; CHECK-NEXT:    return
57   %a = sub i128 %x, %y
58   ret i128 %a
61 define i128 @mul128(i128 %x, i128 %y) {
62 ; CHECK-LABEL: mul128:
63 ; CHECK:         .functype mul128 (i32, i64, i64, i64, i64) -> ()
64 ; CHECK-NEXT:    .local i32
65 ; CHECK-NEXT:  # %bb.0:
66 ; CHECK-NEXT:    global.get $push4=, __stack_pointer
67 ; CHECK-NEXT:    i32.const $push5=, 16
68 ; CHECK-NEXT:    i32.sub $push9=, $pop4, $pop5
69 ; CHECK-NEXT:    local.tee $push8=, 5, $pop9
70 ; CHECK-NEXT:    global.set __stack_pointer, $pop8
71 ; CHECK-NEXT:    local.get $push14=, 5
72 ; CHECK-NEXT:    local.get $push13=, 1
73 ; CHECK-NEXT:    local.get $push12=, 2
74 ; CHECK-NEXT:    local.get $push11=, 3
75 ; CHECK-NEXT:    local.get $push10=, 4
76 ; CHECK-NEXT:    call __multi3, $pop14, $pop13, $pop12, $pop11, $pop10
77 ; CHECK-NEXT:    local.get $push16=, 0
78 ; CHECK-NEXT:    local.get $push15=, 5
79 ; CHECK-NEXT:    i32.const $push0=, 8
80 ; CHECK-NEXT:    i32.add $push1=, $pop15, $pop0
81 ; CHECK-NEXT:    i64.load $push2=, 0($pop1)
82 ; CHECK-NEXT:    i64.store 8($pop16), $pop2
83 ; CHECK-NEXT:    local.get $push18=, 0
84 ; CHECK-NEXT:    local.get $push17=, 5
85 ; CHECK-NEXT:    i64.load $push3=, 0($pop17)
86 ; CHECK-NEXT:    i64.store 0($pop18), $pop3
87 ; CHECK-NEXT:    local.get $push19=, 5
88 ; CHECK-NEXT:    i32.const $push6=, 16
89 ; CHECK-NEXT:    i32.add $push7=, $pop19, $pop6
90 ; CHECK-NEXT:    global.set __stack_pointer, $pop7
91 ; CHECK-NEXT:    return
92   %a = mul i128 %x, %y
93   ret i128 %a
96 define i128 @sdiv128(i128 %x, i128 %y) {
97 ; CHECK-LABEL: sdiv128:
98 ; CHECK:         .functype sdiv128 (i32, i64, i64, i64, i64) -> ()
99 ; CHECK-NEXT:    .local i32
100 ; CHECK-NEXT:  # %bb.0:
101 ; CHECK-NEXT:    global.get $push4=, __stack_pointer
102 ; CHECK-NEXT:    i32.const $push5=, 16
103 ; CHECK-NEXT:    i32.sub $push9=, $pop4, $pop5
104 ; CHECK-NEXT:    local.tee $push8=, 5, $pop9
105 ; CHECK-NEXT:    global.set __stack_pointer, $pop8
106 ; CHECK-NEXT:    local.get $push14=, 5
107 ; CHECK-NEXT:    local.get $push13=, 1
108 ; CHECK-NEXT:    local.get $push12=, 2
109 ; CHECK-NEXT:    local.get $push11=, 3
110 ; CHECK-NEXT:    local.get $push10=, 4
111 ; CHECK-NEXT:    call __divti3, $pop14, $pop13, $pop12, $pop11, $pop10
112 ; CHECK-NEXT:    local.get $push16=, 0
113 ; CHECK-NEXT:    local.get $push15=, 5
114 ; CHECK-NEXT:    i32.const $push0=, 8
115 ; CHECK-NEXT:    i32.add $push1=, $pop15, $pop0
116 ; CHECK-NEXT:    i64.load $push2=, 0($pop1)
117 ; CHECK-NEXT:    i64.store 8($pop16), $pop2
118 ; CHECK-NEXT:    local.get $push18=, 0
119 ; CHECK-NEXT:    local.get $push17=, 5
120 ; CHECK-NEXT:    i64.load $push3=, 0($pop17)
121 ; CHECK-NEXT:    i64.store 0($pop18), $pop3
122 ; CHECK-NEXT:    local.get $push19=, 5
123 ; CHECK-NEXT:    i32.const $push6=, 16
124 ; CHECK-NEXT:    i32.add $push7=, $pop19, $pop6
125 ; CHECK-NEXT:    global.set __stack_pointer, $pop7
126 ; CHECK-NEXT:    return
127   %a = sdiv i128 %x, %y
128   ret i128 %a
131 define i128 @udiv128(i128 %x, i128 %y) {
132 ; CHECK-LABEL: udiv128:
133 ; CHECK:         .functype udiv128 (i32, i64, i64, i64, i64) -> ()
134 ; CHECK-NEXT:    .local i32
135 ; CHECK-NEXT:  # %bb.0:
136 ; CHECK-NEXT:    global.get $push4=, __stack_pointer
137 ; CHECK-NEXT:    i32.const $push5=, 16
138 ; CHECK-NEXT:    i32.sub $push9=, $pop4, $pop5
139 ; CHECK-NEXT:    local.tee $push8=, 5, $pop9
140 ; CHECK-NEXT:    global.set __stack_pointer, $pop8
141 ; CHECK-NEXT:    local.get $push14=, 5
142 ; CHECK-NEXT:    local.get $push13=, 1
143 ; CHECK-NEXT:    local.get $push12=, 2
144 ; CHECK-NEXT:    local.get $push11=, 3
145 ; CHECK-NEXT:    local.get $push10=, 4
146 ; CHECK-NEXT:    call __udivti3, $pop14, $pop13, $pop12, $pop11, $pop10
147 ; CHECK-NEXT:    local.get $push16=, 0
148 ; CHECK-NEXT:    local.get $push15=, 5
149 ; CHECK-NEXT:    i32.const $push0=, 8
150 ; CHECK-NEXT:    i32.add $push1=, $pop15, $pop0
151 ; CHECK-NEXT:    i64.load $push2=, 0($pop1)
152 ; CHECK-NEXT:    i64.store 8($pop16), $pop2
153 ; CHECK-NEXT:    local.get $push18=, 0
154 ; CHECK-NEXT:    local.get $push17=, 5
155 ; CHECK-NEXT:    i64.load $push3=, 0($pop17)
156 ; CHECK-NEXT:    i64.store 0($pop18), $pop3
157 ; CHECK-NEXT:    local.get $push19=, 5
158 ; CHECK-NEXT:    i32.const $push6=, 16
159 ; CHECK-NEXT:    i32.add $push7=, $pop19, $pop6
160 ; CHECK-NEXT:    global.set __stack_pointer, $pop7
161 ; CHECK-NEXT:    return
162   %a = udiv i128 %x, %y
163   ret i128 %a
166 define i128 @srem128(i128 %x, i128 %y) {
167 ; CHECK-LABEL: srem128:
168 ; CHECK:         .functype srem128 (i32, i64, i64, i64, i64) -> ()
169 ; CHECK-NEXT:    .local i32
170 ; CHECK-NEXT:  # %bb.0:
171 ; CHECK-NEXT:    global.get $push4=, __stack_pointer
172 ; CHECK-NEXT:    i32.const $push5=, 16
173 ; CHECK-NEXT:    i32.sub $push9=, $pop4, $pop5
174 ; CHECK-NEXT:    local.tee $push8=, 5, $pop9
175 ; CHECK-NEXT:    global.set __stack_pointer, $pop8
176 ; CHECK-NEXT:    local.get $push14=, 5
177 ; CHECK-NEXT:    local.get $push13=, 1
178 ; CHECK-NEXT:    local.get $push12=, 2
179 ; CHECK-NEXT:    local.get $push11=, 3
180 ; CHECK-NEXT:    local.get $push10=, 4
181 ; CHECK-NEXT:    call __modti3, $pop14, $pop13, $pop12, $pop11, $pop10
182 ; CHECK-NEXT:    local.get $push16=, 0
183 ; CHECK-NEXT:    local.get $push15=, 5
184 ; CHECK-NEXT:    i32.const $push0=, 8
185 ; CHECK-NEXT:    i32.add $push1=, $pop15, $pop0
186 ; CHECK-NEXT:    i64.load $push2=, 0($pop1)
187 ; CHECK-NEXT:    i64.store 8($pop16), $pop2
188 ; CHECK-NEXT:    local.get $push18=, 0
189 ; CHECK-NEXT:    local.get $push17=, 5
190 ; CHECK-NEXT:    i64.load $push3=, 0($pop17)
191 ; CHECK-NEXT:    i64.store 0($pop18), $pop3
192 ; CHECK-NEXT:    local.get $push19=, 5
193 ; CHECK-NEXT:    i32.const $push6=, 16
194 ; CHECK-NEXT:    i32.add $push7=, $pop19, $pop6
195 ; CHECK-NEXT:    global.set __stack_pointer, $pop7
196 ; CHECK-NEXT:    return
197   %a = srem i128 %x, %y
198   ret i128 %a
201 define i128 @urem128(i128 %x, i128 %y) {
202 ; CHECK-LABEL: urem128:
203 ; CHECK:         .functype urem128 (i32, i64, i64, i64, i64) -> ()
204 ; CHECK-NEXT:    .local i32
205 ; CHECK-NEXT:  # %bb.0:
206 ; CHECK-NEXT:    global.get $push4=, __stack_pointer
207 ; CHECK-NEXT:    i32.const $push5=, 16
208 ; CHECK-NEXT:    i32.sub $push9=, $pop4, $pop5
209 ; CHECK-NEXT:    local.tee $push8=, 5, $pop9
210 ; CHECK-NEXT:    global.set __stack_pointer, $pop8
211 ; CHECK-NEXT:    local.get $push14=, 5
212 ; CHECK-NEXT:    local.get $push13=, 1
213 ; CHECK-NEXT:    local.get $push12=, 2
214 ; CHECK-NEXT:    local.get $push11=, 3
215 ; CHECK-NEXT:    local.get $push10=, 4
216 ; CHECK-NEXT:    call __umodti3, $pop14, $pop13, $pop12, $pop11, $pop10
217 ; CHECK-NEXT:    local.get $push16=, 0
218 ; CHECK-NEXT:    local.get $push15=, 5
219 ; CHECK-NEXT:    i32.const $push0=, 8
220 ; CHECK-NEXT:    i32.add $push1=, $pop15, $pop0
221 ; CHECK-NEXT:    i64.load $push2=, 0($pop1)
222 ; CHECK-NEXT:    i64.store 8($pop16), $pop2
223 ; CHECK-NEXT:    local.get $push18=, 0
224 ; CHECK-NEXT:    local.get $push17=, 5
225 ; CHECK-NEXT:    i64.load $push3=, 0($pop17)
226 ; CHECK-NEXT:    i64.store 0($pop18), $pop3
227 ; CHECK-NEXT:    local.get $push19=, 5
228 ; CHECK-NEXT:    i32.const $push6=, 16
229 ; CHECK-NEXT:    i32.add $push7=, $pop19, $pop6
230 ; CHECK-NEXT:    global.set __stack_pointer, $pop7
231 ; CHECK-NEXT:    return
232   %a = urem i128 %x, %y
233   ret i128 %a
236 define i128 @and128(i128 %x, i128 %y) {
237 ; CHECK-LABEL: and128:
238 ; CHECK:         .functype and128 (i32, i64, i64, i64, i64) -> ()
239 ; CHECK-NEXT:  # %bb.0:
240 ; CHECK-NEXT:    local.get $push4=, 0
241 ; CHECK-NEXT:    local.get $push3=, 2
242 ; CHECK-NEXT:    local.get $push2=, 4
243 ; CHECK-NEXT:    i64.and $push0=, $pop3, $pop2
244 ; CHECK-NEXT:    i64.store 8($pop4), $pop0
245 ; CHECK-NEXT:    local.get $push7=, 0
246 ; CHECK-NEXT:    local.get $push6=, 1
247 ; CHECK-NEXT:    local.get $push5=, 3
248 ; CHECK-NEXT:    i64.and $push1=, $pop6, $pop5
249 ; CHECK-NEXT:    i64.store 0($pop7), $pop1
250 ; CHECK-NEXT:    return
251   %a = and i128 %x, %y
252   ret i128 %a
255 define i128 @or128(i128 %x, i128 %y) {
256 ; CHECK-LABEL: or128:
257 ; CHECK:         .functype or128 (i32, i64, i64, i64, i64) -> ()
258 ; CHECK-NEXT:  # %bb.0:
259 ; CHECK-NEXT:    local.get $push4=, 0
260 ; CHECK-NEXT:    local.get $push3=, 2
261 ; CHECK-NEXT:    local.get $push2=, 4
262 ; CHECK-NEXT:    i64.or $push0=, $pop3, $pop2
263 ; CHECK-NEXT:    i64.store 8($pop4), $pop0
264 ; CHECK-NEXT:    local.get $push7=, 0
265 ; CHECK-NEXT:    local.get $push6=, 1
266 ; CHECK-NEXT:    local.get $push5=, 3
267 ; CHECK-NEXT:    i64.or $push1=, $pop6, $pop5
268 ; CHECK-NEXT:    i64.store 0($pop7), $pop1
269 ; CHECK-NEXT:    return
270   %a = or i128 %x, %y
271   ret i128 %a
274 define i128 @xor128(i128 %x, i128 %y) {
275 ; CHECK-LABEL: xor128:
276 ; CHECK:         .functype xor128 (i32, i64, i64, i64, i64) -> ()
277 ; CHECK-NEXT:  # %bb.0:
278 ; CHECK-NEXT:    local.get $push4=, 0
279 ; CHECK-NEXT:    local.get $push3=, 2
280 ; CHECK-NEXT:    local.get $push2=, 4
281 ; CHECK-NEXT:    i64.xor $push0=, $pop3, $pop2
282 ; CHECK-NEXT:    i64.store 8($pop4), $pop0
283 ; CHECK-NEXT:    local.get $push7=, 0
284 ; CHECK-NEXT:    local.get $push6=, 1
285 ; CHECK-NEXT:    local.get $push5=, 3
286 ; CHECK-NEXT:    i64.xor $push1=, $pop6, $pop5
287 ; CHECK-NEXT:    i64.store 0($pop7), $pop1
288 ; CHECK-NEXT:    return
289   %a = xor i128 %x, %y
290   ret i128 %a
293 define i128 @shl128(i128 %x, i128 %y) {
294 ; CHECK-LABEL: shl128:
295 ; CHECK:         .functype shl128 (i32, i64, i64, i64, i64) -> ()
296 ; CHECK-NEXT:    .local i32
297 ; CHECK-NEXT:  # %bb.0:
298 ; CHECK-NEXT:    global.get $push5=, __stack_pointer
299 ; CHECK-NEXT:    i32.const $push6=, 16
300 ; CHECK-NEXT:    i32.sub $push10=, $pop5, $pop6
301 ; CHECK-NEXT:    local.tee $push9=, 5, $pop10
302 ; CHECK-NEXT:    global.set __stack_pointer, $pop9
303 ; CHECK-NEXT:    local.get $push14=, 5
304 ; CHECK-NEXT:    local.get $push13=, 1
305 ; CHECK-NEXT:    local.get $push12=, 2
306 ; CHECK-NEXT:    local.get $push11=, 3
307 ; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop11
308 ; CHECK-NEXT:    call __ashlti3, $pop14, $pop13, $pop12, $pop0
309 ; CHECK-NEXT:    local.get $push16=, 0
310 ; CHECK-NEXT:    local.get $push15=, 5
311 ; CHECK-NEXT:    i32.const $push1=, 8
312 ; CHECK-NEXT:    i32.add $push2=, $pop15, $pop1
313 ; CHECK-NEXT:    i64.load $push3=, 0($pop2)
314 ; CHECK-NEXT:    i64.store 8($pop16), $pop3
315 ; CHECK-NEXT:    local.get $push18=, 0
316 ; CHECK-NEXT:    local.get $push17=, 5
317 ; CHECK-NEXT:    i64.load $push4=, 0($pop17)
318 ; CHECK-NEXT:    i64.store 0($pop18), $pop4
319 ; CHECK-NEXT:    local.get $push19=, 5
320 ; CHECK-NEXT:    i32.const $push7=, 16
321 ; CHECK-NEXT:    i32.add $push8=, $pop19, $pop7
322 ; CHECK-NEXT:    global.set __stack_pointer, $pop8
323 ; CHECK-NEXT:    return
324   %a = shl i128 %x, %y
325   ret i128 %a
328 define i128 @shr128(i128 %x, i128 %y) {
329 ; CHECK-LABEL: shr128:
330 ; CHECK:         .functype shr128 (i32, i64, i64, i64, i64) -> ()
331 ; CHECK-NEXT:    .local i32
332 ; CHECK-NEXT:  # %bb.0:
333 ; CHECK-NEXT:    global.get $push5=, __stack_pointer
334 ; CHECK-NEXT:    i32.const $push6=, 16
335 ; CHECK-NEXT:    i32.sub $push10=, $pop5, $pop6
336 ; CHECK-NEXT:    local.tee $push9=, 5, $pop10
337 ; CHECK-NEXT:    global.set __stack_pointer, $pop9
338 ; CHECK-NEXT:    local.get $push14=, 5
339 ; CHECK-NEXT:    local.get $push13=, 1
340 ; CHECK-NEXT:    local.get $push12=, 2
341 ; CHECK-NEXT:    local.get $push11=, 3
342 ; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop11
343 ; CHECK-NEXT:    call __lshrti3, $pop14, $pop13, $pop12, $pop0
344 ; CHECK-NEXT:    local.get $push16=, 0
345 ; CHECK-NEXT:    local.get $push15=, 5
346 ; CHECK-NEXT:    i32.const $push1=, 8
347 ; CHECK-NEXT:    i32.add $push2=, $pop15, $pop1
348 ; CHECK-NEXT:    i64.load $push3=, 0($pop2)
349 ; CHECK-NEXT:    i64.store 8($pop16), $pop3
350 ; CHECK-NEXT:    local.get $push18=, 0
351 ; CHECK-NEXT:    local.get $push17=, 5
352 ; CHECK-NEXT:    i64.load $push4=, 0($pop17)
353 ; CHECK-NEXT:    i64.store 0($pop18), $pop4
354 ; CHECK-NEXT:    local.get $push19=, 5
355 ; CHECK-NEXT:    i32.const $push7=, 16
356 ; CHECK-NEXT:    i32.add $push8=, $pop19, $pop7
357 ; CHECK-NEXT:    global.set __stack_pointer, $pop8
358 ; CHECK-NEXT:    return
359   %a = lshr i128 %x, %y
360   ret i128 %a
363 define i128 @sar128(i128 %x, i128 %y) {
364 ; CHECK-LABEL: sar128:
365 ; CHECK:         .functype sar128 (i32, i64, i64, i64, i64) -> ()
366 ; CHECK-NEXT:    .local i32
367 ; CHECK-NEXT:  # %bb.0:
368 ; CHECK-NEXT:    global.get $push5=, __stack_pointer
369 ; CHECK-NEXT:    i32.const $push6=, 16
370 ; CHECK-NEXT:    i32.sub $push10=, $pop5, $pop6
371 ; CHECK-NEXT:    local.tee $push9=, 5, $pop10
372 ; CHECK-NEXT:    global.set __stack_pointer, $pop9
373 ; CHECK-NEXT:    local.get $push14=, 5
374 ; CHECK-NEXT:    local.get $push13=, 1
375 ; CHECK-NEXT:    local.get $push12=, 2
376 ; CHECK-NEXT:    local.get $push11=, 3
377 ; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop11
378 ; CHECK-NEXT:    call __ashrti3, $pop14, $pop13, $pop12, $pop0
379 ; CHECK-NEXT:    local.get $push16=, 0
380 ; CHECK-NEXT:    local.get $push15=, 5
381 ; CHECK-NEXT:    i32.const $push1=, 8
382 ; CHECK-NEXT:    i32.add $push2=, $pop15, $pop1
383 ; CHECK-NEXT:    i64.load $push3=, 0($pop2)
384 ; CHECK-NEXT:    i64.store 8($pop16), $pop3
385 ; CHECK-NEXT:    local.get $push18=, 0
386 ; CHECK-NEXT:    local.get $push17=, 5
387 ; CHECK-NEXT:    i64.load $push4=, 0($pop17)
388 ; CHECK-NEXT:    i64.store 0($pop18), $pop4
389 ; CHECK-NEXT:    local.get $push19=, 5
390 ; CHECK-NEXT:    i32.const $push7=, 16
391 ; CHECK-NEXT:    i32.add $push8=, $pop19, $pop7
392 ; CHECK-NEXT:    global.set __stack_pointer, $pop8
393 ; CHECK-NEXT:    return
394   %a = ashr i128 %x, %y
395   ret i128 %a
398 define i128 @clz128(i128 %x) {
399 ; CHECK-LABEL: clz128:
400 ; CHECK:         .functype clz128 (i32, i64, i64) -> ()
401 ; CHECK-NEXT:  # %bb.0:
402 ; CHECK-NEXT:    local.get $push8=, 0
403 ; CHECK-NEXT:    i64.const $push0=, 0
404 ; CHECK-NEXT:    i64.store 8($pop8), $pop0
405 ; CHECK-NEXT:    local.get $push12=, 0
406 ; CHECK-NEXT:    local.get $push9=, 2
407 ; CHECK-NEXT:    i64.clz $push5=, $pop9
408 ; CHECK-NEXT:    local.get $push10=, 1
409 ; CHECK-NEXT:    i64.clz $push2=, $pop10
410 ; CHECK-NEXT:    i64.const $push3=, 64
411 ; CHECK-NEXT:    i64.add $push4=, $pop2, $pop3
412 ; CHECK-NEXT:    local.get $push11=, 2
413 ; CHECK-NEXT:    i64.const $push7=, 0
414 ; CHECK-NEXT:    i64.ne $push1=, $pop11, $pop7
415 ; CHECK-NEXT:    i64.select $push6=, $pop5, $pop4, $pop1
416 ; CHECK-NEXT:    i64.store 0($pop12), $pop6
417 ; CHECK-NEXT:    return
418   %a = call i128 @llvm.ctlz.i128(i128 %x, i1 false)
419   ret i128 %a
422 define i128 @clz128_zero_undef(i128 %x) {
423 ; CHECK-LABEL: clz128_zero_undef:
424 ; CHECK:         .functype clz128_zero_undef (i32, i64, i64) -> ()
425 ; CHECK-NEXT:  # %bb.0:
426 ; CHECK-NEXT:    local.get $push8=, 0
427 ; CHECK-NEXT:    i64.const $push0=, 0
428 ; CHECK-NEXT:    i64.store 8($pop8), $pop0
429 ; CHECK-NEXT:    local.get $push12=, 0
430 ; CHECK-NEXT:    local.get $push9=, 2
431 ; CHECK-NEXT:    i64.clz $push5=, $pop9
432 ; CHECK-NEXT:    local.get $push10=, 1
433 ; CHECK-NEXT:    i64.clz $push2=, $pop10
434 ; CHECK-NEXT:    i64.const $push3=, 64
435 ; CHECK-NEXT:    i64.add $push4=, $pop2, $pop3
436 ; CHECK-NEXT:    local.get $push11=, 2
437 ; CHECK-NEXT:    i64.const $push7=, 0
438 ; CHECK-NEXT:    i64.ne $push1=, $pop11, $pop7
439 ; CHECK-NEXT:    i64.select $push6=, $pop5, $pop4, $pop1
440 ; CHECK-NEXT:    i64.store 0($pop12), $pop6
441 ; CHECK-NEXT:    return
442   %a = call i128 @llvm.ctlz.i128(i128 %x, i1 true)
443   ret i128 %a
446 define i128 @ctz128(i128 %x) {
447 ; CHECK-LABEL: ctz128:
448 ; CHECK:         .functype ctz128 (i32, i64, i64) -> ()
449 ; CHECK-NEXT:  # %bb.0:
450 ; CHECK-NEXT:    local.get $push8=, 0
451 ; CHECK-NEXT:    i64.const $push0=, 0
452 ; CHECK-NEXT:    i64.store 8($pop8), $pop0
453 ; CHECK-NEXT:    local.get $push12=, 0
454 ; CHECK-NEXT:    local.get $push9=, 1
455 ; CHECK-NEXT:    i64.ctz $push5=, $pop9
456 ; CHECK-NEXT:    local.get $push10=, 2
457 ; CHECK-NEXT:    i64.ctz $push2=, $pop10
458 ; CHECK-NEXT:    i64.const $push3=, 64
459 ; CHECK-NEXT:    i64.add $push4=, $pop2, $pop3
460 ; CHECK-NEXT:    local.get $push11=, 1
461 ; CHECK-NEXT:    i64.const $push7=, 0
462 ; CHECK-NEXT:    i64.ne $push1=, $pop11, $pop7
463 ; CHECK-NEXT:    i64.select $push6=, $pop5, $pop4, $pop1
464 ; CHECK-NEXT:    i64.store 0($pop12), $pop6
465 ; CHECK-NEXT:    return
466   %a = call i128 @llvm.cttz.i128(i128 %x, i1 false)
467   ret i128 %a
470 define i128 @ctz128_zero_undef(i128 %x) {
471 ; CHECK-LABEL: ctz128_zero_undef:
472 ; CHECK:         .functype ctz128_zero_undef (i32, i64, i64) -> ()
473 ; CHECK-NEXT:  # %bb.0:
474 ; CHECK-NEXT:    local.get $push8=, 0
475 ; CHECK-NEXT:    i64.const $push0=, 0
476 ; CHECK-NEXT:    i64.store 8($pop8), $pop0
477 ; CHECK-NEXT:    local.get $push12=, 0
478 ; CHECK-NEXT:    local.get $push9=, 1
479 ; CHECK-NEXT:    i64.ctz $push5=, $pop9
480 ; CHECK-NEXT:    local.get $push10=, 2
481 ; CHECK-NEXT:    i64.ctz $push2=, $pop10
482 ; CHECK-NEXT:    i64.const $push3=, 64
483 ; CHECK-NEXT:    i64.add $push4=, $pop2, $pop3
484 ; CHECK-NEXT:    local.get $push11=, 1
485 ; CHECK-NEXT:    i64.const $push7=, 0
486 ; CHECK-NEXT:    i64.ne $push1=, $pop11, $pop7
487 ; CHECK-NEXT:    i64.select $push6=, $pop5, $pop4, $pop1
488 ; CHECK-NEXT:    i64.store 0($pop12), $pop6
489 ; CHECK-NEXT:    return
490   %a = call i128 @llvm.cttz.i128(i128 %x, i1 true)
491   ret i128 %a
494 define i128 @popcnt128(i128 %x) {
495 ; CHECK-LABEL: popcnt128:
496 ; CHECK:         .functype popcnt128 (i32, i64, i64) -> ()
497 ; CHECK-NEXT:  # %bb.0:
498 ; CHECK-NEXT:    local.get $push4=, 0
499 ; CHECK-NEXT:    i64.const $push0=, 0
500 ; CHECK-NEXT:    i64.store 8($pop4), $pop0
501 ; CHECK-NEXT:    local.get $push7=, 0
502 ; CHECK-NEXT:    local.get $push5=, 1
503 ; CHECK-NEXT:    i64.popcnt $push2=, $pop5
504 ; CHECK-NEXT:    local.get $push6=, 2
505 ; CHECK-NEXT:    i64.popcnt $push1=, $pop6
506 ; CHECK-NEXT:    i64.add $push3=, $pop2, $pop1
507 ; CHECK-NEXT:    i64.store 0($pop7), $pop3
508 ; CHECK-NEXT:    return
509   %a = call i128 @llvm.ctpop.i128(i128 %x)
510   ret i128 %a
513 define i32 @eqz128(i128 %x) {
514 ; CHECK-LABEL: eqz128:
515 ; CHECK:         .functype eqz128 (i64, i64) -> (i32)
516 ; CHECK-NEXT:  # %bb.0:
517 ; CHECK-NEXT:    local.get $push3=, 0
518 ; CHECK-NEXT:    local.get $push2=, 1
519 ; CHECK-NEXT:    i64.or $push0=, $pop3, $pop2
520 ; CHECK-NEXT:    i64.eqz $push1=, $pop0
521 ; CHECK-NEXT:    return $pop1
522   %a = icmp eq i128 %x, 0
523   %b = zext i1 %a to i32
524   ret i32 %b
527 define i128 @rotl(i128 %x, i128 %y) {
528 ; CHECK-LABEL: rotl:
529 ; CHECK:         .functype rotl (i32, i64, i64, i64, i64) -> ()
530 ; CHECK-NEXT:    .local i32, i32
531 ; CHECK-NEXT:  # %bb.0:
532 ; CHECK-NEXT:    global.get $push11=, __stack_pointer
533 ; CHECK-NEXT:    i32.const $push12=, 32
534 ; CHECK-NEXT:    i32.sub $push23=, $pop11, $pop12
535 ; CHECK-NEXT:    local.tee $push22=, 5, $pop23
536 ; CHECK-NEXT:    global.set __stack_pointer, $pop22
537 ; CHECK-NEXT:    local.get $push24=, 5
538 ; CHECK-NEXT:    i32.const $push17=, 16
539 ; CHECK-NEXT:    i32.add $push18=, $pop24, $pop17
540 ; CHECK-NEXT:    local.get $push27=, 1
541 ; CHECK-NEXT:    local.get $push26=, 2
542 ; CHECK-NEXT:    local.get $push25=, 3
543 ; CHECK-NEXT:    i32.wrap_i64 $push21=, $pop25
544 ; CHECK-NEXT:    local.tee $push20=, 6, $pop21
545 ; CHECK-NEXT:    call __ashlti3, $pop18, $pop27, $pop26, $pop20
546 ; CHECK-NEXT:    local.get $push31=, 5
547 ; CHECK-NEXT:    local.get $push30=, 1
548 ; CHECK-NEXT:    local.get $push29=, 2
549 ; CHECK-NEXT:    i32.const $push0=, 128
550 ; CHECK-NEXT:    local.get $push28=, 6
551 ; CHECK-NEXT:    i32.sub $push1=, $pop0, $pop28
552 ; CHECK-NEXT:    call __lshrti3, $pop31, $pop30, $pop29, $pop1
553 ; CHECK-NEXT:    local.get $push34=, 0
554 ; CHECK-NEXT:    local.get $push32=, 5
555 ; CHECK-NEXT:    i32.const $push15=, 16
556 ; CHECK-NEXT:    i32.add $push16=, $pop32, $pop15
557 ; CHECK-NEXT:    i32.const $push2=, 8
558 ; CHECK-NEXT:    i32.add $push3=, $pop16, $pop2
559 ; CHECK-NEXT:    i64.load $push4=, 0($pop3)
560 ; CHECK-NEXT:    local.get $push33=, 5
561 ; CHECK-NEXT:    i32.const $push19=, 8
562 ; CHECK-NEXT:    i32.add $push5=, $pop33, $pop19
563 ; CHECK-NEXT:    i64.load $push6=, 0($pop5)
564 ; CHECK-NEXT:    i64.or $push7=, $pop4, $pop6
565 ; CHECK-NEXT:    i64.store 8($pop34), $pop7
566 ; CHECK-NEXT:    local.get $push37=, 0
567 ; CHECK-NEXT:    local.get $push35=, 5
568 ; CHECK-NEXT:    i64.load $push8=, 16($pop35)
569 ; CHECK-NEXT:    local.get $push36=, 5
570 ; CHECK-NEXT:    i64.load $push9=, 0($pop36)
571 ; CHECK-NEXT:    i64.or $push10=, $pop8, $pop9
572 ; CHECK-NEXT:    i64.store 0($pop37), $pop10
573 ; CHECK-NEXT:    local.get $push38=, 5
574 ; CHECK-NEXT:    i32.const $push13=, 32
575 ; CHECK-NEXT:    i32.add $push14=, $pop38, $pop13
576 ; CHECK-NEXT:    global.set __stack_pointer, $pop14
577 ; CHECK-NEXT:    return
578   %z = sub i128 128, %y
579   %b = shl i128 %x, %y
580   %c = lshr i128 %x, %z
581   %d = or i128 %b, %c
582   ret i128 %d
585 define i128 @masked_rotl(i128 %x, i128 %y) {
586 ; CHECK-LABEL: masked_rotl:
587 ; CHECK:         .functype masked_rotl (i32, i64, i64, i64, i64) -> ()
588 ; CHECK-NEXT:    .local i32, i32
589 ; CHECK-NEXT:  # %bb.0:
590 ; CHECK-NEXT:    global.get $push13=, __stack_pointer
591 ; CHECK-NEXT:    i32.const $push14=, 32
592 ; CHECK-NEXT:    i32.sub $push25=, $pop13, $pop14
593 ; CHECK-NEXT:    local.tee $push24=, 5, $pop25
594 ; CHECK-NEXT:    global.set __stack_pointer, $pop24
595 ; CHECK-NEXT:    local.get $push26=, 5
596 ; CHECK-NEXT:    i32.const $push19=, 16
597 ; CHECK-NEXT:    i32.add $push20=, $pop26, $pop19
598 ; CHECK-NEXT:    local.get $push29=, 1
599 ; CHECK-NEXT:    local.get $push28=, 2
600 ; CHECK-NEXT:    local.get $push27=, 3
601 ; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop27
602 ; CHECK-NEXT:    i32.const $push1=, 127
603 ; CHECK-NEXT:    i32.and $push23=, $pop0, $pop1
604 ; CHECK-NEXT:    local.tee $push22=, 6, $pop23
605 ; CHECK-NEXT:    call __ashlti3, $pop20, $pop29, $pop28, $pop22
606 ; CHECK-NEXT:    local.get $push33=, 5
607 ; CHECK-NEXT:    local.get $push32=, 1
608 ; CHECK-NEXT:    local.get $push31=, 2
609 ; CHECK-NEXT:    i32.const $push2=, 128
610 ; CHECK-NEXT:    local.get $push30=, 6
611 ; CHECK-NEXT:    i32.sub $push3=, $pop2, $pop30
612 ; CHECK-NEXT:    call __lshrti3, $pop33, $pop32, $pop31, $pop3
613 ; CHECK-NEXT:    local.get $push36=, 0
614 ; CHECK-NEXT:    local.get $push34=, 5
615 ; CHECK-NEXT:    i32.const $push17=, 16
616 ; CHECK-NEXT:    i32.add $push18=, $pop34, $pop17
617 ; CHECK-NEXT:    i32.const $push4=, 8
618 ; CHECK-NEXT:    i32.add $push5=, $pop18, $pop4
619 ; CHECK-NEXT:    i64.load $push6=, 0($pop5)
620 ; CHECK-NEXT:    local.get $push35=, 5
621 ; CHECK-NEXT:    i32.const $push21=, 8
622 ; CHECK-NEXT:    i32.add $push7=, $pop35, $pop21
623 ; CHECK-NEXT:    i64.load $push8=, 0($pop7)
624 ; CHECK-NEXT:    i64.or $push9=, $pop6, $pop8
625 ; CHECK-NEXT:    i64.store 8($pop36), $pop9
626 ; CHECK-NEXT:    local.get $push39=, 0
627 ; CHECK-NEXT:    local.get $push37=, 5
628 ; CHECK-NEXT:    i64.load $push10=, 16($pop37)
629 ; CHECK-NEXT:    local.get $push38=, 5
630 ; CHECK-NEXT:    i64.load $push11=, 0($pop38)
631 ; CHECK-NEXT:    i64.or $push12=, $pop10, $pop11
632 ; CHECK-NEXT:    i64.store 0($pop39), $pop12
633 ; CHECK-NEXT:    local.get $push40=, 5
634 ; CHECK-NEXT:    i32.const $push15=, 32
635 ; CHECK-NEXT:    i32.add $push16=, $pop40, $pop15
636 ; CHECK-NEXT:    global.set __stack_pointer, $pop16
637 ; CHECK-NEXT:    return
638   %a = and i128 %y, 127
639   %z = sub i128 128, %a
640   %b = shl i128 %x, %a
641   %c = lshr i128 %x, %z
642   %d = or i128 %b, %c
643   ret i128 %d
646 define i128 @rotr(i128 %x, i128 %y) {
647 ; CHECK-LABEL: rotr:
648 ; CHECK:         .functype rotr (i32, i64, i64, i64, i64) -> ()
649 ; CHECK-NEXT:    .local i32, i32
650 ; CHECK-NEXT:  # %bb.0:
651 ; CHECK-NEXT:    global.get $push11=, __stack_pointer
652 ; CHECK-NEXT:    i32.const $push12=, 32
653 ; CHECK-NEXT:    i32.sub $push23=, $pop11, $pop12
654 ; CHECK-NEXT:    local.tee $push22=, 5, $pop23
655 ; CHECK-NEXT:    global.set __stack_pointer, $pop22
656 ; CHECK-NEXT:    local.get $push24=, 5
657 ; CHECK-NEXT:    i32.const $push17=, 16
658 ; CHECK-NEXT:    i32.add $push18=, $pop24, $pop17
659 ; CHECK-NEXT:    local.get $push27=, 1
660 ; CHECK-NEXT:    local.get $push26=, 2
661 ; CHECK-NEXT:    local.get $push25=, 3
662 ; CHECK-NEXT:    i32.wrap_i64 $push21=, $pop25
663 ; CHECK-NEXT:    local.tee $push20=, 6, $pop21
664 ; CHECK-NEXT:    call __lshrti3, $pop18, $pop27, $pop26, $pop20
665 ; CHECK-NEXT:    local.get $push31=, 5
666 ; CHECK-NEXT:    local.get $push30=, 1
667 ; CHECK-NEXT:    local.get $push29=, 2
668 ; CHECK-NEXT:    i32.const $push0=, 128
669 ; CHECK-NEXT:    local.get $push28=, 6
670 ; CHECK-NEXT:    i32.sub $push1=, $pop0, $pop28
671 ; CHECK-NEXT:    call __ashlti3, $pop31, $pop30, $pop29, $pop1
672 ; CHECK-NEXT:    local.get $push34=, 0
673 ; CHECK-NEXT:    local.get $push32=, 5
674 ; CHECK-NEXT:    i32.const $push15=, 16
675 ; CHECK-NEXT:    i32.add $push16=, $pop32, $pop15
676 ; CHECK-NEXT:    i32.const $push2=, 8
677 ; CHECK-NEXT:    i32.add $push3=, $pop16, $pop2
678 ; CHECK-NEXT:    i64.load $push4=, 0($pop3)
679 ; CHECK-NEXT:    local.get $push33=, 5
680 ; CHECK-NEXT:    i32.const $push19=, 8
681 ; CHECK-NEXT:    i32.add $push5=, $pop33, $pop19
682 ; CHECK-NEXT:    i64.load $push6=, 0($pop5)
683 ; CHECK-NEXT:    i64.or $push7=, $pop4, $pop6
684 ; CHECK-NEXT:    i64.store 8($pop34), $pop7
685 ; CHECK-NEXT:    local.get $push37=, 0
686 ; CHECK-NEXT:    local.get $push35=, 5
687 ; CHECK-NEXT:    i64.load $push8=, 16($pop35)
688 ; CHECK-NEXT:    local.get $push36=, 5
689 ; CHECK-NEXT:    i64.load $push9=, 0($pop36)
690 ; CHECK-NEXT:    i64.or $push10=, $pop8, $pop9
691 ; CHECK-NEXT:    i64.store 0($pop37), $pop10
692 ; CHECK-NEXT:    local.get $push38=, 5
693 ; CHECK-NEXT:    i32.const $push13=, 32
694 ; CHECK-NEXT:    i32.add $push14=, $pop38, $pop13
695 ; CHECK-NEXT:    global.set __stack_pointer, $pop14
696 ; CHECK-NEXT:    return
697   %z = sub i128 128, %y
698   %b = lshr i128 %x, %y
699   %c = shl i128 %x, %z
700   %d = or i128 %b, %c
701   ret i128 %d
704 define i128 @masked_rotr(i128 %x, i128 %y) {
705 ; CHECK-LABEL: masked_rotr:
706 ; CHECK:         .functype masked_rotr (i32, i64, i64, i64, i64) -> ()
707 ; CHECK-NEXT:    .local i32, i32
708 ; CHECK-NEXT:  # %bb.0:
709 ; CHECK-NEXT:    global.get $push13=, __stack_pointer
710 ; CHECK-NEXT:    i32.const $push14=, 32
711 ; CHECK-NEXT:    i32.sub $push25=, $pop13, $pop14
712 ; CHECK-NEXT:    local.tee $push24=, 5, $pop25
713 ; CHECK-NEXT:    global.set __stack_pointer, $pop24
714 ; CHECK-NEXT:    local.get $push26=, 5
715 ; CHECK-NEXT:    i32.const $push19=, 16
716 ; CHECK-NEXT:    i32.add $push20=, $pop26, $pop19
717 ; CHECK-NEXT:    local.get $push29=, 1
718 ; CHECK-NEXT:    local.get $push28=, 2
719 ; CHECK-NEXT:    local.get $push27=, 3
720 ; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop27
721 ; CHECK-NEXT:    i32.const $push1=, 127
722 ; CHECK-NEXT:    i32.and $push23=, $pop0, $pop1
723 ; CHECK-NEXT:    local.tee $push22=, 6, $pop23
724 ; CHECK-NEXT:    call __lshrti3, $pop20, $pop29, $pop28, $pop22
725 ; CHECK-NEXT:    local.get $push33=, 5
726 ; CHECK-NEXT:    local.get $push32=, 1
727 ; CHECK-NEXT:    local.get $push31=, 2
728 ; CHECK-NEXT:    i32.const $push2=, 128
729 ; CHECK-NEXT:    local.get $push30=, 6
730 ; CHECK-NEXT:    i32.sub $push3=, $pop2, $pop30
731 ; CHECK-NEXT:    call __ashlti3, $pop33, $pop32, $pop31, $pop3
732 ; CHECK-NEXT:    local.get $push36=, 0
733 ; CHECK-NEXT:    local.get $push34=, 5
734 ; CHECK-NEXT:    i32.const $push17=, 16
735 ; CHECK-NEXT:    i32.add $push18=, $pop34, $pop17
736 ; CHECK-NEXT:    i32.const $push4=, 8
737 ; CHECK-NEXT:    i32.add $push5=, $pop18, $pop4
738 ; CHECK-NEXT:    i64.load $push6=, 0($pop5)
739 ; CHECK-NEXT:    local.get $push35=, 5
740 ; CHECK-NEXT:    i32.const $push21=, 8
741 ; CHECK-NEXT:    i32.add $push7=, $pop35, $pop21
742 ; CHECK-NEXT:    i64.load $push8=, 0($pop7)
743 ; CHECK-NEXT:    i64.or $push9=, $pop6, $pop8
744 ; CHECK-NEXT:    i64.store 8($pop36), $pop9
745 ; CHECK-NEXT:    local.get $push39=, 0
746 ; CHECK-NEXT:    local.get $push37=, 5
747 ; CHECK-NEXT:    i64.load $push10=, 16($pop37)
748 ; CHECK-NEXT:    local.get $push38=, 5
749 ; CHECK-NEXT:    i64.load $push11=, 0($pop38)
750 ; CHECK-NEXT:    i64.or $push12=, $pop10, $pop11
751 ; CHECK-NEXT:    i64.store 0($pop39), $pop12
752 ; CHECK-NEXT:    local.get $push40=, 5
753 ; CHECK-NEXT:    i32.const $push15=, 32
754 ; CHECK-NEXT:    i32.add $push16=, $pop40, $pop15
755 ; CHECK-NEXT:    global.set __stack_pointer, $pop16
756 ; CHECK-NEXT:    return
757   %a = and i128 %y, 127
758   %z = sub i128 128, %a
759   %b = lshr i128 %x, %a
760   %c = shl i128 %x, %z
761   %d = or i128 %b, %c
762   ret i128 %d