xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-scvt.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -mcpu=cyclone -aarch64-neon-syntax=apple | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -mcpu=cortex-a57 | FileCheck --check-prefix=CHECK-A57 %s
3*9880d681SAndroid Build Coastguard Worker; rdar://13082402
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine float @t1(i32* nocapture %src) nounwind ssp {
6*9880d681SAndroid Build Coastguard Workerentry:
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1:
8*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s0, [x0]
9*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf s0, s0
10*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %src, align 4
11*9880d681SAndroid Build Coastguard Worker  %tmp2 = sitofp i32 %tmp1 to float
12*9880d681SAndroid Build Coastguard Worker  ret float %tmp2
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdefine float @t2(i32* nocapture %src) nounwind ssp {
16*9880d681SAndroid Build Coastguard Workerentry:
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2:
18*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s0, [x0]
19*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf s0, s0
20*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %src, align 4
21*9880d681SAndroid Build Coastguard Worker  %tmp2 = uitofp i32 %tmp1 to float
22*9880d681SAndroid Build Coastguard Worker  ret float %tmp2
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine double @t3(i64* nocapture %src) nounwind ssp {
26*9880d681SAndroid Build Coastguard Workerentry:
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3:
28*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d0, [x0]
29*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf d0, d0
30*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i64, i64* %src, align 4
31*9880d681SAndroid Build Coastguard Worker  %tmp2 = sitofp i64 %tmp1 to double
32*9880d681SAndroid Build Coastguard Worker  ret double %tmp2
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine double @t4(i64* nocapture %src) nounwind ssp {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4:
38*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d0, [x0]
39*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf d0, d0
40*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i64, i64* %src, align 4
41*9880d681SAndroid Build Coastguard Worker  %tmp2 = uitofp i64 %tmp1 to double
42*9880d681SAndroid Build Coastguard Worker  ret double %tmp2
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; rdar://13136456
46*9880d681SAndroid Build Coastguard Workerdefine double @t5(i32* nocapture %src) nounwind ssp optsize {
47*9880d681SAndroid Build Coastguard Workerentry:
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5:
49*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[REG:w[0-9]+]], [x0]
50*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf d0, [[REG]]
51*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %src, align 4
52*9880d681SAndroid Build Coastguard Worker  %tmp2 = sitofp i32 %tmp1 to double
53*9880d681SAndroid Build Coastguard Worker  ret double %tmp2
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; Check that we load in FP register when we want to convert into
57*9880d681SAndroid Build Coastguard Worker; floating point value.
58*9880d681SAndroid Build Coastguard Worker; This is much faster than loading on GPR and making the conversion
59*9880d681SAndroid Build Coastguard Worker; GPR -> FPR.
60*9880d681SAndroid Build Coastguard Worker; <rdar://problem/14599607>
61*9880d681SAndroid Build Coastguard Worker;
62*9880d681SAndroid Build Coastguard Worker; Check the flollowing patterns for signed/unsigned:
63*9880d681SAndroid Build Coastguard Worker; 1. load with scaled imm to float.
64*9880d681SAndroid Build Coastguard Worker; 2. load with scaled register to float.
65*9880d681SAndroid Build Coastguard Worker; 3. load with scaled imm to double.
66*9880d681SAndroid Build Coastguard Worker; 4. load with scaled register to double.
67*9880d681SAndroid Build Coastguard Worker; 5. load with unscaled imm to float.
68*9880d681SAndroid Build Coastguard Worker; 6. load with unscaled imm to double.
69*9880d681SAndroid Build Coastguard Worker; With loading size: 8, 16, 32, and 64-bits.
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; ********* 1. load with scaled imm to float. *********
72*9880d681SAndroid Build Coastguard Workerdefine float @fct1(i8* nocapture %sp0) {
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1:
74*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, #1]
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
77*9880d681SAndroid Build Coastguard Workerentry:
78*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 1
79*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
80*9880d681SAndroid Build Coastguard Worker  %val = uitofp i8 %pix_sp0.0.copyload to float
81*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
82*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine float @fct2(i16* nocapture %sp0) {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2:
87*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2]
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 1
92*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
93*9880d681SAndroid Build Coastguard Worker  %val = uitofp i16 %pix_sp0.0.copyload to float
94*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
95*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine float @fct3(i32* nocapture %sp0) {
99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct3:
100*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4]
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
103*9880d681SAndroid Build Coastguard Workerentry:
104*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 1
105*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
106*9880d681SAndroid Build Coastguard Worker  %val = uitofp i32 %pix_sp0.0.copyload to float
107*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
108*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit.
112*9880d681SAndroid Build Coastguard Workerdefine float @fct4(i64* nocapture %sp0) {
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct4:
114*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REGNUM:[0-9]+]], [x0, #8]
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], x[[REGNUM]]
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
117*9880d681SAndroid Build Coastguard Workerentry:
118*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 1
119*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
120*9880d681SAndroid Build Coastguard Worker  %val = uitofp i64 %pix_sp0.0.copyload to float
121*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
122*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; ********* 2. load with scaled register to float. *********
126*9880d681SAndroid Build Coastguard Workerdefine float @fct5(i8* nocapture %sp0, i64 %offset) {
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct5:
128*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, x1]
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
131*9880d681SAndroid Build Coastguard Workerentry:
132*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 %offset
133*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
134*9880d681SAndroid Build Coastguard Worker  %val = uitofp i8 %pix_sp0.0.copyload to float
135*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
136*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine float @fct6(i16* nocapture %sp0, i64 %offset) {
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct6:
141*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1]
142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
144*9880d681SAndroid Build Coastguard Workerentry:
145*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 %offset
146*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
147*9880d681SAndroid Build Coastguard Worker  %val = uitofp i16 %pix_sp0.0.copyload to float
148*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
149*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine float @fct7(i32* nocapture %sp0, i64 %offset) {
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct7:
154*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2]
155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
157*9880d681SAndroid Build Coastguard Workerentry:
158*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 %offset
159*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
160*9880d681SAndroid Build Coastguard Worker  %val = uitofp i32 %pix_sp0.0.copyload to float
161*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
162*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit.
166*9880d681SAndroid Build Coastguard Workerdefine float @fct8(i64* nocapture %sp0, i64 %offset) {
167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct8:
168*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REGNUM:[0-9]+]], [x0, x1, lsl #3]
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], x[[REGNUM]]
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
171*9880d681SAndroid Build Coastguard Workerentry:
172*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 %offset
173*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
174*9880d681SAndroid Build Coastguard Worker  %val = uitofp i64 %pix_sp0.0.copyload to float
175*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
176*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker; ********* 3. load with scaled imm to double. *********
181*9880d681SAndroid Build Coastguard Workerdefine double @fct9(i8* nocapture %sp0) {
182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct9:
183*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, #1]
184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
186*9880d681SAndroid Build Coastguard Workerentry:
187*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 1
188*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
189*9880d681SAndroid Build Coastguard Worker  %val = uitofp i8 %pix_sp0.0.copyload to double
190*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
191*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine double @fct10(i16* nocapture %sp0) {
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct10:
196*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2]
197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
199*9880d681SAndroid Build Coastguard Workerentry:
200*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 1
201*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
202*9880d681SAndroid Build Coastguard Worker  %val = uitofp i16 %pix_sp0.0.copyload to double
203*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
204*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdefine double @fct11(i32* nocapture %sp0) {
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct11:
209*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4]
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
212*9880d681SAndroid Build Coastguard Workerentry:
213*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 1
214*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
215*9880d681SAndroid Build Coastguard Worker  %val = uitofp i32 %pix_sp0.0.copyload to double
216*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
217*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
218*9880d681SAndroid Build Coastguard Worker}
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Workerdefine double @fct12(i64* nocapture %sp0) {
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct12:
222*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, #8]
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
225*9880d681SAndroid Build Coastguard Workerentry:
226*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 1
227*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
228*9880d681SAndroid Build Coastguard Worker  %val = uitofp i64 %pix_sp0.0.copyload to double
229*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
230*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
231*9880d681SAndroid Build Coastguard Worker}
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Worker; ********* 4. load with scaled register to double. *********
234*9880d681SAndroid Build Coastguard Workerdefine double @fct13(i8* nocapture %sp0, i64 %offset) {
235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct13:
236*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, x1]
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
239*9880d681SAndroid Build Coastguard Workerentry:
240*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 %offset
241*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
242*9880d681SAndroid Build Coastguard Worker  %val = uitofp i8 %pix_sp0.0.copyload to double
243*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
244*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Workerdefine double @fct14(i16* nocapture %sp0, i64 %offset) {
248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct14:
249*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1]
250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
252*9880d681SAndroid Build Coastguard Workerentry:
253*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 %offset
254*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
255*9880d681SAndroid Build Coastguard Worker  %val = uitofp i16 %pix_sp0.0.copyload to double
256*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
257*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
258*9880d681SAndroid Build Coastguard Worker}
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Workerdefine double @fct15(i32* nocapture %sp0, i64 %offset) {
261*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct15:
262*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2]
263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
265*9880d681SAndroid Build Coastguard Workerentry:
266*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 %offset
267*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
268*9880d681SAndroid Build Coastguard Worker  %val = uitofp i32 %pix_sp0.0.copyload to double
269*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
270*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
271*9880d681SAndroid Build Coastguard Worker}
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Workerdefine double @fct16(i64* nocapture %sp0, i64 %offset) {
274*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct16:
275*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, x1, lsl #3]
276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
278*9880d681SAndroid Build Coastguard Workerentry:
279*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 %offset
280*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
281*9880d681SAndroid Build Coastguard Worker  %val = uitofp i64 %pix_sp0.0.copyload to double
282*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
283*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker; ********* 5. load with unscaled imm to float. *********
287*9880d681SAndroid Build Coastguard Workerdefine float @fct17(i8* nocapture %sp0) {
288*9880d681SAndroid Build Coastguard Workerentry:
289*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct17:
290*9880d681SAndroid Build Coastguard Worker; CHECK: ldur b[[REGNUM:[0-9]+]], [x0, #-1]
291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
293*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i8* %sp0 to i64
294*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, -1
295*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i8*
296*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
297*9880d681SAndroid Build Coastguard Worker  %val = uitofp i8 %pix_sp0.0.copyload to float
298*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
299*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
300*9880d681SAndroid Build Coastguard Worker}
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Workerdefine float @fct18(i16* nocapture %sp0) {
303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct18:
304*9880d681SAndroid Build Coastguard Worker; CHECK: ldur h[[REGNUM:[0-9]+]], [x0, #1]
305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
307*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i16* %sp0 to i64
308*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
309*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i16*
310*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
311*9880d681SAndroid Build Coastguard Worker  %val = uitofp i16 %pix_sp0.0.copyload to float
312*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
313*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
314*9880d681SAndroid Build Coastguard Worker}
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Workerdefine float @fct19(i32* nocapture %sp0) {
317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct19:
318*9880d681SAndroid Build Coastguard Worker; CHECK: ldur s[[REGNUM:[0-9]+]], [x0, #1]
319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]]
320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
321*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i32* %sp0 to i64
322*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
323*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i32*
324*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
325*9880d681SAndroid Build Coastguard Worker  %val = uitofp i32 %pix_sp0.0.copyload to float
326*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
327*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
328*9880d681SAndroid Build Coastguard Worker}
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit.
331*9880d681SAndroid Build Coastguard Workerdefine float @fct20(i64* nocapture %sp0) {
332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct20:
333*9880d681SAndroid Build Coastguard Worker; CHECK: ldur x[[REGNUM:[0-9]+]], [x0, #1]
334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], x[[REGNUM]]
335*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
336*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i64* %sp0 to i64
337*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
338*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i64*
339*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
340*9880d681SAndroid Build Coastguard Worker  %val = uitofp i64 %pix_sp0.0.copyload to float
341*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
342*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker}
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker; ********* 6. load with unscaled imm to double. *********
347*9880d681SAndroid Build Coastguard Workerdefine double @fct21(i8* nocapture %sp0) {
348*9880d681SAndroid Build Coastguard Workerentry:
349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct21:
350*9880d681SAndroid Build Coastguard Worker; CHECK: ldur b[[REGNUM:[0-9]+]], [x0, #-1]
351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
353*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i8* %sp0 to i64
354*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, -1
355*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i8*
356*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
357*9880d681SAndroid Build Coastguard Worker  %val = uitofp i8 %pix_sp0.0.copyload to double
358*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
359*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerdefine double @fct22(i16* nocapture %sp0) {
363*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct22:
364*9880d681SAndroid Build Coastguard Worker; CHECK: ldur h[[REGNUM:[0-9]+]], [x0, #1]
365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
367*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i16* %sp0 to i64
368*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
369*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i16*
370*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
371*9880d681SAndroid Build Coastguard Worker  %val = uitofp i16 %pix_sp0.0.copyload to double
372*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
373*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
374*9880d681SAndroid Build Coastguard Worker}
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Workerdefine double @fct23(i32* nocapture %sp0) {
377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct23:
378*9880d681SAndroid Build Coastguard Worker; CHECK: ldur s[[REGNUM:[0-9]+]], [x0, #1]
379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
381*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i32* %sp0 to i64
382*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
383*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i32*
384*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
385*9880d681SAndroid Build Coastguard Worker  %val = uitofp i32 %pix_sp0.0.copyload to double
386*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
387*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
388*9880d681SAndroid Build Coastguard Worker}
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Workerdefine double @fct24(i64* nocapture %sp0) {
391*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct24:
392*9880d681SAndroid Build Coastguard Worker; CHECK: ldur d[[REGNUM:[0-9]+]], [x0, #1]
393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]]
394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
395*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i64* %sp0 to i64
396*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
397*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i64*
398*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
399*9880d681SAndroid Build Coastguard Worker  %val = uitofp i64 %pix_sp0.0.copyload to double
400*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
401*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker}
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Worker; ********* 1s. load with scaled imm to float. *********
406*9880d681SAndroid Build Coastguard Workerdefine float @sfct1(i8* nocapture %sp0) {
407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct1:
408*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, #1]
409*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0
410*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0
411*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
413*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct1:
414*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldrsb w[[REGNUM:[0-9]+]], [x0, #1]
415*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:s[0-9]+]], w[[REGNUM]]
416*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul s0, [[REG]], [[REG]]
417*9880d681SAndroid Build Coastguard Workerentry:
418*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 1
419*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
420*9880d681SAndroid Build Coastguard Worker  %val = sitofp i8 %pix_sp0.0.copyload to float
421*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
422*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
423*9880d681SAndroid Build Coastguard Worker}
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Workerdefine float @sfct2(i16* nocapture %sp0) {
426*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct2:
427*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2]
428*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0
429*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
430*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
431*9880d681SAndroid Build Coastguard Workerentry:
432*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 1
433*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
434*9880d681SAndroid Build Coastguard Worker  %val = sitofp i16 %pix_sp0.0.copyload to float
435*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
436*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
437*9880d681SAndroid Build Coastguard Worker}
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Workerdefine float @sfct3(i32* nocapture %sp0) {
440*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct3:
441*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4]
442*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
444*9880d681SAndroid Build Coastguard Workerentry:
445*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 1
446*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
447*9880d681SAndroid Build Coastguard Worker  %val = sitofp i32 %pix_sp0.0.copyload to float
448*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
449*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
450*9880d681SAndroid Build Coastguard Worker}
451*9880d681SAndroid Build Coastguard Worker
452*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit.
453*9880d681SAndroid Build Coastguard Workerdefine float @sfct4(i64* nocapture %sp0) {
454*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct4:
455*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REGNUM:[0-9]+]], [x0, #8]
456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], x[[REGNUM]]
457*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
458*9880d681SAndroid Build Coastguard Workerentry:
459*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 1
460*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
461*9880d681SAndroid Build Coastguard Worker  %val = sitofp i64 %pix_sp0.0.copyload to float
462*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
463*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
464*9880d681SAndroid Build Coastguard Worker}
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker; ********* 2s. load with scaled register to float. *********
467*9880d681SAndroid Build Coastguard Workerdefine float @sfct5(i8* nocapture %sp0, i64 %offset) {
468*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct5:
469*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, x1]
470*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0
471*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0
472*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
473*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
474*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct5:
475*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldrsb w[[REGNUM:[0-9]+]], [x0, x1]
476*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:s[0-9]+]], w[[REGNUM]]
477*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul s0, [[REG]], [[REG]]
478*9880d681SAndroid Build Coastguard Workerentry:
479*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 %offset
480*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
481*9880d681SAndroid Build Coastguard Worker  %val = sitofp i8 %pix_sp0.0.copyload to float
482*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
483*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
484*9880d681SAndroid Build Coastguard Worker}
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Workerdefine float @sfct6(i16* nocapture %sp0, i64 %offset) {
487*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct6:
488*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1]
489*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0
490*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
491*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
492*9880d681SAndroid Build Coastguard Workerentry:
493*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 %offset
494*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
495*9880d681SAndroid Build Coastguard Worker  %val = sitofp i16 %pix_sp0.0.copyload to float
496*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
497*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
498*9880d681SAndroid Build Coastguard Worker}
499*9880d681SAndroid Build Coastguard Worker
500*9880d681SAndroid Build Coastguard Workerdefine float @sfct7(i32* nocapture %sp0, i64 %offset) {
501*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct7:
502*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2]
503*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
504*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
505*9880d681SAndroid Build Coastguard Workerentry:
506*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 %offset
507*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
508*9880d681SAndroid Build Coastguard Worker  %val = sitofp i32 %pix_sp0.0.copyload to float
509*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
510*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
511*9880d681SAndroid Build Coastguard Worker}
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit.
514*9880d681SAndroid Build Coastguard Workerdefine float @sfct8(i64* nocapture %sp0, i64 %offset) {
515*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct8:
516*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REGNUM:[0-9]+]], [x0, x1, lsl #3]
517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], x[[REGNUM]]
518*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
519*9880d681SAndroid Build Coastguard Workerentry:
520*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 %offset
521*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
522*9880d681SAndroid Build Coastguard Worker  %val = sitofp i64 %pix_sp0.0.copyload to float
523*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
524*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
525*9880d681SAndroid Build Coastguard Worker}
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker; ********* 3s. load with scaled imm to double. *********
528*9880d681SAndroid Build Coastguard Workerdefine double @sfct9(i8* nocapture %sp0) {
529*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct9:
530*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb w[[REGNUM:[0-9]+]], [x0, #1]
531*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]]
532*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
533*9880d681SAndroid Build Coastguard Workerentry:
534*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 1
535*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
536*9880d681SAndroid Build Coastguard Worker  %val = sitofp i8 %pix_sp0.0.copyload to double
537*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
538*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
539*9880d681SAndroid Build Coastguard Worker}
540*9880d681SAndroid Build Coastguard Worker
541*9880d681SAndroid Build Coastguard Workerdefine double @sfct10(i16* nocapture %sp0) {
542*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct10:
543*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2]
544*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0
545*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0
546*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
547*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
548*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct10:
549*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldrsh w[[REGNUM:[0-9]+]], [x0, #2]
550*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]]
551*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul d0, [[REG]], [[REG]]
552*9880d681SAndroid Build Coastguard Workerentry:
553*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 1
554*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
555*9880d681SAndroid Build Coastguard Worker  %val = sitofp i16 %pix_sp0.0.copyload to double
556*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
557*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
558*9880d681SAndroid Build Coastguard Worker}
559*9880d681SAndroid Build Coastguard Worker
560*9880d681SAndroid Build Coastguard Workerdefine double @sfct11(i32* nocapture %sp0) {
561*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct11:
562*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4]
563*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0
564*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
565*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
566*9880d681SAndroid Build Coastguard Workerentry:
567*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 1
568*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
569*9880d681SAndroid Build Coastguard Worker  %val = sitofp i32 %pix_sp0.0.copyload to double
570*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
571*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
572*9880d681SAndroid Build Coastguard Worker}
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Workerdefine double @sfct12(i64* nocapture %sp0) {
575*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct12:
576*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, #8]
577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
578*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
579*9880d681SAndroid Build Coastguard Workerentry:
580*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 1
581*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
582*9880d681SAndroid Build Coastguard Worker  %val = sitofp i64 %pix_sp0.0.copyload to double
583*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
584*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
585*9880d681SAndroid Build Coastguard Worker}
586*9880d681SAndroid Build Coastguard Worker
587*9880d681SAndroid Build Coastguard Worker; ********* 4s. load with scaled register to double. *********
588*9880d681SAndroid Build Coastguard Workerdefine double @sfct13(i8* nocapture %sp0, i64 %offset) {
589*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct13:
590*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb w[[REGNUM:[0-9]+]], [x0, x1]
591*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]]
592*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
593*9880d681SAndroid Build Coastguard Workerentry:
594*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i8, i8* %sp0, i64 %offset
595*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
596*9880d681SAndroid Build Coastguard Worker  %val = sitofp i8 %pix_sp0.0.copyload to double
597*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
598*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
599*9880d681SAndroid Build Coastguard Worker}
600*9880d681SAndroid Build Coastguard Worker
601*9880d681SAndroid Build Coastguard Workerdefine double @sfct14(i16* nocapture %sp0, i64 %offset) {
602*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct14:
603*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1]
604*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0
605*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0
606*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
607*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
608*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct14:
609*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldrsh w[[REGNUM:[0-9]+]], [x0, x1, lsl #1]
610*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]]
611*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul d0, [[REG]], [[REG]]
612*9880d681SAndroid Build Coastguard Workerentry:
613*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i16, i16* %sp0, i64 %offset
614*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
615*9880d681SAndroid Build Coastguard Worker  %val = sitofp i16 %pix_sp0.0.copyload to double
616*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
617*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
618*9880d681SAndroid Build Coastguard Worker}
619*9880d681SAndroid Build Coastguard Worker
620*9880d681SAndroid Build Coastguard Workerdefine double @sfct15(i32* nocapture %sp0, i64 %offset) {
621*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct15:
622*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2]
623*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0
624*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
625*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
626*9880d681SAndroid Build Coastguard Workerentry:
627*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 %offset
628*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
629*9880d681SAndroid Build Coastguard Worker  %val = sitofp i32 %pix_sp0.0.copyload to double
630*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
631*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
632*9880d681SAndroid Build Coastguard Worker}
633*9880d681SAndroid Build Coastguard Worker
634*9880d681SAndroid Build Coastguard Workerdefine double @sfct16(i64* nocapture %sp0, i64 %offset) {
635*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct16:
636*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, x1, lsl #3]
637*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
638*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
639*9880d681SAndroid Build Coastguard Workerentry:
640*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i64, i64* %sp0, i64 %offset
641*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
642*9880d681SAndroid Build Coastguard Worker  %val = sitofp i64 %pix_sp0.0.copyload to double
643*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
644*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
645*9880d681SAndroid Build Coastguard Worker}
646*9880d681SAndroid Build Coastguard Worker
647*9880d681SAndroid Build Coastguard Worker; ********* 5s. load with unscaled imm to float. *********
648*9880d681SAndroid Build Coastguard Workerdefine float @sfct17(i8* nocapture %sp0) {
649*9880d681SAndroid Build Coastguard Workerentry:
650*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct17:
651*9880d681SAndroid Build Coastguard Worker; CHECK: ldur b[[REGNUM:[0-9]+]], [x0, #-1]
652*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0
653*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0
654*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
655*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
656*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct17:
657*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldursb w[[REGNUM:[0-9]+]], [x0, #-1]
658*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:s[0-9]+]], w[[REGNUM]]
659*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul s0, [[REG]], [[REG]]
660*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i8* %sp0 to i64
661*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, -1
662*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i8*
663*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
664*9880d681SAndroid Build Coastguard Worker  %val = sitofp i8 %pix_sp0.0.copyload to float
665*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
666*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
667*9880d681SAndroid Build Coastguard Worker}
668*9880d681SAndroid Build Coastguard Worker
669*9880d681SAndroid Build Coastguard Workerdefine float @sfct18(i16* nocapture %sp0) {
670*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct18:
671*9880d681SAndroid Build Coastguard Worker; CHECK: ldur h[[REGNUM:[0-9]+]], [x0, #1]
672*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0
673*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
674*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
675*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i16* %sp0 to i64
676*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
677*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i16*
678*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
679*9880d681SAndroid Build Coastguard Worker  %val = sitofp i16 %pix_sp0.0.copyload to float
680*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
681*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
682*9880d681SAndroid Build Coastguard Worker}
683*9880d681SAndroid Build Coastguard Worker
684*9880d681SAndroid Build Coastguard Workerdefine float @sfct19(i32* nocapture %sp0) {
685*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct19:
686*9880d681SAndroid Build Coastguard Worker; CHECK: ldur s[[REGNUM:[0-9]+]], [x0, #1]
687*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], s[[SEXTREG]]
688*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
689*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i32* %sp0 to i64
690*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
691*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i32*
692*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
693*9880d681SAndroid Build Coastguard Worker  %val = sitofp i32 %pix_sp0.0.copyload to float
694*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
695*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
696*9880d681SAndroid Build Coastguard Worker}
697*9880d681SAndroid Build Coastguard Worker
698*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit.
699*9880d681SAndroid Build Coastguard Workerdefine float @sfct20(i64* nocapture %sp0) {
700*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct20:
701*9880d681SAndroid Build Coastguard Worker; CHECK: ldur x[[REGNUM:[0-9]+]], [x0, #1]
702*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], x[[REGNUM]]
703*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
704*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i64* %sp0 to i64
705*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
706*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i64*
707*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
708*9880d681SAndroid Build Coastguard Worker  %val = sitofp i64 %pix_sp0.0.copyload to float
709*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
710*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Worker}
713*9880d681SAndroid Build Coastguard Worker
714*9880d681SAndroid Build Coastguard Worker; ********* 6s. load with unscaled imm to double. *********
715*9880d681SAndroid Build Coastguard Workerdefine double @sfct21(i8* nocapture %sp0) {
716*9880d681SAndroid Build Coastguard Workerentry:
717*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct21:
718*9880d681SAndroid Build Coastguard Worker; CHECK: ldursb w[[REGNUM:[0-9]+]], [x0, #-1]
719*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]]
720*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
721*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i8* %sp0 to i64
722*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, -1
723*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i8*
724*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
725*9880d681SAndroid Build Coastguard Worker  %val = sitofp i8 %pix_sp0.0.copyload to double
726*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
727*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
728*9880d681SAndroid Build Coastguard Worker}
729*9880d681SAndroid Build Coastguard Worker
730*9880d681SAndroid Build Coastguard Workerdefine double @sfct22(i16* nocapture %sp0) {
731*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct22:
732*9880d681SAndroid Build Coastguard Worker; CHECK: ldur h[[REGNUM:[0-9]+]], [x0, #1]
733*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0
734*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0
735*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
736*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
737*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct22:
738*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldursh w[[REGNUM:[0-9]+]], [x0, #1]
739*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]]
740*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul d0, [[REG]], [[REG]]
741*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i16* %sp0 to i64
742*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
743*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i16*
744*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i16, i16* %addr, align 1
745*9880d681SAndroid Build Coastguard Worker  %val = sitofp i16 %pix_sp0.0.copyload to double
746*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
747*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
748*9880d681SAndroid Build Coastguard Worker}
749*9880d681SAndroid Build Coastguard Worker
750*9880d681SAndroid Build Coastguard Workerdefine double @sfct23(i32* nocapture %sp0) {
751*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct23:
752*9880d681SAndroid Build Coastguard Worker; CHECK: ldur s[[REGNUM:[0-9]+]], [x0, #1]
753*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0
754*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
755*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
756*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i32* %sp0 to i64
757*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
758*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i32*
759*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
760*9880d681SAndroid Build Coastguard Worker  %val = sitofp i32 %pix_sp0.0.copyload to double
761*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
762*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
763*9880d681SAndroid Build Coastguard Worker}
764*9880d681SAndroid Build Coastguard Worker
765*9880d681SAndroid Build Coastguard Workerdefine double @sfct24(i64* nocapture %sp0) {
766*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct24:
767*9880d681SAndroid Build Coastguard Worker; CHECK: ldur d[[REGNUM:[0-9]+]], [x0, #1]
768*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], d[[SEXTREG]]
769*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
770*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i64* %sp0 to i64
771*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, 1
772*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i64*
773*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i64, i64* %addr, align 1
774*9880d681SAndroid Build Coastguard Worker  %val = sitofp i64 %pix_sp0.0.copyload to double
775*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
776*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
777*9880d681SAndroid Build Coastguard Worker
778*9880d681SAndroid Build Coastguard Worker}
779*9880d681SAndroid Build Coastguard Worker
780*9880d681SAndroid Build Coastguard Worker; Check that we do not use SSHLL code sequence when code size is a concern.
781*9880d681SAndroid Build Coastguard Workerdefine float @codesize_sfct17(i8* nocapture %sp0) optsize {
782*9880d681SAndroid Build Coastguard Workerentry:
783*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: codesize_sfct17:
784*9880d681SAndroid Build Coastguard Worker; CHECK: ldursb w[[REGNUM:[0-9]+]], [x0, #-1]
785*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], w[[REGNUM]]
786*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]]
787*9880d681SAndroid Build Coastguard Worker  %bitcast = ptrtoint i8* %sp0 to i64
788*9880d681SAndroid Build Coastguard Worker  %add = add i64 %bitcast, -1
789*9880d681SAndroid Build Coastguard Worker  %addr = inttoptr i64 %add to i8*
790*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i8, i8* %addr, align 1
791*9880d681SAndroid Build Coastguard Worker  %val = sitofp i8 %pix_sp0.0.copyload to float
792*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul float %val, %val
793*9880d681SAndroid Build Coastguard Worker  ret float %vmull.i
794*9880d681SAndroid Build Coastguard Worker}
795*9880d681SAndroid Build Coastguard Worker
796*9880d681SAndroid Build Coastguard Workerdefine double @codesize_sfct11(i32* nocapture %sp0) minsize {
797*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct11:
798*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w[[REGNUM:[0-9]+]], [x0, #4]
799*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]]
800*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]]
801*9880d681SAndroid Build Coastguard Workerentry:
802*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %sp0, i64 1
803*9880d681SAndroid Build Coastguard Worker  %pix_sp0.0.copyload = load i32, i32* %addr, align 1
804*9880d681SAndroid Build Coastguard Worker  %val = sitofp i32 %pix_sp0.0.copyload to double
805*9880d681SAndroid Build Coastguard Worker  %vmull.i = fmul double %val, %val
806*9880d681SAndroid Build Coastguard Worker  ret double %vmull.i
807*9880d681SAndroid Build Coastguard Worker}
808*9880d681SAndroid Build Coastguard Worker
809*9880d681SAndroid Build Coastguard Worker; Adding fp128 custom lowering makes these a little fragile since we have to
810*9880d681SAndroid Build Coastguard Worker; return the correct mix of Legal/Expand from the custom method.
811*9880d681SAndroid Build Coastguard Worker;
812*9880d681SAndroid Build Coastguard Worker; rdar://problem/14991489
813*9880d681SAndroid Build Coastguard Worker
814*9880d681SAndroid Build Coastguard Workerdefine float @float_from_i128(i128 %in) {
815*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: float_from_i128:
816*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__floatuntisf}}
817*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i128 %in to float
818*9880d681SAndroid Build Coastguard Worker  ret float %conv
819*9880d681SAndroid Build Coastguard Worker}
820*9880d681SAndroid Build Coastguard Worker
821*9880d681SAndroid Build Coastguard Workerdefine double @double_from_i128(i128 %in) {
822*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: double_from_i128:
823*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__floattidf}}
824*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i128 %in to double
825*9880d681SAndroid Build Coastguard Worker  ret double %conv
826*9880d681SAndroid Build Coastguard Worker}
827*9880d681SAndroid Build Coastguard Worker
828*9880d681SAndroid Build Coastguard Workerdefine fp128 @fp128_from_i128(i128 %in) {
829*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fp128_from_i128:
830*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__floatuntitf}}
831*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i128 %in to fp128
832*9880d681SAndroid Build Coastguard Worker  ret fp128 %conv
833*9880d681SAndroid Build Coastguard Worker}
834*9880d681SAndroid Build Coastguard Worker
835*9880d681SAndroid Build Coastguard Workerdefine i128 @i128_from_float(float %in) {
836*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i128_from_float
837*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__fixsfti}}
838*9880d681SAndroid Build Coastguard Worker  %conv = fptosi float %in to i128
839*9880d681SAndroid Build Coastguard Worker  ret i128 %conv
840*9880d681SAndroid Build Coastguard Worker}
841*9880d681SAndroid Build Coastguard Worker
842*9880d681SAndroid Build Coastguard Workerdefine i128 @i128_from_double(double %in) {
843*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i128_from_double
844*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__fixunsdfti}}
845*9880d681SAndroid Build Coastguard Worker  %conv = fptoui double %in to i128
846*9880d681SAndroid Build Coastguard Worker  ret i128 %conv
847*9880d681SAndroid Build Coastguard Worker}
848*9880d681SAndroid Build Coastguard Worker
849*9880d681SAndroid Build Coastguard Workerdefine i128 @i128_from_fp128(fp128 %in) {
850*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i128_from_fp128
851*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__fixtfti}}
852*9880d681SAndroid Build Coastguard Worker  %conv = fptosi fp128 %in to i128
853*9880d681SAndroid Build Coastguard Worker  ret i128 %conv
854*9880d681SAndroid Build Coastguard Worker}
855*9880d681SAndroid Build Coastguard Worker
856