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
4
5; Test sitofp
6
7define void @sitofp_single_i32(i32 %a, float %b) nounwind ssp {
8entry:
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}
20
21define void @sitofp_single_i16(i16 %a, float %b) nounwind ssp {
22entry:
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}
36
37define void @sitofp_single_i8(i8 %a) nounwind ssp {
38entry:
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}
52
53define void @sitofp_double_i32(i32 %a, double %b) nounwind ssp {
54entry:
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}
66
67define void @sitofp_double_i16(i16 %a, double %b) nounwind ssp {
68entry:
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}
82
83define void @sitofp_double_i8(i8 %a, double %b) nounwind ssp {
84entry:
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}
98
99; Test uitofp
100
101define void @uitofp_single_i32(i32 %a, float %b) nounwind ssp {
102entry:
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}
114
115define void @uitofp_single_i16(i16 %a, float %b) nounwind ssp {
116entry:
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}
130
131define void @uitofp_single_i8(i8 %a) nounwind ssp {
132entry:
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}
146
147define void @uitofp_double_i32(i32 %a, double %b) nounwind ssp {
148entry:
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}
160
161define void @uitofp_double_i16(i16 %a, double %b) nounwind ssp {
162entry:
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}
176
177define void @uitofp_double_i8(i8 %a, double %b) nounwind ssp {
178entry:
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}
192
193; Test fptosi
194
195define void @fptosi_float(float %a) nounwind ssp {
196entry:
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}
206
207define void @fptosi_double(double %a) nounwind ssp {
208entry:
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}
218
219; Test fptoui
220
221define void @fptoui_float(float %a) nounwind ssp {
222entry:
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}
232
233define void @fptoui_double(double %a) nounwind ssp {
234entry:
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}
244