[x86] Clean up a bunch of vector shuffle tests with my script. Notably,
[oota-llvm.git] / test / CodeGen / X86 / avx512-shift.ll
1 ;RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s
2
3 ;CHECK-LABEL: shift_16_i32
4 ;CHECK: vpsrld
5 ;CHECK: vpslld
6 ;CHECK: vpsrad
7 ;CHECK: ret
8 define <16 x i32> @shift_16_i32(<16 x i32> %a) {
9    %b = lshr <16 x i32> %a, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
10    %c = shl <16 x i32> %b, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12>
11    %d = ashr <16 x i32> %c, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12>
12    ret <16 x i32> %d;
13 }
14
15 ;CHECK-LABEL: shift_8_i64
16 ;CHECK: vpsrlq
17 ;CHECK: vpsllq
18 ;CHECK: vpsraq
19 ;CHECK: ret
20 define <8 x i64> @shift_8_i64(<8 x i64> %a) {
21    %b = lshr <8 x i64> %a, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
22    %c = shl <8 x i64> %b,  <i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12>
23    %d = ashr <8 x i64> %c, <i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12>
24    ret <8 x i64> %d;
25 }
26
27 ; CHECK-LABEL: variable_shl4
28 ; CHECK: vpsllvq %zmm
29 ; CHECK: ret
30 define <8 x i64> @variable_shl4(<8 x i64> %x, <8 x i64> %y) {
31   %k = shl <8 x i64> %x, %y
32   ret <8 x i64> %k
33 }
34
35 ; CHECK-LABEL: variable_shl5
36 ; CHECK: vpsllvd %zmm
37 ; CHECK: ret
38 define <16 x i32> @variable_shl5(<16 x i32> %x, <16 x i32> %y) {
39   %k = shl <16 x i32> %x, %y
40   ret <16 x i32> %k
41 }
42
43 ; CHECK-LABEL: variable_srl0
44 ; CHECK: vpsrlvd
45 ; CHECK: ret
46 define <16 x i32> @variable_srl0(<16 x i32> %x, <16 x i32> %y) {
47   %k = lshr <16 x i32> %x, %y
48   ret <16 x i32> %k
49 }
50
51 ; CHECK-LABEL: variable_srl2
52 ; CHECK: psrlvq
53 ; CHECK: ret
54 define <8 x i64> @variable_srl2(<8 x i64> %x, <8 x i64> %y) {
55   %k = lshr <8 x i64> %x, %y
56   ret <8 x i64> %k
57 }
58
59 ; CHECK-LABEL: variable_sra1
60 ; CHECK: vpsravd
61 ; CHECK: ret
62 define <16 x i32> @variable_sra1(<16 x i32> %x, <16 x i32> %y) {
63   %k = ashr <16 x i32> %x, %y
64   ret <16 x i32> %k
65 }
66
67 ; CHECK-LABEL: variable_sra2
68 ; CHECK: vpsravq %zmm
69 ; CHECK: ret
70 define <8 x i64> @variable_sra2(<8 x i64> %x, <8 x i64> %y) {
71   %k = ashr <8 x i64> %x, %y
72   ret <8 x i64> %k
73 }
74
75 ; CHECK-LABEL: variable_sra01_load
76 ; CHECK: vpsravd (%
77 ; CHECK: ret
78 define <16 x i32> @variable_sra01_load(<16 x i32> %x, <16 x i32>* %y) {
79   %y1 = load <16 x i32>* %y
80   %k = ashr <16 x i32> %x, %y1
81   ret <16 x i32> %k
82 }
83
84 ; CHECK-LABEL: variable_shl1_load
85 ; CHECK: vpsllvd (%
86 ; CHECK: ret
87 define <16 x i32> @variable_shl1_load(<16 x i32> %x, <16 x i32>* %y) {
88   %y1 = load <16 x i32>* %y
89   %k = shl <16 x i32> %x, %y1
90   ret <16 x i32> %k
91 }
92 ; CHECK: variable_srl0_load
93 ; CHECK: vpsrlvd (%
94 ; CHECK: ret
95 define <16 x i32> @variable_srl0_load(<16 x i32> %x, <16 x i32>* %y) {
96   %y1 = load <16 x i32>* %y
97   %k = lshr <16 x i32> %x, %y1
98   ret <16 x i32> %k
99 }
100
101 ; CHECK: variable_srl3_load
102 ; CHECK: vpsrlvq (%
103 ; CHECK: ret
104 define <8 x i64> @variable_srl3_load(<8 x i64> %x, <8 x i64>* %y) {
105   %y1 = load <8 x i64>* %y
106   %k = lshr <8 x i64> %x, %y1
107   ret <8 x i64> %k
108 }