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