1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+sse2 -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=SSE2
3; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+avx -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX
4; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+sse2 -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=SSE2_X86
5; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+avx -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX_X86
6
7
8define double @int_to_double_rr(i32 %a) {
9; SSE2-LABEL: int_to_double_rr:
10; SSE2:       # BB#0: # %entry
11; SSE2-NEXT:    cvtsi2sdl %edi, %xmm0
12; SSE2-NEXT:    retq
13;
14; AVX-LABEL: int_to_double_rr:
15; AVX:       # BB#0: # %entry
16; AVX-NEXT:    vcvtsi2sdl %edi, %xmm0, %xmm0
17; AVX-NEXT:    retq
18;
19; SSE2_X86-LABEL: int_to_double_rr:
20; SSE2_X86:       # BB#0: # %entry
21; SSE2_X86-NEXT:    pushl %ebp
22; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
23; SSE2_X86-NEXT:    .cfi_offset %ebp, -8
24; SSE2_X86-NEXT:    movl %esp, %ebp
25; SSE2_X86-NEXT:    .cfi_def_cfa_register %ebp
26; SSE2_X86-NEXT:    andl $-8, %esp
27; SSE2_X86-NEXT:    subl $8, %esp
28; SSE2_X86-NEXT:    movl 8(%ebp), %eax
29; SSE2_X86-NEXT:    cvtsi2sdl %eax, %xmm0
30; SSE2_X86-NEXT:    movsd %xmm0, (%esp)
31; SSE2_X86-NEXT:    fldl (%esp)
32; SSE2_X86-NEXT:    movl %ebp, %esp
33; SSE2_X86-NEXT:    popl %ebp
34; SSE2_X86-NEXT:    .cfi_def_cfa %esp, 4
35; SSE2_X86-NEXT:    retl
36;
37; AVX_X86-LABEL: int_to_double_rr:
38; AVX_X86:       # BB#0: # %entry
39; AVX_X86-NEXT:    pushl %ebp
40; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
41; AVX_X86-NEXT:    .cfi_offset %ebp, -8
42; AVX_X86-NEXT:    movl %esp, %ebp
43; AVX_X86-NEXT:    .cfi_def_cfa_register %ebp
44; AVX_X86-NEXT:    andl $-8, %esp
45; AVX_X86-NEXT:    subl $8, %esp
46; AVX_X86-NEXT:    vcvtsi2sdl 8(%ebp), %xmm0, %xmm0
47; AVX_X86-NEXT:    vmovsd %xmm0, (%esp)
48; AVX_X86-NEXT:    fldl (%esp)
49; AVX_X86-NEXT:    movl %ebp, %esp
50; AVX_X86-NEXT:    popl %ebp
51; AVX_X86-NEXT:    .cfi_def_cfa %esp, 4
52; AVX_X86-NEXT:    retl
53entry:
54  %0 = sitofp i32 %a to double
55  ret double %0
56}
57
58define double @int_to_double_rm(i32* %a) {
59; SSE2-LABEL: int_to_double_rm:
60; SSE2:       # BB#0: # %entry
61; SSE2-NEXT:    movl (%rdi), %eax
62; SSE2-NEXT:    cvtsi2sdl %eax, %xmm0
63; SSE2-NEXT:    retq
64;
65; AVX-LABEL: int_to_double_rm:
66; AVX:       # BB#0: # %entry
67; AVX-NEXT:    vcvtsi2sdl (%rdi), %xmm0, %xmm0
68; AVX-NEXT:    retq
69;
70; SSE2_X86-LABEL: int_to_double_rm:
71; SSE2_X86:       # BB#0: # %entry
72; SSE2_X86-NEXT:    pushl %ebp
73; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
74; SSE2_X86-NEXT:    .cfi_offset %ebp, -8
75; SSE2_X86-NEXT:    movl %esp, %ebp
76; SSE2_X86-NEXT:    .cfi_def_cfa_register %ebp
77; SSE2_X86-NEXT:    andl $-8, %esp
78; SSE2_X86-NEXT:    subl $8, %esp
79; SSE2_X86-NEXT:    movl 8(%ebp), %eax
80; SSE2_X86-NEXT:    cvtsi2sdl (%eax), %xmm0
81; SSE2_X86-NEXT:    movsd %xmm0, (%esp)
82; SSE2_X86-NEXT:    fldl (%esp)
83; SSE2_X86-NEXT:    movl %ebp, %esp
84; SSE2_X86-NEXT:    popl %ebp
85; SSE2_X86-NEXT:    .cfi_def_cfa %esp, 4
86; SSE2_X86-NEXT:    retl
87;
88; AVX_X86-LABEL: int_to_double_rm:
89; AVX_X86:       # BB#0: # %entry
90; AVX_X86-NEXT:    pushl %ebp
91; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
92; AVX_X86-NEXT:    .cfi_offset %ebp, -8
93; AVX_X86-NEXT:    movl %esp, %ebp
94; AVX_X86-NEXT:    .cfi_def_cfa_register %ebp
95; AVX_X86-NEXT:    andl $-8, %esp
96; AVX_X86-NEXT:    subl $8, %esp
97; AVX_X86-NEXT:    movl 8(%ebp), %eax
98; AVX_X86-NEXT:    vcvtsi2sdl (%eax), %xmm0, %xmm0
99; AVX_X86-NEXT:    vmovsd %xmm0, (%esp)
100; AVX_X86-NEXT:    fldl (%esp)
101; AVX_X86-NEXT:    movl %ebp, %esp
102; AVX_X86-NEXT:    popl %ebp
103; AVX_X86-NEXT:    .cfi_def_cfa %esp, 4
104; AVX_X86-NEXT:    retl
105entry:
106  %0 = load i32, i32* %a
107  %1 = sitofp i32 %0 to double
108  ret double %1
109}
110
111define double @int_to_double_rm_optsize(i32* %a) optsize {
112; SSE2-LABEL: int_to_double_rm_optsize:
113; SSE2:       # BB#0: # %entry
114; SSE2-NEXT:    cvtsi2sdl (%rdi), %xmm0
115; SSE2-NEXT:    retq
116;
117; AVX-LABEL: int_to_double_rm_optsize:
118; AVX:       # BB#0: # %entry
119; AVX-NEXT:    vcvtsi2sdl (%rdi), %xmm0, %xmm0
120; AVX-NEXT:    retq
121;
122; SSE2_X86-LABEL: int_to_double_rm_optsize:
123; SSE2_X86:       # BB#0: # %entry
124; SSE2_X86-NEXT:    pushl %ebp
125; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
126; SSE2_X86-NEXT:    .cfi_offset %ebp, -8
127; SSE2_X86-NEXT:    movl %esp, %ebp
128; SSE2_X86-NEXT:    .cfi_def_cfa_register %ebp
129; SSE2_X86-NEXT:    andl $-8, %esp
130; SSE2_X86-NEXT:    subl $8, %esp
131; SSE2_X86-NEXT:    movl 8(%ebp), %eax
132; SSE2_X86-NEXT:    cvtsi2sdl (%eax), %xmm0
133; SSE2_X86-NEXT:    movsd %xmm0, (%esp)
134; SSE2_X86-NEXT:    fldl (%esp)
135; SSE2_X86-NEXT:    movl %ebp, %esp
136; SSE2_X86-NEXT:    popl %ebp
137; SSE2_X86-NEXT:    .cfi_def_cfa %esp, 4
138; SSE2_X86-NEXT:    retl
139;
140; AVX_X86-LABEL: int_to_double_rm_optsize:
141; AVX_X86:       # BB#0: # %entry
142; AVX_X86-NEXT:    pushl %ebp
143; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
144; AVX_X86-NEXT:    .cfi_offset %ebp, -8
145; AVX_X86-NEXT:    movl %esp, %ebp
146; AVX_X86-NEXT:    .cfi_def_cfa_register %ebp
147; AVX_X86-NEXT:    andl $-8, %esp
148; AVX_X86-NEXT:    subl $8, %esp
149; AVX_X86-NEXT:    movl 8(%ebp), %eax
150; AVX_X86-NEXT:    vcvtsi2sdl (%eax), %xmm0, %xmm0
151; AVX_X86-NEXT:    vmovsd %xmm0, (%esp)
152; AVX_X86-NEXT:    fldl (%esp)
153; AVX_X86-NEXT:    movl %ebp, %esp
154; AVX_X86-NEXT:    popl %ebp
155; AVX_X86-NEXT:    .cfi_def_cfa %esp, 4
156; AVX_X86-NEXT:    retl
157entry:
158  %0 = load i32, i32* %a
159  %1 = sitofp i32 %0 to double
160  ret double %1
161}
162
163define float @int_to_float_rr(i32 %a) {
164; SSE2-LABEL: int_to_float_rr:
165; SSE2:       # BB#0: # %entry
166; SSE2-NEXT:    cvtsi2ssl %edi, %xmm0
167; SSE2-NEXT:    retq
168;
169; AVX-LABEL: int_to_float_rr:
170; AVX:       # BB#0: # %entry
171; AVX-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0
172; AVX-NEXT:    retq
173;
174; SSE2_X86-LABEL: int_to_float_rr:
175; SSE2_X86:       # BB#0: # %entry
176; SSE2_X86-NEXT:    pushl %eax
177; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
178; SSE2_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
179; SSE2_X86-NEXT:    cvtsi2ssl %eax, %xmm0
180; SSE2_X86-NEXT:    movss %xmm0, (%esp)
181; SSE2_X86-NEXT:    flds (%esp)
182; SSE2_X86-NEXT:    popl %eax
183; SSE2_X86-NEXT:    .cfi_def_cfa_offset 4
184; SSE2_X86-NEXT:    retl
185;
186; AVX_X86-LABEL: int_to_float_rr:
187; AVX_X86:       # BB#0: # %entry
188; AVX_X86-NEXT:    pushl %eax
189; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
190; AVX_X86-NEXT:    vcvtsi2ssl {{[0-9]+}}(%esp), %xmm0, %xmm0
191; AVX_X86-NEXT:    vmovss %xmm0, (%esp)
192; AVX_X86-NEXT:    flds (%esp)
193; AVX_X86-NEXT:    popl %eax
194; AVX_X86-NEXT:    .cfi_def_cfa_offset 4
195; AVX_X86-NEXT:    retl
196entry:
197  %0 = sitofp i32 %a to float
198  ret float %0
199}
200
201define float @int_to_float_rm(i32* %a) {
202; SSE2-LABEL: int_to_float_rm:
203; SSE2:       # BB#0: # %entry
204; SSE2-NEXT:    movl (%rdi), %eax
205; SSE2-NEXT:    cvtsi2ssl %eax, %xmm0
206; SSE2-NEXT:    retq
207;
208; AVX-LABEL: int_to_float_rm:
209; AVX:       # BB#0: # %entry
210; AVX-NEXT:    vcvtsi2ssl (%rdi), %xmm0, %xmm0
211; AVX-NEXT:    retq
212;
213; SSE2_X86-LABEL: int_to_float_rm:
214; SSE2_X86:       # BB#0: # %entry
215; SSE2_X86-NEXT:    pushl %eax
216; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
217; SSE2_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
218; SSE2_X86-NEXT:    cvtsi2ssl (%eax), %xmm0
219; SSE2_X86-NEXT:    movss %xmm0, (%esp)
220; SSE2_X86-NEXT:    flds (%esp)
221; SSE2_X86-NEXT:    popl %eax
222; SSE2_X86-NEXT:    .cfi_def_cfa_offset 4
223; SSE2_X86-NEXT:    retl
224;
225; AVX_X86-LABEL: int_to_float_rm:
226; AVX_X86:       # BB#0: # %entry
227; AVX_X86-NEXT:    pushl %eax
228; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
229; AVX_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
230; AVX_X86-NEXT:    vcvtsi2ssl (%eax), %xmm0, %xmm0
231; AVX_X86-NEXT:    vmovss %xmm0, (%esp)
232; AVX_X86-NEXT:    flds (%esp)
233; AVX_X86-NEXT:    popl %eax
234; AVX_X86-NEXT:    .cfi_def_cfa_offset 4
235; AVX_X86-NEXT:    retl
236entry:
237  %0 = load i32, i32* %a
238  %1 = sitofp i32 %0 to float
239  ret float %1
240}
241
242define float @int_to_float_rm_optsize(i32* %a) optsize {
243; SSE2-LABEL: int_to_float_rm_optsize:
244; SSE2:       # BB#0: # %entry
245; SSE2-NEXT:    cvtsi2ssl (%rdi), %xmm0
246; SSE2-NEXT:    retq
247;
248; AVX-LABEL: int_to_float_rm_optsize:
249; AVX:       # BB#0: # %entry
250; AVX-NEXT:    vcvtsi2ssl (%rdi), %xmm0, %xmm0
251; AVX-NEXT:    retq
252;
253; SSE2_X86-LABEL: int_to_float_rm_optsize:
254; SSE2_X86:       # BB#0: # %entry
255; SSE2_X86-NEXT:    pushl %eax
256; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
257; SSE2_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
258; SSE2_X86-NEXT:    cvtsi2ssl (%eax), %xmm0
259; SSE2_X86-NEXT:    movss %xmm0, (%esp)
260; SSE2_X86-NEXT:    flds (%esp)
261; SSE2_X86-NEXT:    popl %eax
262; SSE2_X86-NEXT:    .cfi_def_cfa_offset 4
263; SSE2_X86-NEXT:    retl
264;
265; AVX_X86-LABEL: int_to_float_rm_optsize:
266; AVX_X86:       # BB#0: # %entry
267; AVX_X86-NEXT:    pushl %eax
268; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
269; AVX_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
270; AVX_X86-NEXT:    vcvtsi2ssl (%eax), %xmm0, %xmm0
271; AVX_X86-NEXT:    vmovss %xmm0, (%esp)
272; AVX_X86-NEXT:    flds (%esp)
273; AVX_X86-NEXT:    popl %eax
274; AVX_X86-NEXT:    .cfi_def_cfa_offset 4
275; AVX_X86-NEXT:    retl
276entry:
277  %0 = load i32, i32* %a
278  %1 = sitofp i32 %0 to float
279  ret float %1
280}
281