[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / x86-64-bittest-logic.ll
blob253a5d124995398ae2cf2615cb632365190371c2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s
4 define i64 @and1(i64 %x) {
5 ; CHECK-LABEL: and1:
6 ; CHECK:       # %bb.0:
7 ; CHECK-NEXT:    movabsq $-2147483649, %rax # imm = 0xFFFFFFFF7FFFFFFF
8 ; CHECK-NEXT:    andq %rdi, %rax
9 ; CHECK-NEXT:    retq
10   %a = and i64 %x, 18446744071562067967 ; clear bit 31
11   ret i64 %a
14 define i64 @and2(i64 %x) {
15 ; CHECK-LABEL: and2:
16 ; CHECK:       # %bb.0:
17 ; CHECK-NEXT:    movabsq $-4294967297, %rax # imm = 0xFFFFFFFEFFFFFFFF
18 ; CHECK-NEXT:    andq %rdi, %rax
19 ; CHECK-NEXT:    retq
20   %a = and i64 %x, 18446744069414584319 ; clear bit 32
21   ret i64 %a
24 define i64 @and3(i64 %x) {
25 ; CHECK-LABEL: and3:
26 ; CHECK:       # %bb.0:
27 ; CHECK-NEXT:    movabsq $-4611686018427387905, %rax # imm = 0xBFFFFFFFFFFFFFFF
28 ; CHECK-NEXT:    andq %rdi, %rax
29 ; CHECK-NEXT:    retq
30   %a = and i64 %x, 13835058055282163711 ; clear bit 62
31   ret i64 %a
34 define i64 @and4(i64 %x) {
35 ; CHECK-LABEL: and4:
36 ; CHECK:       # %bb.0:
37 ; CHECK-NEXT:    movabsq $9223372036854775807, %rax # imm = 0x7FFFFFFFFFFFFFFF
38 ; CHECK-NEXT:    andq %rdi, %rax
39 ; CHECK-NEXT:    retq
40   %a = and i64 %x, 9223372036854775807 ; clear bit 63
41   ret i64 %a
44 define i64 @or1(i64 %x) {
45 ; CHECK-LABEL: or1:
46 ; CHECK:       # %bb.0:
47 ; CHECK-NEXT:    movl $2147483648, %eax # imm = 0x80000000
48 ; CHECK-NEXT:    orq %rdi, %rax
49 ; CHECK-NEXT:    retq
50   %a = or i64 %x, 2147483648 ; set bit 31
51   ret i64 %a
54 define i64 @or2(i64 %x) {
55 ; CHECK-LABEL: or2:
56 ; CHECK:       # %bb.0:
57 ; CHECK-NEXT:    movabsq $4294967296, %rax # imm = 0x100000000
58 ; CHECK-NEXT:    orq %rdi, %rax
59 ; CHECK-NEXT:    retq
60   %a = or i64 %x, 4294967296 ; set bit 32
61   ret i64 %a
64 define i64 @or3(i64 %x) {
65 ; CHECK-LABEL: or3:
66 ; CHECK:       # %bb.0:
67 ; CHECK-NEXT:    movabsq $4611686018427387904, %rax # imm = 0x4000000000000000
68 ; CHECK-NEXT:    orq %rdi, %rax
69 ; CHECK-NEXT:    retq
70   %a = or i64 %x, 4611686018427387904 ; set bit 62
71   ret i64 %a
74 define i64 @or4(i64 %x) {
75 ; CHECK-LABEL: or4:
76 ; CHECK:       # %bb.0:
77 ; CHECK-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
78 ; CHECK-NEXT:    orq %rdi, %rax
79 ; CHECK-NEXT:    retq
80   %a = or i64 %x, 9223372036854775808 ; set bit 63
81   ret i64 %a
84 define i64 @xor1(i64 %x) {
85 ; CHECK-LABEL: xor1:
86 ; CHECK:       # %bb.0:
87 ; CHECK-NEXT:    movl $2147483648, %eax # imm = 0x80000000
88 ; CHECK-NEXT:    xorq %rdi, %rax
89 ; CHECK-NEXT:    retq
90   %a = xor i64 %x, 2147483648 ; toggle bit 31
91   ret i64 %a
94 define i64 @xor2(i64 %x) {
95 ; CHECK-LABEL: xor2:
96 ; CHECK:       # %bb.0:
97 ; CHECK-NEXT:    movabsq $4294967296, %rax # imm = 0x100000000
98 ; CHECK-NEXT:    xorq %rdi, %rax
99 ; CHECK-NEXT:    retq
100   %a = xor i64 %x, 4294967296 ; toggle bit 32
101   ret i64 %a
104 define i64 @xor3(i64 %x) {
105 ; CHECK-LABEL: xor3:
106 ; CHECK:       # %bb.0:
107 ; CHECK-NEXT:    movabsq $4611686018427387904, %rax # imm = 0x4000000000000000
108 ; CHECK-NEXT:    xorq %rdi, %rax
109 ; CHECK-NEXT:    retq
110   %a = xor i64 %x, 4611686018427387904 ; toggle bit 62
111   ret i64 %a
114 define i64 @xor4(i64 %x) {
115 ; CHECK-LABEL: xor4:
116 ; CHECK:       # %bb.0:
117 ; CHECK-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
118 ; CHECK-NEXT:    xorq %rdi, %rax
119 ; CHECK-NEXT:    retq
120   %a = xor i64 %x, 9223372036854775808 ; toggle bit 63
121   ret i64 %a
124 define i64 @and1_optsize(i64 %x) optsize {
125 ; CHECK-LABEL: and1_optsize:
126 ; CHECK:       # %bb.0:
127 ; CHECK-NEXT:    movq %rdi, %rax
128 ; CHECK-NEXT:    btrq $31, %rax
129 ; CHECK-NEXT:    retq
130   %a = and i64 %x, 18446744071562067967 ; clear bit 31
131   ret i64 %a
134 define i64 @and2_optsize(i64 %x) optsize {
135 ; CHECK-LABEL: and2_optsize:
136 ; CHECK:       # %bb.0:
137 ; CHECK-NEXT:    movq %rdi, %rax
138 ; CHECK-NEXT:    btrq $32, %rax
139 ; CHECK-NEXT:    retq
140   %a = and i64 %x, 18446744069414584319 ; clear bit 32
141   ret i64 %a
144 define i64 @and3_optsize(i64 %x) optsize {
145 ; CHECK-LABEL: and3_optsize:
146 ; CHECK:       # %bb.0:
147 ; CHECK-NEXT:    movq %rdi, %rax
148 ; CHECK-NEXT:    btrq $62, %rax
149 ; CHECK-NEXT:    retq
150   %a = and i64 %x, 13835058055282163711 ; clear bit 62
151   ret i64 %a
154 define i64 @and4_optsize(i64 %x) optsize {
155 ; CHECK-LABEL: and4_optsize:
156 ; CHECK:       # %bb.0:
157 ; CHECK-NEXT:    movq %rdi, %rax
158 ; CHECK-NEXT:    btrq $63, %rax
159 ; CHECK-NEXT:    retq
160   %a = and i64 %x, 9223372036854775807 ; clear bit 63
161   ret i64 %a
164 define i64 @or1_optsize(i64 %x) optsize {
165 ; CHECK-LABEL: or1_optsize:
166 ; CHECK:       # %bb.0:
167 ; CHECK-NEXT:    movq %rdi, %rax
168 ; CHECK-NEXT:    btsq $31, %rax
169 ; CHECK-NEXT:    retq
170   %a = or i64 %x, 2147483648 ; set bit 31
171   ret i64 %a
174 define i64 @or2_optsize(i64 %x) optsize {
175 ; CHECK-LABEL: or2_optsize:
176 ; CHECK:       # %bb.0:
177 ; CHECK-NEXT:    movq %rdi, %rax
178 ; CHECK-NEXT:    btsq $32, %rax
179 ; CHECK-NEXT:    retq
180   %a = or i64 %x, 4294967296 ; set bit 32
181   ret i64 %a
184 define i64 @or3_optsize(i64 %x) optsize {
185 ; CHECK-LABEL: or3_optsize:
186 ; CHECK:       # %bb.0:
187 ; CHECK-NEXT:    movq %rdi, %rax
188 ; CHECK-NEXT:    btsq $62, %rax
189 ; CHECK-NEXT:    retq
190   %a = or i64 %x, 4611686018427387904 ; set bit 62
191   ret i64 %a
194 define i64 @or4_optsize(i64 %x) optsize {
195 ; CHECK-LABEL: or4_optsize:
196 ; CHECK:       # %bb.0:
197 ; CHECK-NEXT:    movq %rdi, %rax
198 ; CHECK-NEXT:    btsq $63, %rax
199 ; CHECK-NEXT:    retq
200   %a = or i64 %x, 9223372036854775808 ; set bit 63
201   ret i64 %a
204 define i64 @xor1_optsize(i64 %x) optsize {
205 ; CHECK-LABEL: xor1_optsize:
206 ; CHECK:       # %bb.0:
207 ; CHECK-NEXT:    movq %rdi, %rax
208 ; CHECK-NEXT:    btcq $31, %rax
209 ; CHECK-NEXT:    retq
210   %a = xor i64 %x, 2147483648 ; toggle bit 31
211   ret i64 %a
214 define i64 @xor2_optsize(i64 %x) optsize {
215 ; CHECK-LABEL: xor2_optsize:
216 ; CHECK:       # %bb.0:
217 ; CHECK-NEXT:    movq %rdi, %rax
218 ; CHECK-NEXT:    btcq $32, %rax
219 ; CHECK-NEXT:    retq
220   %a = xor i64 %x, 4294967296 ; toggle bit 32
221   ret i64 %a
224 define i64 @xor3_optsize(i64 %x) optsize {
225 ; CHECK-LABEL: xor3_optsize:
226 ; CHECK:       # %bb.0:
227 ; CHECK-NEXT:    movq %rdi, %rax
228 ; CHECK-NEXT:    btcq $62, %rax
229 ; CHECK-NEXT:    retq
230   %a = xor i64 %x, 4611686018427387904 ; toggle bit 62
231   ret i64 %a
234 define i64 @xor4_optsize(i64 %x) optsize {
235 ; CHECK-LABEL: xor4_optsize:
236 ; CHECK:       # %bb.0:
237 ; CHECK-NEXT:    movq %rdi, %rax
238 ; CHECK-NEXT:    btcq $63, %rax
239 ; CHECK-NEXT:    retq
240   %a = xor i64 %x, 9223372036854775808 ; toggle bit 63
241   ret i64 %a