blob: 261f24b03dc73339040b733c763972b65fdfdb41 [file] [log] [blame]
Craig Topper717cdb02011-10-19 07:48:35 +00001; RUN: llc < %s -march=x86-64 -mattr=+bmi,+bmi2 | FileCheck %s
Craig Topper909652f2011-10-14 03:21:46 +00002
Chandler Carruth131f7d32011-12-24 11:11:36 +00003declare i8 @llvm.cttz.i8(i8, i1) nounwind readnone
4declare i16 @llvm.cttz.i16(i16, i1) nounwind readnone
5declare i32 @llvm.cttz.i32(i32, i1) nounwind readnone
6declare i64 @llvm.cttz.i64(i64, i1) nounwind readnone
7
8define i8 @t1(i8 %x) nounwind {
9 %tmp = tail call i8 @llvm.cttz.i8( i8 %x, i1 false )
10 ret i8 %tmp
Craig Topper909652f2011-10-14 03:21:46 +000011; CHECK: t1:
Chandler Carruth131f7d32011-12-24 11:11:36 +000012; CHECK: tzcntw
Craig Topper909652f2011-10-14 03:21:46 +000013}
14
Craig Topper909652f2011-10-14 03:21:46 +000015define i16 @t2(i16 %x) nounwind {
Chandler Carruth131f7d32011-12-24 11:11:36 +000016 %tmp = tail call i16 @llvm.cttz.i16( i16 %x, i1 false )
17 ret i16 %tmp
Craig Topper909652f2011-10-14 03:21:46 +000018; CHECK: t2:
19; CHECK: tzcntw
20}
21
Chandler Carruth131f7d32011-12-24 11:11:36 +000022define i32 @t3(i32 %x) nounwind {
23 %tmp = tail call i32 @llvm.cttz.i32( i32 %x, i1 false )
24 ret i32 %tmp
Craig Topper909652f2011-10-14 03:21:46 +000025; CHECK: t3:
Chandler Carruth131f7d32011-12-24 11:11:36 +000026; CHECK: tzcntl
27}
28
29define i64 @t4(i64 %x) nounwind {
30 %tmp = tail call i64 @llvm.cttz.i64( i64 %x, i1 false )
31 ret i64 %tmp
32; CHECK: t4:
Craig Topper909652f2011-10-14 03:21:46 +000033; CHECK: tzcntq
34}
35
Craig Topper54a11172011-10-14 07:06:56 +000036define i32 @andn32(i32 %x, i32 %y) nounwind readnone {
37 %tmp1 = xor i32 %x, -1
38 %tmp2 = and i32 %y, %tmp1
39 ret i32 %tmp2
40; CHECK: andn32:
41; CHECK: andnl
42}
43
44define i64 @andn64(i64 %x, i64 %y) nounwind readnone {
45 %tmp1 = xor i64 %x, -1
46 %tmp2 = and i64 %tmp1, %y
47 ret i64 %tmp2
48; CHECK: andn64:
49; CHECK: andnq
50}
Craig Topper717cdb02011-10-19 07:48:35 +000051
52define i32 @bextr32(i32 %x, i32 %y) nounwind readnone {
53 %tmp = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x, i32 %y)
54 ret i32 %tmp
55; CHECK: bextr32:
56; CHECK: bextrl
57}
58
59declare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone
60
61define i64 @bextr64(i64 %x, i64 %y) nounwind readnone {
62 %tmp = tail call i64 @llvm.x86.bmi.bextr.64(i64 %x, i64 %y)
63 ret i64 %tmp
64; CHECK: bextr64:
65; CHECK: bextrq
66}
67
68declare i64 @llvm.x86.bmi.bextr.64(i64, i64) nounwind readnone
69
70define i32 @bzhi32(i32 %x, i32 %y) nounwind readnone {
71 %tmp = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %x, i32 %y)
72 ret i32 %tmp
73; CHECK: bzhi32:
74; CHECK: bzhil
75}
76
77declare i32 @llvm.x86.bmi.bzhi.32(i32, i32) nounwind readnone
78
79define i64 @bzhi64(i64 %x, i64 %y) nounwind readnone {
80 %tmp = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %x, i64 %y)
81 ret i64 %tmp
82; CHECK: bzhi64:
83; CHECK: bzhiq
84}
85
86declare i64 @llvm.x86.bmi.bzhi.64(i64, i64) nounwind readnone
87
88define i32 @blsi32(i32 %x) nounwind readnone {
Craig Topperb4c94572011-10-21 06:55:01 +000089 %tmp = sub i32 0, %x
90 %tmp2 = and i32 %x, %tmp
91 ret i32 %tmp2
Craig Topper717cdb02011-10-19 07:48:35 +000092; CHECK: blsi32:
93; CHECK: blsil
94}
95
Craig Topper717cdb02011-10-19 07:48:35 +000096define i64 @blsi64(i64 %x) nounwind readnone {
Craig Topperb4c94572011-10-21 06:55:01 +000097 %tmp = sub i64 0, %x
98 %tmp2 = and i64 %tmp, %x
99 ret i64 %tmp2
Craig Topper717cdb02011-10-19 07:48:35 +0000100; CHECK: blsi64:
101; CHECK: blsiq
102}
103
Craig Topper717cdb02011-10-19 07:48:35 +0000104define i32 @blsmsk32(i32 %x) nounwind readnone {
Craig Topperb4c94572011-10-21 06:55:01 +0000105 %tmp = sub i32 %x, 1
106 %tmp2 = xor i32 %x, %tmp
107 ret i32 %tmp2
Craig Topper717cdb02011-10-19 07:48:35 +0000108; CHECK: blsmsk32:
109; CHECK: blsmskl
110}
111
Craig Topper717cdb02011-10-19 07:48:35 +0000112define i64 @blsmsk64(i64 %x) nounwind readnone {
Craig Topperb4c94572011-10-21 06:55:01 +0000113 %tmp = sub i64 %x, 1
114 %tmp2 = xor i64 %tmp, %x
115 ret i64 %tmp2
Craig Topper717cdb02011-10-19 07:48:35 +0000116; CHECK: blsmsk64:
117; CHECK: blsmskq
118}
119
Craig Topper717cdb02011-10-19 07:48:35 +0000120define i32 @blsr32(i32 %x) nounwind readnone {
Craig Topperb4c94572011-10-21 06:55:01 +0000121 %tmp = sub i32 %x, 1
122 %tmp2 = and i32 %x, %tmp
123 ret i32 %tmp2
Craig Topper717cdb02011-10-19 07:48:35 +0000124; CHECK: blsr32:
125; CHECK: blsrl
126}
127
Craig Topper717cdb02011-10-19 07:48:35 +0000128define i64 @blsr64(i64 %x) nounwind readnone {
Craig Topperb4c94572011-10-21 06:55:01 +0000129 %tmp = sub i64 %x, 1
130 %tmp2 = and i64 %tmp, %x
131 ret i64 %tmp2
Craig Topper717cdb02011-10-19 07:48:35 +0000132; CHECK: blsr64:
133; CHECK: blsrq
134}
135
Craig Topper717cdb02011-10-19 07:48:35 +0000136define i32 @pdep32(i32 %x, i32 %y) nounwind readnone {
137 %tmp = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 %y)
138 ret i32 %tmp
139; CHECK: pdep32:
140; CHECK: pdepl
141}
142
143declare i32 @llvm.x86.bmi.pdep.32(i32, i32) nounwind readnone
144
145define i64 @pdep64(i64 %x, i64 %y) nounwind readnone {
146 %tmp = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 %y)
147 ret i64 %tmp
148; CHECK: pdep64:
149; CHECK: pdepq
150}
151
152declare i64 @llvm.x86.bmi.pdep.64(i64, i64) nounwind readnone
153
154define i32 @pext32(i32 %x, i32 %y) nounwind readnone {
155 %tmp = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 %y)
156 ret i32 %tmp
157; CHECK: pext32:
158; CHECK: pextl
159}
160
161declare i32 @llvm.x86.bmi.pext.32(i32, i32) nounwind readnone
162
163define i64 @pext64(i64 %x, i64 %y) nounwind readnone {
164 %tmp = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 %y)
165 ret i64 %tmp
166; CHECK: pext64:
167; CHECK: pextq
168}
169
170declare i64 @llvm.x86.bmi.pext.64(i64, i64) nounwind readnone
171