xref: /aosp_15_r20/external/llvm/test/CodeGen/WebAssembly/i128.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test that basic 128-bit integer operations assemble as expected.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
6*9880d681SAndroid Build Coastguard Workertarget triple = "wasm32-unknown-unknown"
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdeclare i128 @llvm.ctlz.i128(i128, i1)
9*9880d681SAndroid Build Coastguard Workerdeclare i128 @llvm.cttz.i128(i128, i1)
10*9880d681SAndroid Build Coastguard Workerdeclare i128 @llvm.ctpop.i128(i128)
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add128:
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
14*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:  .result
15*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.add
16*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
17*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.add
18*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return{{$}}
20*9880d681SAndroid Build Coastguard Workerdefine i128 @add128(i128 %x, i128 %y) {
21*9880d681SAndroid Build Coastguard Worker  %a = add i128 %x, %y
22*9880d681SAndroid Build Coastguard Worker  ret i128 %a
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub128:
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
27*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
28*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.sub
29*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
30*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.sub
31*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return{{$}}
33*9880d681SAndroid Build Coastguard Workerdefine i128 @sub128(i128 %x, i128 %y) {
34*9880d681SAndroid Build Coastguard Worker  %a = sub i128 %x, %y
35*9880d681SAndroid Build Coastguard Worker  ret i128 %a
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mul128:
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
40*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
41*9880d681SAndroid Build Coastguard Worker; CHECK: call __multi3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
42*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
43*9880d681SAndroid Build Coastguard Workerdefine i128 @mul128(i128 %x, i128 %y) {
44*9880d681SAndroid Build Coastguard Worker  %a = mul i128 %x, %y
45*9880d681SAndroid Build Coastguard Worker  ret i128 %a
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sdiv128:
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
50*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
51*9880d681SAndroid Build Coastguard Worker; CHECK: call __divti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
52*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
53*9880d681SAndroid Build Coastguard Workerdefine i128 @sdiv128(i128 %x, i128 %y) {
54*9880d681SAndroid Build Coastguard Worker  %a = sdiv i128 %x, %y
55*9880d681SAndroid Build Coastguard Worker  ret i128 %a
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: udiv128:
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
60*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
61*9880d681SAndroid Build Coastguard Worker; CHECK: call __udivti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
62*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
63*9880d681SAndroid Build Coastguard Workerdefine i128 @udiv128(i128 %x, i128 %y) {
64*9880d681SAndroid Build Coastguard Worker  %a = udiv i128 %x, %y
65*9880d681SAndroid Build Coastguard Worker  ret i128 %a
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: srem128:
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
70*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
71*9880d681SAndroid Build Coastguard Worker; CHECK: call __modti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
72*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
73*9880d681SAndroid Build Coastguard Workerdefine i128 @srem128(i128 %x, i128 %y) {
74*9880d681SAndroid Build Coastguard Worker  %a = srem i128 %x, %y
75*9880d681SAndroid Build Coastguard Worker  ret i128 %a
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: urem128:
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
80*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
81*9880d681SAndroid Build Coastguard Worker; CHECK: call __umodti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
82*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
83*9880d681SAndroid Build Coastguard Workerdefine i128 @urem128(i128 %x, i128 %y) {
84*9880d681SAndroid Build Coastguard Worker  %a = urem i128 %x, %y
85*9880d681SAndroid Build Coastguard Worker  ret i128 %a
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and128:
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
90*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:  .result
91*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.and
92*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
93*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.and
94*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return{{$}}
96*9880d681SAndroid Build Coastguard Workerdefine i128 @and128(i128 %x, i128 %y) {
97*9880d681SAndroid Build Coastguard Worker  %a = and i128 %x, %y
98*9880d681SAndroid Build Coastguard Worker  ret i128 %a
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or128:
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
103*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
104*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.or
105*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
106*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.or
107*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return{{$}}
109*9880d681SAndroid Build Coastguard Workerdefine i128 @or128(i128 %x, i128 %y) {
110*9880d681SAndroid Build Coastguard Worker  %a = or i128 %x, %y
111*9880d681SAndroid Build Coastguard Worker  ret i128 %a
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor128:
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
116*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
117*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.xor
118*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
119*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.xor
120*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.store
121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return{{$}}
122*9880d681SAndroid Build Coastguard Workerdefine i128 @xor128(i128 %x, i128 %y) {
123*9880d681SAndroid Build Coastguard Worker  %a = xor i128 %x, %y
124*9880d681SAndroid Build Coastguard Worker  ret i128 %a
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl128:
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
129*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
130*9880d681SAndroid Build Coastguard Worker; CHECK: call __ashlti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
131*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
132*9880d681SAndroid Build Coastguard Workerdefine i128 @shl128(i128 %x, i128 %y) {
133*9880d681SAndroid Build Coastguard Worker  %a = shl i128 %x, %y
134*9880d681SAndroid Build Coastguard Worker  ret i128 %a
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr128:
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
139*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
140*9880d681SAndroid Build Coastguard Worker; CHECK: call __lshrti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
141*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
142*9880d681SAndroid Build Coastguard Workerdefine i128 @shr128(i128 %x, i128 %y) {
143*9880d681SAndroid Build Coastguard Worker  %a = lshr i128 %x, %y
144*9880d681SAndroid Build Coastguard Worker  ret i128 %a
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sar128:
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
149*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
150*9880d681SAndroid Build Coastguard Worker; CHECK: call __ashrti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
151*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
152*9880d681SAndroid Build Coastguard Workerdefine i128 @sar128(i128 %x, i128 %y) {
153*9880d681SAndroid Build Coastguard Worker  %a = ashr i128 %x, %y
154*9880d681SAndroid Build Coastguard Worker  ret i128 %a
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz128:
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64{{$}}
159*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:  .result
160*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.clz
161*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.clz
162*9880d681SAndroid Build Coastguard Worker; CHECK:      return{{$}}
163*9880d681SAndroid Build Coastguard Workerdefine i128 @clz128(i128 %x) {
164*9880d681SAndroid Build Coastguard Worker  %a = call i128 @llvm.ctlz.i128(i128 %x, i1 false)
165*9880d681SAndroid Build Coastguard Worker  ret i128 %a
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz128_zero_undef:
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64{{$}}
170*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
171*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.clz
172*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.clz
173*9880d681SAndroid Build Coastguard Worker; CHECK:      return{{$}}
174*9880d681SAndroid Build Coastguard Workerdefine i128 @clz128_zero_undef(i128 %x) {
175*9880d681SAndroid Build Coastguard Worker  %a = call i128 @llvm.ctlz.i128(i128 %x, i1 true)
176*9880d681SAndroid Build Coastguard Worker  ret i128 %a
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ctz128:
180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64{{$}}
181*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
182*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.ctz
183*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.ctz
184*9880d681SAndroid Build Coastguard Worker; CHECK:      return{{$}}
185*9880d681SAndroid Build Coastguard Workerdefine i128 @ctz128(i128 %x) {
186*9880d681SAndroid Build Coastguard Worker  %a = call i128 @llvm.cttz.i128(i128 %x, i1 false)
187*9880d681SAndroid Build Coastguard Worker  ret i128 %a
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ctz128_zero_undef:
191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64{{$}}
192*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
193*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.ctz
194*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.ctz
195*9880d681SAndroid Build Coastguard Worker; CHECK:      return{{$}}
196*9880d681SAndroid Build Coastguard Workerdefine i128 @ctz128_zero_undef(i128 %x) {
197*9880d681SAndroid Build Coastguard Worker  %a = call i128 @llvm.cttz.i128(i128 %x, i1 true)
198*9880d681SAndroid Build Coastguard Worker  ret i128 %a
199*9880d681SAndroid Build Coastguard Worker}
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: popcnt128:
202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64{{$}}
203*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
204*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.popcnt
205*9880d681SAndroid Build Coastguard Worker; CHECK:      i64.popcnt
206*9880d681SAndroid Build Coastguard Worker; CHECK:      return{{$}}
207*9880d681SAndroid Build Coastguard Workerdefine i128 @popcnt128(i128 %x) {
208*9880d681SAndroid Build Coastguard Worker  %a = call i128 @llvm.ctpop.i128(i128 %x)
209*9880d681SAndroid Build Coastguard Worker  ret i128 %a
210*9880d681SAndroid Build Coastguard Worker}
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: eqz128:
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}}
214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}}
215*9880d681SAndroid Build Coastguard Worker; CHECK:     i64.or
216*9880d681SAndroid Build Coastguard Worker; CHECK:     i64.eqz
217*9880d681SAndroid Build Coastguard Worker; CHECK:     return $
218*9880d681SAndroid Build Coastguard Workerdefine i32 @eqz128(i128 %x) {
219*9880d681SAndroid Build Coastguard Worker  %a = icmp eq i128 %x, 0
220*9880d681SAndroid Build Coastguard Worker  %b = zext i1 %a to i32
221*9880d681SAndroid Build Coastguard Worker  ret i32 %b
222*9880d681SAndroid Build Coastguard Worker}
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rotl:
225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
226*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
227*9880d681SAndroid Build Coastguard Worker; CHECK: call __ashlti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
228*9880d681SAndroid Build Coastguard Worker; CHECK: call __lshrti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
229*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
230*9880d681SAndroid Build Coastguard Workerdefine i128 @rotl(i128 %x, i128 %y) {
231*9880d681SAndroid Build Coastguard Worker  %z = sub i128 128, %y
232*9880d681SAndroid Build Coastguard Worker  %b = shl i128 %x, %y
233*9880d681SAndroid Build Coastguard Worker  %c = lshr i128 %x, %z
234*9880d681SAndroid Build Coastguard Worker  %d = or i128 %b, %c
235*9880d681SAndroid Build Coastguard Worker  ret i128 %d
236*9880d681SAndroid Build Coastguard Worker}
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: masked_rotl:
239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
240*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
241*9880d681SAndroid Build Coastguard Worker; CHECK: call __ashlti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
242*9880d681SAndroid Build Coastguard Worker; CHECK: call __lshrti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
243*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
244*9880d681SAndroid Build Coastguard Workerdefine i128 @masked_rotl(i128 %x, i128 %y) {
245*9880d681SAndroid Build Coastguard Worker  %a = and i128 %y, 127
246*9880d681SAndroid Build Coastguard Worker  %z = sub i128 128, %a
247*9880d681SAndroid Build Coastguard Worker  %b = shl i128 %x, %a
248*9880d681SAndroid Build Coastguard Worker  %c = lshr i128 %x, %z
249*9880d681SAndroid Build Coastguard Worker  %d = or i128 %b, %c
250*9880d681SAndroid Build Coastguard Worker  ret i128 %d
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rotr:
254*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
255*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
256*9880d681SAndroid Build Coastguard Worker; CHECK: call __lshrti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
257*9880d681SAndroid Build Coastguard Worker; CHECK: call __ashlti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
258*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
259*9880d681SAndroid Build Coastguard Workerdefine i128 @rotr(i128 %x, i128 %y) {
260*9880d681SAndroid Build Coastguard Worker  %z = sub i128 128, %y
261*9880d681SAndroid Build Coastguard Worker  %b = lshr i128 %x, %y
262*9880d681SAndroid Build Coastguard Worker  %c = shl i128 %x, %z
263*9880d681SAndroid Build Coastguard Worker  %d = or i128 %b, %c
264*9880d681SAndroid Build Coastguard Worker  ret i128 %d
265*9880d681SAndroid Build Coastguard Worker}
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: masked_rotr:
268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i64, i64, i64, i64{{$}}
269*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .result
270*9880d681SAndroid Build Coastguard Worker; CHECK: call __lshrti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
271*9880d681SAndroid Build Coastguard Worker; CHECK: call __ashlti3@FUNCTION, ${{.+}}, ${{.+}}, ${{.+}}, ${{.+}}{{$}}
272*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
273*9880d681SAndroid Build Coastguard Workerdefine i128 @masked_rotr(i128 %x, i128 %y) {
274*9880d681SAndroid Build Coastguard Worker  %a = and i128 %y, 127
275*9880d681SAndroid Build Coastguard Worker  %z = sub i128 128, %a
276*9880d681SAndroid Build Coastguard Worker  %b = lshr i128 %x, %a
277*9880d681SAndroid Build Coastguard Worker  %c = shl i128 %x, %z
278*9880d681SAndroid Build Coastguard Worker  %d = or i128 %b, %c
279*9880d681SAndroid Build Coastguard Worker  ret i128 %d
280*9880d681SAndroid Build Coastguard Worker}
281