AVX-512: added scalar convert 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_x86_avx3_kortestz
5 ; CHECK: kortestw
6 ; CHECK: sete
7 define i32 @test_x86_avx3_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_x86_avx3_kortestc
14 ; CHECK: kortestw
15 ; CHECK: sbbl
16 define i32 @test_x86_avx3_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_x86_avx3_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_x86_avx3_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
36 define <8 x double> @test_x86_avx3_rndscale_pd_512(<8 x double> %a0) {
37   ; CHECK: vrndscale
38   %res = call <8 x double> @llvm.x86.avx512.rndscale.pd.512(<8 x double> %a0, i32 7) ; <<8 x double>> [#uses=1]
39   ret <8 x double> %res
40 }
41 declare <8 x double> @llvm.x86.avx512.rndscale.pd.512(<8 x double>, i32) nounwind readnone
42
43
44 define <16 x float> @test_x86_avx3_rndscale_ps_512(<16 x float> %a0) {
45   ; CHECK: vrndscale
46   %res = call <16 x float> @llvm.x86.avx512.rndscale.ps.512(<16 x float> %a0, i32 7) ; <<16 x float>> [#uses=1]
47   ret <16 x float> %res
48 }
49 declare <16 x float> @llvm.x86.avx512.rndscale.ps.512(<16 x float>, i32) nounwind readnone
50
51
52 define <16 x float> @test_x86_avx3_rsqrt_ps_512(<16 x float> %a0) {
53   ; CHECK: vrsqrt14ps
54   %res = call <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
55   ret <16 x float> %res
56 }
57 declare <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float>) nounwind readnone
58
59
60 define <8 x double> @test_x86_avx3_sqrt_pd_512(<8 x double> %a0) {
61   ; CHECK: vsqrtpd
62   %res = call <8 x double> @llvm.x86.avx512.sqrt.pd.512(<8 x double> %a0) ; <<8 x double>> [#uses=1]
63   ret <8 x double> %res
64 }
65 declare <8 x double> @llvm.x86.avx512.sqrt.pd.512(<8 x double>) nounwind readnone
66
67
68 define <16 x float> @test_x86_avx3_sqrt_ps_512(<16 x float> %a0) {
69   ; CHECK: vsqrtps
70   %res = call <16 x float> @llvm.x86.avx512.sqrt.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
71   ret <16 x float> %res
72 }
73 declare <16 x float> @llvm.x86.avx512.sqrt.ps.512(<16 x float>) nounwind readnone
74
75 define <4 x float> @test_x86_avx3_sqrt_ss(<4 x float> %a0, <4 x float> %a1) {
76   ; CHECK: vsqrtssz
77   %res = call <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
78   ret <4 x float> %res
79 }
80 declare <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float>, <4 x float>) nounwind readnone
81
82 define <2 x double> @test_x86_avx3_sqrt_sd(<2 x double> %a0, <2 x double> %a1) {
83   ; CHECK: vsqrtsdz
84   %res = call <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
85   ret <2 x double> %res
86 }
87 declare <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double>, <2 x double>) nounwind readnone
88
89 define i64 @test_x86_sse2_cvtsd2si64(<2 x double> %a0) {
90   ; CHECK: vcvtsd2siz
91   %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
92   ret i64 %res
93 }
94 declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
95
96 define <2 x double> @test_x86_sse2_cvtsi642sd(<2 x double> %a0, i64 %a1) {
97   ; CHECK: vcvtsi2sdqz
98   %res = call <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
99   ret <2 x double> %res
100 }
101 declare <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double>, i64) nounwind readnone
102
103 define <2 x double> @test_x86_avx512_cvtusi642sd(<2 x double> %a0, i64 %a1) {
104   ; CHECK: vcvtusi2sdqz
105   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
106   ret <2 x double> %res
107 }
108 declare <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double>, i64) nounwind readnone
109
110 define i64 @test_x86_sse2_cvttsd2si64(<2 x double> %a0) {
111   ; CHECK: vcvttsd2siz
112   %res = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
113   ret i64 %res
114 }
115 declare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone
116
117
118 define i64 @test_x86_sse_cvtss2si64(<4 x float> %a0) {
119   ; CHECK: vcvtss2siz
120   %res = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %a0) ; <i64> [#uses=1]
121   ret i64 %res
122 }
123 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
124
125
126 define <4 x float> @test_x86_sse_cvtsi642ss(<4 x float> %a0, i64 %a1) {
127   ; CHECK: vcvtsi2ssqz
128   %res = call <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float> %a0, i64 %a1) ; <<4 x float>> [#uses=1]
129   ret <4 x float> %res
130 }
131 declare <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float>, i64) nounwind readnone
132
133
134 define i64 @test_x86_sse_cvttss2si64(<4 x float> %a0) {
135   ; CHECK: vcvttss2siz
136   %res = call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %a0) ; <i64> [#uses=1]
137   ret i64 %res
138 }
139 declare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone
140
141 define i64 @test_x86_avx512_cvtsd2usi64(<2 x double> %a0) {
142   ; CHECK: vcvtsd2usiz
143   %res = call i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double> %a0) ; <i64> [#uses=1]
144   ret i64 %res
145 }
146 declare i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double>) nounwind readnone