Replace all weight-based interfaces in MBB with probability-based interfaces, and...
[oota-llvm.git] / test / CodeGen / X86 / shift-bmi2.ll
1 ; RUN: llc -mtriple=i386-unknown-unknown -mcpu=core-avx2 < %s | FileCheck --check-prefix=BMI2 %s
2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=core-avx2 < %s | FileCheck --check-prefix=BMI264 %s
3
4 define i32 @shl32(i32 %x, i32 %shamt) nounwind uwtable readnone {
5 entry:
6   %shl = shl i32 %x, %shamt
7 ; BMI2: shl32
8 ; BMI2: shlxl
9 ; BMI2: ret
10 ; BMI264: shl32
11 ; BMI264: shlxl
12 ; BMI264: ret
13   ret i32 %shl
14 }
15
16 define i32 @shl32i(i32 %x) nounwind uwtable readnone {
17 entry:
18   %shl = shl i32 %x, 5
19 ; BMI2: shl32i
20 ; BMI2-NOT: shlxl
21 ; BMI2: ret
22 ; BMI264: shl32i
23 ; BMI264-NOT: shlxl
24 ; BMI264: ret
25   ret i32 %shl
26 }
27
28 define i32 @shl32p(i32* %p, i32 %shamt) nounwind uwtable readnone {
29 entry:
30   %x = load i32, i32* %p
31   %shl = shl i32 %x, %shamt
32 ; BMI2: shl32p
33 ; BMI2: shlxl %{{.+}}, ({{.+}}), %{{.+}}
34 ; BMI2: ret
35 ; BMI264: shl32p
36 ; BMI264: shlxl %{{.+}}, ({{.+}}), %{{.+}}
37 ; BMI264: ret
38   ret i32 %shl
39 }
40
41 define i32 @shl32pi(i32* %p) nounwind uwtable readnone {
42 entry:
43   %x = load i32, i32* %p
44   %shl = shl i32 %x, 5
45 ; BMI2: shl32pi
46 ; BMI2-NOT: shlxl
47 ; BMI2: ret
48 ; BMI264: shl32pi
49 ; BMI264-NOT: shlxl
50 ; BMI264: ret
51   ret i32 %shl
52 }
53
54 define i64 @shl64(i64 %x, i64 %shamt) nounwind uwtable readnone {
55 entry:
56   %shl = shl i64 %x, %shamt
57 ; BMI264: shl64
58 ; BMI264: shlxq
59 ; BMI264: ret
60   ret i64 %shl
61 }
62
63 define i64 @shl64i(i64 %x) nounwind uwtable readnone {
64 entry:
65   %shl = shl i64 %x, 7
66 ; BMI264: shl64i
67 ; BMI264-NOT: shlxq
68 ; BMI264: ret
69   ret i64 %shl
70 }
71
72 define i64 @shl64p(i64* %p, i64 %shamt) nounwind uwtable readnone {
73 entry:
74   %x = load i64, i64* %p
75   %shl = shl i64 %x, %shamt
76 ; BMI264: shl64p
77 ; BMI264: shlxq %{{.+}}, ({{.+}}), %{{.+}}
78 ; BMI264: ret
79   ret i64 %shl
80 }
81
82 define i64 @shl64pi(i64* %p) nounwind uwtable readnone {
83 entry:
84   %x = load i64, i64* %p
85   %shl = shl i64 %x, 7
86 ; BMI264: shl64pi
87 ; BMI264-NOT: shlxq
88 ; BMI264: ret
89   ret i64 %shl
90 }
91
92 define i32 @lshr32(i32 %x, i32 %shamt) nounwind uwtable readnone {
93 entry:
94   %shl = lshr i32 %x, %shamt
95 ; BMI2: lshr32
96 ; BMI2: shrxl
97 ; BMI2: ret
98 ; BMI264: lshr32
99 ; BMI264: shrxl
100 ; BMI264: ret
101   ret i32 %shl
102 }
103
104 define i32 @lshr32p(i32* %p, i32 %shamt) nounwind uwtable readnone {
105 entry:
106   %x = load i32, i32* %p
107   %shl = lshr i32 %x, %shamt
108 ; BMI2: lshr32p
109 ; BMI2: shrxl %{{.+}}, ({{.+}}), %{{.+}}
110 ; BMI2: ret
111 ; BMI264: lshr32p
112 ; BMI264: shrxl %{{.+}}, ({{.+}}), %{{.+}}
113 ; BMI264: ret
114   ret i32 %shl
115 }
116
117 define i64 @lshr64(i64 %x, i64 %shamt) nounwind uwtable readnone {
118 entry:
119   %shl = lshr i64 %x, %shamt
120 ; BMI264: lshr64
121 ; BMI264: shrxq
122 ; BMI264: ret
123   ret i64 %shl
124 }
125
126 define i64 @lshr64p(i64* %p, i64 %shamt) nounwind uwtable readnone {
127 entry:
128   %x = load i64, i64* %p
129   %shl = lshr i64 %x, %shamt
130 ; BMI264: lshr64p
131 ; BMI264: shrxq %{{.+}}, ({{.+}}), %{{.+}}
132 ; BMI264: ret
133   ret i64 %shl
134 }
135
136 define i32 @ashr32(i32 %x, i32 %shamt) nounwind uwtable readnone {
137 entry:
138   %shl = ashr i32 %x, %shamt
139 ; BMI2: ashr32
140 ; BMI2: sarxl
141 ; BMI2: ret
142 ; BMI264: ashr32
143 ; BMI264: sarxl
144 ; BMI264: ret
145   ret i32 %shl
146 }
147
148 define i32 @ashr32p(i32* %p, i32 %shamt) nounwind uwtable readnone {
149 entry:
150   %x = load i32, i32* %p
151   %shl = ashr i32 %x, %shamt
152 ; BMI2: ashr32p
153 ; Source order scheduling prevents folding, rdar:14208996.
154 ; BMI2: sarxl %{{.+}}, ({{.+}}), %{{.+}}
155 ; BMI2: ret
156 ; BMI264: ashr32p
157 ; BMI264: sarxl %{{.+}}, ({{.+}}), %{{.+}}
158 ; BMI264: ret
159   ret i32 %shl
160 }
161
162 define i64 @ashr64(i64 %x, i64 %shamt) nounwind uwtable readnone {
163 entry:
164   %shl = ashr i64 %x, %shamt
165 ; BMI264: ashr64
166 ; BMI264: sarxq
167 ; BMI264: ret
168   ret i64 %shl
169 }
170
171 define i64 @ashr64p(i64* %p, i64 %shamt) nounwind uwtable readnone {
172 entry:
173   %x = load i64, i64* %p
174   %shl = ashr i64 %x, %shamt
175 ; BMI264: ashr64p
176 ; BMI264: sarxq %{{.+}}, ({{.+}}), %{{.+}}
177 ; BMI264: ret
178   ret i64 %shl
179 }