Rename PEXTR to PEXT. Add intrinsics for BMI instructions.
[oota-llvm.git] / test / CodeGen / X86 / bmi.ll
1 ; RUN: llc < %s -march=x86-64 -mattr=+bmi,+bmi2 | FileCheck %s
2
3 define i32 @t1(i32 %x) nounwind  {
4        %tmp = tail call i32 @llvm.cttz.i32( i32 %x )
5        ret i32 %tmp
6 ; CHECK: t1:
7 ; CHECK: tzcntl
8 }
9
10 declare i32 @llvm.cttz.i32(i32) nounwind readnone
11
12 define i16 @t2(i16 %x) nounwind  {
13        %tmp = tail call i16 @llvm.cttz.i16( i16 %x )
14        ret i16 %tmp
15 ; CHECK: t2:
16 ; CHECK: tzcntw
17 }
18
19 declare i16 @llvm.cttz.i16(i16) nounwind readnone
20
21 define i64 @t3(i64 %x) nounwind  {
22        %tmp = tail call i64 @llvm.cttz.i64( i64 %x )
23        ret i64 %tmp
24 ; CHECK: t3:
25 ; CHECK: tzcntq
26 }
27
28 declare i64 @llvm.cttz.i64(i64) nounwind readnone
29
30 define i8 @t4(i8 %x) nounwind  {
31        %tmp = tail call i8 @llvm.cttz.i8( i8 %x )
32        ret i8 %tmp
33 ; CHECK: t4:
34 ; CHECK: tzcntw
35 }
36
37 declare i8 @llvm.cttz.i8(i8) nounwind readnone
38
39 define i32 @andn32(i32 %x, i32 %y) nounwind readnone {
40   %tmp1 = xor i32 %x, -1
41   %tmp2 = and i32 %y, %tmp1
42   ret i32 %tmp2
43 ; CHECK: andn32:
44 ; CHECK: andnl
45 }
46
47 define i64 @andn64(i64 %x, i64 %y) nounwind readnone {
48   %tmp1 = xor i64 %x, -1
49   %tmp2 = and i64 %tmp1, %y
50   ret i64 %tmp2
51 ; CHECK: andn64:
52 ; CHECK: andnq
53 }
54
55 define i32 @bextr32(i32 %x, i32 %y) nounwind readnone {
56   %tmp = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x, i32 %y)
57   ret i32 %tmp
58 ; CHECK: bextr32:
59 ; CHECK: bextrl
60 }
61
62 declare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone
63
64 define i64 @bextr64(i64 %x, i64 %y) nounwind readnone {
65   %tmp = tail call i64 @llvm.x86.bmi.bextr.64(i64 %x, i64 %y)
66   ret i64 %tmp
67 ; CHECK: bextr64:
68 ; CHECK: bextrq
69 }
70
71 declare i64 @llvm.x86.bmi.bextr.64(i64, i64) nounwind readnone
72
73 define i32 @bzhi32(i32 %x, i32 %y) nounwind readnone {
74   %tmp = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %x, i32 %y)
75   ret i32 %tmp
76 ; CHECK: bzhi32:
77 ; CHECK: bzhil
78 }
79
80 declare i32 @llvm.x86.bmi.bzhi.32(i32, i32) nounwind readnone
81
82 define i64 @bzhi64(i64 %x, i64 %y) nounwind readnone {
83   %tmp = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %x, i64 %y)
84   ret i64 %tmp
85 ; CHECK: bzhi64:
86 ; CHECK: bzhiq
87 }
88
89 declare i64 @llvm.x86.bmi.bzhi.64(i64, i64) nounwind readnone
90
91 define i32 @blsi32(i32 %x) nounwind readnone {
92   %tmp = tail call i32 @llvm.x86.bmi.blsi.32(i32 %x)
93   ret i32 %tmp
94 ; CHECK: blsi32:
95 ; CHECK: blsil
96 }
97
98 declare i32 @llvm.x86.bmi.blsi.32(i32) nounwind readnone
99
100 define i64 @blsi64(i64 %x) nounwind readnone {
101   %tmp = tail call i64 @llvm.x86.bmi.blsi.64(i64 %x)
102   ret i64 %tmp
103 ; CHECK: blsi64:
104 ; CHECK: blsiq
105 }
106
107 declare i64 @llvm.x86.bmi.blsi.64(i64) nounwind readnone
108
109 define i32 @blsmsk32(i32 %x) nounwind readnone {
110   %tmp = tail call i32 @llvm.x86.bmi.blsmsk.32(i32 %x)
111   ret i32 %tmp
112 ; CHECK: blsmsk32:
113 ; CHECK: blsmskl
114 }
115
116 declare i32 @llvm.x86.bmi.blsmsk.32(i32) nounwind readnone
117
118 define i64 @blsmsk64(i64 %x) nounwind readnone {
119   %tmp = tail call i64 @llvm.x86.bmi.blsmsk.64(i64 %x)
120   ret i64 %tmp
121 ; CHECK: blsmsk64:
122 ; CHECK: blsmskq
123 }
124
125 declare i64 @llvm.x86.bmi.blsmsk.64(i64) nounwind readnone
126
127 define i32 @blsr32(i32 %x) nounwind readnone {
128   %tmp = tail call i32 @llvm.x86.bmi.blsr.32(i32 %x)
129   ret i32 %tmp
130 ; CHECK: blsr32:
131 ; CHECK: blsrl
132 }
133
134 declare i32 @llvm.x86.bmi.blsr.32(i32) nounwind readnone
135
136 define i64 @blsr64(i64 %x) nounwind readnone {
137   %tmp = tail call i64 @llvm.x86.bmi.blsr.64(i64 %x)
138   ret i64 %tmp
139 ; CHECK: blsr64:
140 ; CHECK: blsrq
141 }
142
143 declare i64 @llvm.x86.bmi.blsr.64(i64) nounwind readnone
144
145 define i32 @pdep32(i32 %x, i32 %y) nounwind readnone {
146   %tmp = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 %y)
147   ret i32 %tmp
148 ; CHECK: pdep32:
149 ; CHECK: pdepl
150 }
151
152 declare i32 @llvm.x86.bmi.pdep.32(i32, i32) nounwind readnone
153
154 define i64 @pdep64(i64 %x, i64 %y) nounwind readnone {
155   %tmp = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 %y)
156   ret i64 %tmp
157 ; CHECK: pdep64:
158 ; CHECK: pdepq
159 }
160
161 declare i64 @llvm.x86.bmi.pdep.64(i64, i64) nounwind readnone
162
163 define i32 @pext32(i32 %x, i32 %y) nounwind readnone {
164   %tmp = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 %y)
165   ret i32 %tmp
166 ; CHECK: pext32:
167 ; CHECK: pextl
168 }
169
170 declare i32 @llvm.x86.bmi.pext.32(i32, i32) nounwind readnone
171
172 define i64 @pext64(i64 %x, i64 %y) nounwind readnone {
173   %tmp = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 %y)
174   ret i64 %tmp
175 ; CHECK: pext64:
176 ; CHECK: pextq
177 }
178
179 declare i64 @llvm.x86.bmi.pext.64(i64, i64) nounwind readnone
180