AVX-512: Removed "z" suffix from AVX-512 instructions, since it is incompatible with...
[oota-llvm.git] / test / CodeGen / X86 / avx512-cvt.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl --show-mc-encoding | FileCheck %s
2
3 ; CHECK-LABEL: sitof32
4 ; CHECK: vcvtdq2ps %zmm
5 ; CHECK: ret
6 define <16 x float> @sitof32(<16 x i32> %a) nounwind {
7   %b = sitofp <16 x i32> %a to <16 x float>
8   ret <16 x float> %b
9 }
10
11 ; CHECK-LABEL: fptosi00
12 ; CHECK: vcvttps2dq %zmm
13 ; CHECK: ret
14 define <16 x i32> @fptosi00(<16 x float> %a) nounwind {
15   %b = fptosi <16 x float> %a to <16 x i32>
16   ret <16 x i32> %b
17 }
18
19 ; CHECK-LABEL: fptoui00
20 ; CHECK: vcvttps2udq
21 ; CHECK: ret
22 define <16 x i32> @fptoui00(<16 x float> %a) nounwind {
23   %b = fptoui <16 x float> %a to <16 x i32>
24   ret <16 x i32> %b
25 }
26
27 ; CHECK-LABEL: fptoui01
28 ; CHECK: vcvttpd2udq
29 ; CHECK: ret
30 define <8 x i32> @fptoui01(<8 x double> %a) nounwind {
31   %b = fptoui <8 x double> %a to <8 x i32>
32   ret <8 x i32> %b
33 }
34
35 ; CHECK-LABEL: sitof64
36 ; CHECK: vcvtdq2pd %ymm
37 ; CHECK: ret
38 define <8 x double> @sitof64(<8 x i32> %a) {
39   %b = sitofp <8 x i32> %a to <8 x double>
40   ret <8 x double> %b
41 }
42
43 ; CHECK-LABEL: fptosi01
44 ; CHECK: vcvttpd2dq %zmm
45 ; CHECK: ret
46 define <8 x i32> @fptosi01(<8 x double> %a) {
47   %b = fptosi <8 x double> %a to <8 x i32>
48   ret <8 x i32> %b
49 }
50
51 ; CHECK-LABEL: fptrunc00
52 ; CHECK: vcvtpd2ps %zmm
53 ; CHECK-NEXT: vcvtpd2ps %zmm
54 ; CHECK-NEXT: vinsertf64x4    $1
55 ; CHECK: ret
56 define <16 x float> @fptrunc00(<16 x double> %b) nounwind {
57   %a = fptrunc <16 x double> %b to <16 x float>
58   ret <16 x float> %a
59 }
60
61 ; CHECK-LABEL: fpext00
62 ; CHECK: vcvtps2pd %ymm0, %zmm0
63 ; CHECK: ret
64 define <8 x double> @fpext00(<8 x float> %b) nounwind {
65   %a = fpext <8 x float> %b to <8 x double>
66   ret <8 x double> %a
67 }
68
69 ; CHECK-LABEL: funcA
70 ; CHECK: vcvtsi2sdq (%rdi){{.*}} encoding: [0x62
71 ; CHECK: ret
72 define double @funcA(i64* nocapture %e) {
73 entry:
74   %tmp1 = load i64* %e, align 8
75   %conv = sitofp i64 %tmp1 to double
76   ret double %conv
77 }
78
79 ; CHECK-LABEL: funcB
80 ; CHECK: vcvtsi2sdl (%{{.*}} encoding: [0x62
81 ; CHECK: ret
82 define double @funcB(i32* %e) {
83 entry:
84   %tmp1 = load i32* %e, align 4
85   %conv = sitofp i32 %tmp1 to double
86   ret double %conv
87 }
88
89 ; CHECK-LABEL: funcC
90 ; CHECK: vcvtsi2ssl (%{{.*}} encoding: [0x62
91 ; CHECK: ret
92 define float @funcC(i32* %e) {
93 entry:
94   %tmp1 = load i32* %e, align 4
95   %conv = sitofp i32 %tmp1 to float
96   ret float %conv
97 }
98
99 ; CHECK-LABEL: i64tof32
100 ; CHECK: vcvtsi2ssq  (%{{.*}} encoding: [0x62
101 ; CHECK: ret
102 define float @i64tof32(i64* %e) {
103 entry:
104   %tmp1 = load i64* %e, align 8
105   %conv = sitofp i64 %tmp1 to float
106   ret float %conv
107 }
108
109 ; CHECK-LABEL: fpext
110 ; CHECK: vcvtss2sd {{.*}} encoding: [0x62
111 ; CHECK: ret
112 define void @fpext() {
113 entry:
114   %f = alloca float, align 4
115   %d = alloca double, align 8
116   %tmp = load float* %f, align 4
117   %conv = fpext float %tmp to double
118   store double %conv, double* %d, align 8
119   ret void
120 }
121
122 ; CHECK-LABEL: fpround_scalar
123 ; CHECK: vmovsd {{.*}} encoding: [0x62
124 ; CHECK: vcvtsd2ss {{.*}} encoding: [0x62
125 ; CHECK: vmovss {{.*}} encoding: [0x62
126 ; CHECK: ret
127 define void @fpround_scalar() nounwind uwtable {
128 entry:
129   %f = alloca float, align 4
130   %d = alloca double, align 8
131   %tmp = load double* %d, align 8
132   %conv = fptrunc double %tmp to float
133   store float %conv, float* %f, align 4
134   ret void
135 }
136
137 ; CHECK-LABEL: long_to_double
138 ; CHECK: vmovq {{.*}} encoding: [0x62
139 ; CHECK: ret
140 define double @long_to_double(i64 %x) {
141    %res = bitcast i64 %x to double
142    ret double %res
143 }
144
145 ; CHECK-LABEL: double_to_long
146 ; CHECK: vmovq {{.*}} encoding: [0x62
147 ; CHECK: ret
148 define i64 @double_to_long(double %x) {
149    %res = bitcast double %x to i64
150    ret i64 %res
151 }
152
153 ; CHECK-LABEL: int_to_float
154 ; CHECK: vmovd {{.*}} encoding: [0x62
155 ; CHECK: ret
156 define float @int_to_float(i32 %x) {
157    %res = bitcast i32 %x to float
158    ret float %res
159 }
160
161 ; CHECK-LABEL: float_to_int
162 ; CHECK: vmovd {{.*}} encoding: [0x62
163 ; CHECK: ret
164 define i32 @float_to_int(float %x) {
165    %res = bitcast float %x to i32
166    ret i32 %res
167 }
168
169 ; CHECK-LABEL: uitof64
170 ; CHECK: vcvtudq2pd
171 ; CHECK: vextracti64x4
172 ; CHECK: vcvtudq2pd
173 ; CHECK: ret
174 define <16 x double> @uitof64(<16 x i32> %a) nounwind {
175   %b = uitofp <16 x i32> %a to <16 x double>
176   ret <16 x double> %b
177 }
178
179 ; CHECK-LABEL: uitof32
180 ; CHECK: vcvtudq2ps
181 ; CHECK: ret
182 define <16 x float> @uitof32(<16 x i32> %a) nounwind {
183   %b = uitofp <16 x i32> %a to <16 x float>
184   ret <16 x float> %b
185 }
186
187 ; CHECK-LABEL: @fptosi02
188 ; CHECK vcvttss2si {{.*}} encoding: [0x62
189 ; CHECK: ret
190 define i32 @fptosi02(float %a) nounwind {
191   %b = fptosi float %a to i32
192   ret i32 %b
193 }
194
195 ; CHECK-LABEL: @fptoui02
196 ; CHECK vcvttss2usi {{.*}} encoding: [0x62
197 ; CHECK: ret
198 define i32 @fptoui02(float %a) nounwind {
199   %b = fptoui float %a to i32
200   ret i32 %b
201 }
202
203 ; CHECK-LABEL: @uitofp02
204 ; CHECK vcvtusi2ss
205 ; CHECK: ret
206 define float @uitofp02(i32 %a) nounwind {
207   %b = uitofp i32 %a to float
208   ret float %b
209 }
210
211 ; CHECK-LABEL: @uitofp03
212 ; CHECK vcvtusi2sd
213 ; CHECK: ret
214 define double @uitofp03(i32 %a) nounwind {
215   %b = uitofp i32 %a to double
216   ret double %b
217 }