[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / ARM / fast-isel-conversion.ll
blob46b5e78fb662649bbedbae0a886af070be0af8a1
1 ; 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 ; 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 ; RUN: llc < %s -verify-machineinstrs -O0 -fast-isel-abort=1 -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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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