AVX-512: Added VRCP28 and VRSQRT28 instructions and intrinsics.
[oota-llvm.git] / test / CodeGen / X86 / avx512-intrinsics.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s
2
3 declare i32 @llvm.x86.avx512.kortestz(i16, i16) nounwind readnone
4 ; CHECK: test_kortestz
5 ; CHECK: kortestw
6 ; CHECK: sete
7 define i32 @test_kortestz(i16 %a0, i16 %a1) {
8   %res = call i32 @llvm.x86.avx512.kortestz(i16 %a0, i16 %a1) 
9   ret i32 %res
10 }
11
12 declare i32 @llvm.x86.avx512.kortestc(i16, i16) nounwind readnone
13 ; CHECK: test_kortestc
14 ; CHECK: kortestw
15 ; CHECK: sbbl
16 define i32 @test_kortestc(i16 %a0, i16 %a1) {
17   %res = call i32 @llvm.x86.avx512.kortestc(i16 %a0, i16 %a1) 
18   ret i32 %res
19 }
20
21 define <16 x float> @test_rcp_ps_512(<16 x float> %a0) {
22   ; CHECK: vrcp14ps
23   %res = call <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
24   ret <16 x float> %res
25 }
26 declare <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float>) nounwind readnone
27
28 define <8 x double> @test_rcp_pd_512(<8 x double> %a0) {
29   ; CHECK: vrcp14pd
30   %res = call <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double> %a0) ; <<8 x double>> [#uses=1]
31   ret <8 x double> %res
32 }
33 declare <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double>) nounwind readnone
34
35 define <16 x float> @test_rcp28_ps_512(<16 x float> %a0) {
36   ; CHECK: vrcp28ps
37   %res = call <16 x float> @llvm.x86.avx512.rcp28.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
38   ret <16 x float> %res
39 }
40 declare <16 x float> @llvm.x86.avx512.rcp28.ps.512(<16 x float>) nounwind readnone
41
42 define <8 x double> @test_rcp28_pd_512(<8 x double> %a0) {
43   ; CHECK: vrcp28pd
44   %res = call <8 x double> @llvm.x86.avx512.rcp28.pd.512(<8 x double> %a0) ; <<8 x double>> [#uses=1]
45   ret <8 x double> %res
46 }
47 declare <8 x double> @llvm.x86.avx512.rcp28.pd.512(<8 x double>) nounwind readnone
48
49 define <8 x double> @test_rndscale_pd_512(<8 x double> %a0) {
50   ; CHECK: vrndscale
51   %res = call <8 x double> @llvm.x86.avx512.rndscale.pd.512(<8 x double> %a0, i32 7) ; <<8 x double>> [#uses=1]
52   ret <8 x double> %res
53 }
54 declare <8 x double> @llvm.x86.avx512.rndscale.pd.512(<8 x double>, i32) nounwind readnone
55
56
57 define <16 x float> @test_rndscale_ps_512(<16 x float> %a0) {
58   ; CHECK: vrndscale
59   %res = call <16 x float> @llvm.x86.avx512.rndscale.ps.512(<16 x float> %a0, i32 7) ; <<16 x float>> [#uses=1]
60   ret <16 x float> %res
61 }
62 declare <16 x float> @llvm.x86.avx512.rndscale.ps.512(<16 x float>, i32) nounwind readnone
63
64
65 define <16 x float> @test_rsqrt_ps_512(<16 x float> %a0) {
66   ; CHECK: vrsqrt14ps
67   %res = call <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
68   ret <16 x float> %res
69 }
70 declare <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float>) nounwind readnone
71
72 define <16 x float> @test_rsqrt28_ps_512(<16 x float> %a0) {
73   ; CHECK: vrsqrt28ps
74   %res = call <16 x float> @llvm.x86.avx512.rsqrt28.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
75   ret <16 x float> %res
76 }
77 declare <16 x float> @llvm.x86.avx512.rsqrt28.ps.512(<16 x float>) nounwind readnone
78
79 define <4 x float> @test_rsqrt14_ss(<4 x float> %a0) {
80   ; CHECK: vrsqrt14ss
81   %res = call <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
82   ret <4 x float> %res
83 }
84 declare <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float>) nounwind readnone
85
86 define <4 x float> @test_rsqrt28_ss(<4 x float> %a0) {
87   ; CHECK: vrsqrt28ss
88   %res = call <4 x float> @llvm.x86.avx512.rsqrt28.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
89   ret <4 x float> %res
90 }
91 declare <4 x float> @llvm.x86.avx512.rsqrt28.ss(<4 x float>) nounwind readnone
92
93 define <4 x float> @test_rcp14_ss(<4 x float> %a0) {
94   ; CHECK: vrcp14ss
95   %res = call <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
96   ret <4 x float> %res
97 }
98 declare <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float>) nounwind readnone
99
100 define <4 x float> @test_rcp28_ss(<4 x float> %a0) {
101   ; CHECK: vrcp28ss
102   %res = call <4 x float> @llvm.x86.avx512.rcp28.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
103   ret <4 x float> %res
104 }
105 declare <4 x float> @llvm.x86.avx512.rcp28.ss(<4 x float>) nounwind readnone
106
107 define <8 x double> @test_sqrt_pd_512(<8 x double> %a0) {
108   ; CHECK: vsqrtpd
109   %res = call <8 x double> @llvm.x86.avx512.sqrt.pd.512(<8 x double> %a0) ; <<8 x double>> [#uses=1]
110   ret <8 x double> %res
111 }
112 declare <8 x double> @llvm.x86.avx512.sqrt.pd.512(<8 x double>) nounwind readnone
113
114 define <16 x float> @test_sqrt_ps_512(<16 x float> %a0) {
115   ; CHECK: vsqrtps
116   %res = call <16 x float> @llvm.x86.avx512.sqrt.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
117   ret <16 x float> %res
118 }
119 declare <16 x float> @llvm.x86.avx512.sqrt.ps.512(<16 x float>) nounwind readnone
120
121 define <4 x float> @test_sqrt_ss(<4 x float> %a0, <4 x float> %a1) {
122   ; CHECK: vsqrtssz
123   %res = call <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
124   ret <4 x float> %res
125 }
126 declare <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float>, <4 x float>) nounwind readnone
127
128 define <2 x double> @test_sqrt_sd(<2 x double> %a0, <2 x double> %a1) {
129   ; CHECK: vsqrtsdz
130   %res = call <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
131   ret <2 x double> %res
132 }
133 declare <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double>, <2 x double>) nounwind readnone
134
135 define i64 @test_x86_sse2_cvtsd2si64(<2 x double> %a0) {
136   ; CHECK: vcvtsd2siz
137   %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
138   ret i64 %res
139 }
140 declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
141
142 define <2 x double> @test_x86_sse2_cvtsi642sd(<2 x double> %a0, i64 %a1) {
143   ; CHECK: vcvtsi2sdqz
144   %res = call <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
145   ret <2 x double> %res
146 }
147 declare <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double>, i64) nounwind readnone
148
149 define <2 x double> @test_x86_avx512_cvtusi642sd(<2 x double> %a0, i64 %a1) {
150   ; CHECK: vcvtusi2sdqz
151   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
152   ret <2 x double> %res
153 }
154 declare <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double>, i64) nounwind readnone
155
156 define i64 @test_x86_sse2_cvttsd2si64(<2 x double> %a0) {
157   ; CHECK: vcvttsd2siz
158   %res = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
159   ret i64 %res
160 }
161 declare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone
162
163
164 define i64 @test_x86_sse_cvtss2si64(<4 x float> %a0) {
165   ; CHECK: vcvtss2siz
166   %res = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %a0) ; <i64> [#uses=1]
167   ret i64 %res
168 }
169 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
170
171
172 define <4 x float> @test_x86_sse_cvtsi642ss(<4 x float> %a0, i64 %a1) {
173   ; CHECK: vcvtsi2ssqz
174   %res = call <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float> %a0, i64 %a1) ; <<4 x float>> [#uses=1]
175   ret <4 x float> %res
176 }
177 declare <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float>, i64) nounwind readnone
178
179
180 define i64 @test_x86_sse_cvttss2si64(<4 x float> %a0) {
181   ; CHECK: vcvttss2siz
182   %res = call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %a0) ; <i64> [#uses=1]
183   ret i64 %res
184 }
185 declare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone
186
187 define i64 @test_x86_avx512_cvtsd2usi64(<2 x double> %a0) {
188   ; CHECK: vcvtsd2usiz
189   %res = call i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double> %a0) ; <i64> [#uses=1]
190   ret i64 %res
191 }
192 declare i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double>) nounwind readnone