xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/fast-isel-conversion.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=armv7-linux-gnueabi | FileCheck %s --check-prefix=ARM
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Test sitofp
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine void @sitofp_single_i32(i32 %a, float %b) nounwind ssp {
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker; ARM: sitofp_single_i32
10*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
11*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f32.s32 s0, s0
12*9880d681SAndroid Build Coastguard Worker; THUMB: sitofp_single_i32
13*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
14*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f32.s32 s0, s0
15*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca float, align 4
16*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i32 %a to float
17*9880d681SAndroid Build Coastguard Worker  store float %conv, float* %b.addr, align 4
18*9880d681SAndroid Build Coastguard Worker  ret void
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine void @sitofp_single_i16(i16 %a, float %b) nounwind ssp {
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker; ARM: sitofp_single_i16
24*9880d681SAndroid Build Coastguard Worker; ARM: sxth r0, r0
25*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
26*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f32.s32 s0, s0
27*9880d681SAndroid Build Coastguard Worker; THUMB: sitofp_single_i16
28*9880d681SAndroid Build Coastguard Worker; THUMB: sxth r0, r0
29*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
30*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f32.s32 s0, s0
31*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca float, align 4
32*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i16 %a to float
33*9880d681SAndroid Build Coastguard Worker  store float %conv, float* %b.addr, align 4
34*9880d681SAndroid Build Coastguard Worker  ret void
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine void @sitofp_single_i8(i8 %a) nounwind ssp {
38*9880d681SAndroid Build Coastguard Workerentry:
39*9880d681SAndroid Build Coastguard Worker; ARM: sitofp_single_i8
40*9880d681SAndroid Build Coastguard Worker; ARM: sxtb r0, r0
41*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
42*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f32.s32 s0, s0
43*9880d681SAndroid Build Coastguard Worker; THUMB: sitofp_single_i8
44*9880d681SAndroid Build Coastguard Worker; THUMB: sxtb r0, r0
45*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
46*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f32.s32 s0, s0
47*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca float, align 4
48*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i8 %a to float
49*9880d681SAndroid Build Coastguard Worker  store float %conv, float* %b.addr, align 4
50*9880d681SAndroid Build Coastguard Worker  ret void
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine void @sitofp_double_i32(i32 %a, double %b) nounwind ssp {
54*9880d681SAndroid Build Coastguard Workerentry:
55*9880d681SAndroid Build Coastguard Worker; ARM: sitofp_double_i32
56*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
57*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f64.s32 d16, s0
58*9880d681SAndroid Build Coastguard Worker; THUMB: sitofp_double_i32
59*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
60*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f64.s32 d16, s0
61*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca double, align 8
62*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i32 %a to double
63*9880d681SAndroid Build Coastguard Worker  store double %conv, double* %b.addr, align 8
64*9880d681SAndroid Build Coastguard Worker  ret void
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine void @sitofp_double_i16(i16 %a, double %b) nounwind ssp {
68*9880d681SAndroid Build Coastguard Workerentry:
69*9880d681SAndroid Build Coastguard Worker; ARM: sitofp_double_i16
70*9880d681SAndroid Build Coastguard Worker; ARM: sxth r0, r0
71*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
72*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f64.s32 d16, s0
73*9880d681SAndroid Build Coastguard Worker; THUMB: sitofp_double_i16
74*9880d681SAndroid Build Coastguard Worker; THUMB: sxth r0, r0
75*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
76*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f64.s32 d16, s0
77*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca double, align 8
78*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i16 %a to double
79*9880d681SAndroid Build Coastguard Worker  store double %conv, double* %b.addr, align 8
80*9880d681SAndroid Build Coastguard Worker  ret void
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine void @sitofp_double_i8(i8 %a, double %b) nounwind ssp {
84*9880d681SAndroid Build Coastguard Workerentry:
85*9880d681SAndroid Build Coastguard Worker; ARM: sitofp_double_i8
86*9880d681SAndroid Build Coastguard Worker; ARM: sxtb r0, r0
87*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
88*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f64.s32 d16, s0
89*9880d681SAndroid Build Coastguard Worker; THUMB: sitofp_double_i8
90*9880d681SAndroid Build Coastguard Worker; THUMB: sxtb r0, r0
91*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
92*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f64.s32 d16, s0
93*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca double, align 8
94*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i8 %a to double
95*9880d681SAndroid Build Coastguard Worker  store double %conv, double* %b.addr, align 8
96*9880d681SAndroid Build Coastguard Worker  ret void
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; Test uitofp
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine void @uitofp_single_i32(i32 %a, float %b) nounwind ssp {
102*9880d681SAndroid Build Coastguard Workerentry:
103*9880d681SAndroid Build Coastguard Worker; ARM: uitofp_single_i32
104*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
105*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f32.u32 s0, s0
106*9880d681SAndroid Build Coastguard Worker; THUMB: uitofp_single_i32
107*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
108*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f32.u32 s0, s0
109*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca float, align 4
110*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i32 %a to float
111*9880d681SAndroid Build Coastguard Worker  store float %conv, float* %b.addr, align 4
112*9880d681SAndroid Build Coastguard Worker  ret void
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine void @uitofp_single_i16(i16 %a, float %b) nounwind ssp {
116*9880d681SAndroid Build Coastguard Workerentry:
117*9880d681SAndroid Build Coastguard Worker; ARM: uitofp_single_i16
118*9880d681SAndroid Build Coastguard Worker; ARM: uxth r0, r0
119*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
120*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f32.u32 s0, s0
121*9880d681SAndroid Build Coastguard Worker; THUMB: uitofp_single_i16
122*9880d681SAndroid Build Coastguard Worker; THUMB: uxth r0, r0
123*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
124*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f32.u32 s0, s0
125*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca float, align 4
126*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i16 %a to float
127*9880d681SAndroid Build Coastguard Worker  store float %conv, float* %b.addr, align 4
128*9880d681SAndroid Build Coastguard Worker  ret void
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdefine void @uitofp_single_i8(i8 %a) nounwind ssp {
132*9880d681SAndroid Build Coastguard Workerentry:
133*9880d681SAndroid Build Coastguard Worker; ARM: uitofp_single_i8
134*9880d681SAndroid Build Coastguard Worker; ARM: and r0, r0, #255
135*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
136*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f32.u32 s0, s0
137*9880d681SAndroid Build Coastguard Worker; THUMB: uitofp_single_i8
138*9880d681SAndroid Build Coastguard Worker; THUMB: and r0, r0, #255
139*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
140*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f32.u32 s0, s0
141*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca float, align 4
142*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i8 %a to float
143*9880d681SAndroid Build Coastguard Worker  store float %conv, float* %b.addr, align 4
144*9880d681SAndroid Build Coastguard Worker  ret void
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine void @uitofp_double_i32(i32 %a, double %b) nounwind ssp {
148*9880d681SAndroid Build Coastguard Workerentry:
149*9880d681SAndroid Build Coastguard Worker; ARM: uitofp_double_i32
150*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
151*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f64.u32 d16, s0
152*9880d681SAndroid Build Coastguard Worker; THUMB: uitofp_double_i32
153*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
154*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f64.u32 d16, s0
155*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca double, align 8
156*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i32 %a to double
157*9880d681SAndroid Build Coastguard Worker  store double %conv, double* %b.addr, align 8
158*9880d681SAndroid Build Coastguard Worker  ret void
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdefine void @uitofp_double_i16(i16 %a, double %b) nounwind ssp {
162*9880d681SAndroid Build Coastguard Workerentry:
163*9880d681SAndroid Build Coastguard Worker; ARM: uitofp_double_i16
164*9880d681SAndroid Build Coastguard Worker; ARM: uxth r0, r0
165*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
166*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f64.u32 d16, s0
167*9880d681SAndroid Build Coastguard Worker; THUMB: uitofp_double_i16
168*9880d681SAndroid Build Coastguard Worker; THUMB: uxth r0, r0
169*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
170*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f64.u32 d16, s0
171*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca double, align 8
172*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i16 %a to double
173*9880d681SAndroid Build Coastguard Worker  store double %conv, double* %b.addr, align 8
174*9880d681SAndroid Build Coastguard Worker  ret void
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdefine void @uitofp_double_i8(i8 %a, double %b) nounwind ssp {
178*9880d681SAndroid Build Coastguard Workerentry:
179*9880d681SAndroid Build Coastguard Worker; ARM: uitofp_double_i8
180*9880d681SAndroid Build Coastguard Worker; ARM: and r0, r0, #255
181*9880d681SAndroid Build Coastguard Worker; ARM: vmov s0, r0
182*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.f64.u32 d16, s0
183*9880d681SAndroid Build Coastguard Worker; THUMB: uitofp_double_i8
184*9880d681SAndroid Build Coastguard Worker; THUMB: and r0, r0, #255
185*9880d681SAndroid Build Coastguard Worker; THUMB: vmov s0, r0
186*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.f64.u32 d16, s0
187*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca double, align 8
188*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i8 %a to double
189*9880d681SAndroid Build Coastguard Worker  store double %conv, double* %b.addr, align 8
190*9880d681SAndroid Build Coastguard Worker  ret void
191*9880d681SAndroid Build Coastguard Worker}
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker; Test fptosi
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdefine void @fptosi_float(float %a) nounwind ssp {
196*9880d681SAndroid Build Coastguard Workerentry:
197*9880d681SAndroid Build Coastguard Worker; ARM: fptosi_float
198*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.s32.f32 s0, s0
199*9880d681SAndroid Build Coastguard Worker; THUMB: fptosi_float
200*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.s32.f32 s0, s0
201*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca i32, align 4
202*9880d681SAndroid Build Coastguard Worker  %conv = fptosi float %a to i32
203*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %b.addr, align 4
204*9880d681SAndroid Build Coastguard Worker  ret void
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdefine void @fptosi_double(double %a) nounwind ssp {
208*9880d681SAndroid Build Coastguard Workerentry:
209*9880d681SAndroid Build Coastguard Worker; ARM: fptosi_double
210*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.s32.f64 s0, d16
211*9880d681SAndroid Build Coastguard Worker; THUMB: fptosi_double
212*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.s32.f64 s0, d16
213*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca i32, align 8
214*9880d681SAndroid Build Coastguard Worker  %conv = fptosi double %a to i32
215*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %b.addr, align 8
216*9880d681SAndroid Build Coastguard Worker  ret void
217*9880d681SAndroid Build Coastguard Worker}
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker; Test fptoui
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerdefine void @fptoui_float(float %a) nounwind ssp {
222*9880d681SAndroid Build Coastguard Workerentry:
223*9880d681SAndroid Build Coastguard Worker; ARM: fptoui_float
224*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.u32.f32 s0, s0
225*9880d681SAndroid Build Coastguard Worker; THUMB: fptoui_float
226*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.u32.f32 s0, s0
227*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca i32, align 4
228*9880d681SAndroid Build Coastguard Worker  %conv = fptoui float %a to i32
229*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %b.addr, align 4
230*9880d681SAndroid Build Coastguard Worker  ret void
231*9880d681SAndroid Build Coastguard Worker}
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Workerdefine void @fptoui_double(double %a) nounwind ssp {
234*9880d681SAndroid Build Coastguard Workerentry:
235*9880d681SAndroid Build Coastguard Worker; ARM: fptoui_double
236*9880d681SAndroid Build Coastguard Worker; ARM: vcvt.u32.f64 s0, d16
237*9880d681SAndroid Build Coastguard Worker; THUMB: fptoui_double
238*9880d681SAndroid Build Coastguard Worker; THUMB: vcvt.u32.f64 s0, d16
239*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca i32, align 8
240*9880d681SAndroid Build Coastguard Worker  %conv = fptoui double %a to i32
241*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %b.addr, align 8
242*9880d681SAndroid Build Coastguard Worker  ret void
243*9880d681SAndroid Build Coastguard Worker}
244