Add lowering for AVX2 shift instructions.
[oota-llvm.git] / test / CodeGen / X86 / avx2-shift.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -mattr=+avx2 | FileCheck %s
2
3 ; CHECK: variable_shl0
4 ; CHECK: psllvd
5 ; CHECK: ret
6 define <4 x i32> @variable_shl0(<4 x i32> %x, <4 x i32> %y) {
7   %k = shl <4 x i32> %x, %y
8   ret <4 x i32> %k
9 }
10 ; CHECK: variable_shl1
11 ; CHECK: psllvd
12 ; CHECK: ret
13 define <8 x i32> @variable_shl1(<8 x i32> %x, <8 x i32> %y) {
14   %k = shl <8 x i32> %x, %y
15   ret <8 x i32> %k
16 }
17 ; CHECK: variable_shl2
18 ; CHECK: psllvq
19 ; CHECK: ret
20 define <2 x i64> @variable_shl2(<2 x i64> %x, <2 x i64> %y) {
21   %k = shl <2 x i64> %x, %y
22   ret <2 x i64> %k
23 }
24 ; CHECK: variable_shl3
25 ; CHECK: psllvq
26 ; CHECK: ret
27 define <4 x i64> @variable_shl3(<4 x i64> %x, <4 x i64> %y) {
28   %k = shl <4 x i64> %x, %y
29   ret <4 x i64> %k
30 }
31 ; CHECK: variable_srl0
32 ; CHECK: psrlvd
33 ; CHECK: ret
34 define <4 x i32> @variable_srl0(<4 x i32> %x, <4 x i32> %y) {
35   %k = lshr <4 x i32> %x, %y
36   ret <4 x i32> %k
37 }
38 ; CHECK: variable_srl1
39 ; CHECK: psrlvd
40 ; CHECK: ret
41 define <8 x i32> @variable_srl1(<8 x i32> %x, <8 x i32> %y) {
42   %k = lshr <8 x i32> %x, %y
43   ret <8 x i32> %k
44 }
45 ; CHECK: variable_srl2
46 ; CHECK: psrlvq
47 ; CHECK: ret
48 define <2 x i64> @variable_srl2(<2 x i64> %x, <2 x i64> %y) {
49   %k = lshr <2 x i64> %x, %y
50   ret <2 x i64> %k
51 }
52 ; CHECK: variable_srl3
53 ; CHECK: psrlvq
54 ; CHECK: ret
55 define <4 x i64> @variable_srl3(<4 x i64> %x, <4 x i64> %y) {
56   %k = lshr <4 x i64> %x, %y
57   ret <4 x i64> %k
58 }
59
60 ; CHECK: variable_sra0
61 ; CHECK: psravd
62 ; CHECK: ret
63 define <4 x i32> @variable_sra0(<4 x i32> %x, <4 x i32> %y) {
64   %k = ashr <4 x i32> %x, %y
65   ret <4 x i32> %k
66 }
67 ; CHECK: variable_sra1
68 ; CHECK: psravd
69 ; CHECK: ret
70 define <8 x i32> @variable_sra1(<8 x i32> %x, <8 x i32> %y) {
71   %k = ashr <8 x i32> %x, %y
72   ret <8 x i32> %k
73 }
74
75 ;;; Shift left
76 ; CHECK: vpslld
77 define <8 x i32> @vshift00(<8 x i32> %a) nounwind readnone {
78   %s = shl <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
79 2>
80   ret <8 x i32> %s
81 }
82
83 ; CHECK: vpsllw
84 define <16 x i16> @vshift01(<16 x i16> %a) nounwind readnone {
85   %s = shl <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
86   ret <16 x i16> %s
87 }
88
89 ; CHECK: vpsllq
90 define <4 x i64> @vshift02(<4 x i64> %a) nounwind readnone {
91   %s = shl <4 x i64> %a, <i64 2, i64 2, i64 2, i64 2>
92   ret <4 x i64> %s
93 }
94
95 ;;; Logical Shift right
96 ; CHECK: vpsrld
97 define <8 x i32> @vshift03(<8 x i32> %a) nounwind readnone {
98   %s = lshr <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
99 2>
100   ret <8 x i32> %s
101 }
102
103 ; CHECK: vpsrlw
104 define <16 x i16> @vshift04(<16 x i16> %a) nounwind readnone {
105   %s = lshr <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
106   ret <16 x i16> %s
107 }
108
109 ; CHECK: vpsrlq
110 define <4 x i64> @vshift05(<4 x i64> %a) nounwind readnone {
111   %s = lshr <4 x i64> %a, <i64 2, i64 2, i64 2, i64 2>
112   ret <4 x i64> %s
113 }
114
115 ;;; Arithmetic Shift right
116 ; CHECK: vpsrad
117 define <8 x i32> @vshift06(<8 x i32> %a) nounwind readnone {
118   %s = ashr <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
119 2>
120   ret <8 x i32> %s
121 }
122
123 ; CHECK: vpsraw
124 define <16 x i16> @vshift07(<16 x i16> %a) nounwind readnone {
125   %s = ashr <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
126   ret <16 x i16> %s
127 }
128
129 ; CHECK: variable_sra0_load
130 ; CHECK: psravd (%
131 ; CHECK: ret
132 define <4 x i32> @variable_sra0_load(<4 x i32> %x, <4 x i32>* %y) {
133   %y1 = load <4 x i32>* %y
134   %k = ashr <4 x i32> %x, %y1
135   ret <4 x i32> %k
136 }
137
138 ; CHECK: variable_sra1_load
139 ; CHECK: psravd (%
140 ; CHECK: ret
141 define <8 x i32> @variable_sra1_load(<8 x i32> %x, <8 x i32>* %y) {
142   %y1 = load <8 x i32>* %y
143   %k = ashr <8 x i32> %x, %y1
144   ret <8 x i32> %k
145 }
146
147 ; CHECK: variable_shl0_load
148 ; CHECK: psllvd (%
149 ; CHECK: ret
150 define <4 x i32> @variable_shl0_load(<4 x i32> %x, <4 x i32>* %y) {
151   %y1 = load <4 x i32>* %y
152   %k = shl <4 x i32> %x, %y1
153   ret <4 x i32> %k
154 }
155 ; CHECK: variable_shl1_load
156 ; CHECK: psllvd (%
157 ; CHECK: ret
158 define <8 x i32> @variable_shl1_load(<8 x i32> %x, <8 x i32>* %y) {
159   %y1 = load <8 x i32>* %y
160   %k = shl <8 x i32> %x, %y1
161   ret <8 x i32> %k
162 }
163 ; CHECK: variable_shl2_load
164 ; CHECK: psllvq (%
165 ; CHECK: ret
166 define <2 x i64> @variable_shl2_load(<2 x i64> %x, <2 x i64>* %y) {
167   %y1 = load <2 x i64>* %y
168   %k = shl <2 x i64> %x, %y1
169   ret <2 x i64> %k
170 }
171 ; CHECK: variable_shl3_load
172 ; CHECK: psllvq (%
173 ; CHECK: ret
174 define <4 x i64> @variable_shl3_load(<4 x i64> %x, <4 x i64>* %y) {
175   %y1 = load <4 x i64>* %y
176   %k = shl <4 x i64> %x, %y1
177   ret <4 x i64> %k
178 }
179 ; CHECK: variable_srl0_load
180 ; CHECK: psrlvd (%
181 ; CHECK: ret
182 define <4 x i32> @variable_srl0_load(<4 x i32> %x, <4 x i32>* %y) {
183   %y1 = load <4 x i32>* %y
184   %k = lshr <4 x i32> %x, %y1
185   ret <4 x i32> %k
186 }
187 ; CHECK: variable_srl1_load
188 ; CHECK: psrlvd (%
189 ; CHECK: ret
190 define <8 x i32> @variable_srl1_load(<8 x i32> %x, <8 x i32>* %y) {
191   %y1 = load <8 x i32>* %y
192   %k = lshr <8 x i32> %x, %y1
193   ret <8 x i32> %k
194 }
195 ; CHECK: variable_srl2_load
196 ; CHECK: psrlvq (%
197 ; CHECK: ret
198 define <2 x i64> @variable_srl2_load(<2 x i64> %x, <2 x i64>* %y) {
199   %y1 = load <2 x i64>* %y
200   %k = lshr <2 x i64> %x, %y1
201   ret <2 x i64> %k
202 }
203 ; CHECK: variable_srl3_load
204 ; CHECK: psrlvq (%
205 ; CHECK: ret
206 define <4 x i64> @variable_srl3_load(<4 x i64> %x, <4 x i64>* %y) {
207   %y1 = load <4 x i64>* %y
208   %k = lshr <4 x i64> %x, %y1
209   ret <4 x i64> %k
210 }