1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s 3 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 12 } 13 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 22 } 23 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 32 } 33 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 42 } 43 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 52 } 53 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 62 } 63 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 72 } 73 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 82 } 83 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 92 } 93 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 102 } 103 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 112 } 113 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 122 } 123 124 define i64 @and1_optsize(i64 %x) optsize { 125 ; CHECK-LABEL: and1_optsize: 126 ; CHECK: # %bb.0: 127 ; CHECK-NEXT: btrq $31, %rdi 128 ; CHECK-NEXT: movq %rdi, %rax 129 ; CHECK-NEXT: retq 130 %a = and i64 %x, 18446744071562067967 ; clear bit 31 131 ret i64 %a 132 } 133 134 define i64 @and2_optsize(i64 %x) optsize { 135 ; CHECK-LABEL: and2_optsize: 136 ; CHECK: # %bb.0: 137 ; CHECK-NEXT: btrq $32, %rdi 138 ; CHECK-NEXT: movq %rdi, %rax 139 ; CHECK-NEXT: retq 140 %a = and i64 %x, 18446744069414584319 ; clear bit 32 141 ret i64 %a 142 } 143 144 define i64 @and3_optsize(i64 %x) optsize { 145 ; CHECK-LABEL: and3_optsize: 146 ; CHECK: # %bb.0: 147 ; CHECK-NEXT: btrq $62, %rdi 148 ; CHECK-NEXT: movq %rdi, %rax 149 ; CHECK-NEXT: retq 150 %a = and i64 %x, 13835058055282163711 ; clear bit 62 151 ret i64 %a 152 } 153 154 define i64 @and4_optsize(i64 %x) optsize { 155 ; CHECK-LABEL: and4_optsize: 156 ; CHECK: # %bb.0: 157 ; CHECK-NEXT: btrq $63, %rdi 158 ; CHECK-NEXT: movq %rdi, %rax 159 ; CHECK-NEXT: retq 160 %a = and i64 %x, 9223372036854775807 ; clear bit 63 161 ret i64 %a 162 } 163 164 define i64 @or1_optsize(i64 %x) optsize { 165 ; CHECK-LABEL: or1_optsize: 166 ; CHECK: # %bb.0: 167 ; CHECK-NEXT: btsq $31, %rdi 168 ; CHECK-NEXT: movq %rdi, %rax 169 ; CHECK-NEXT: retq 170 %a = or i64 %x, 2147483648 ; set bit 31 171 ret i64 %a 172 } 173 174 define i64 @or2_optsize(i64 %x) optsize { 175 ; CHECK-LABEL: or2_optsize: 176 ; CHECK: # %bb.0: 177 ; CHECK-NEXT: btsq $32, %rdi 178 ; CHECK-NEXT: movq %rdi, %rax 179 ; CHECK-NEXT: retq 180 %a = or i64 %x, 4294967296 ; set bit 32 181 ret i64 %a 182 } 183 184 define i64 @or3_optsize(i64 %x) optsize { 185 ; CHECK-LABEL: or3_optsize: 186 ; CHECK: # %bb.0: 187 ; CHECK-NEXT: btsq $62, %rdi 188 ; CHECK-NEXT: movq %rdi, %rax 189 ; CHECK-NEXT: retq 190 %a = or i64 %x, 4611686018427387904 ; set bit 62 191 ret i64 %a 192 } 193 194 define i64 @or4_optsize(i64 %x) optsize { 195 ; CHECK-LABEL: or4_optsize: 196 ; CHECK: # %bb.0: 197 ; CHECK-NEXT: btsq $63, %rdi 198 ; CHECK-NEXT: movq %rdi, %rax 199 ; CHECK-NEXT: retq 200 %a = or i64 %x, 9223372036854775808 ; set bit 63 201 ret i64 %a 202 } 203 204 define i64 @xor1_optsize(i64 %x) optsize { 205 ; CHECK-LABEL: xor1_optsize: 206 ; CHECK: # %bb.0: 207 ; CHECK-NEXT: btcq $31, %rdi 208 ; CHECK-NEXT: movq %rdi, %rax 209 ; CHECK-NEXT: retq 210 %a = xor i64 %x, 2147483648 ; toggle bit 31 211 ret i64 %a 212 } 213 214 define i64 @xor2_optsize(i64 %x) optsize { 215 ; CHECK-LABEL: xor2_optsize: 216 ; CHECK: # %bb.0: 217 ; CHECK-NEXT: btcq $32, %rdi 218 ; CHECK-NEXT: movq %rdi, %rax 219 ; CHECK-NEXT: retq 220 %a = xor i64 %x, 4294967296 ; toggle bit 32 221 ret i64 %a 222 } 223 224 define i64 @xor3_optsize(i64 %x) optsize { 225 ; CHECK-LABEL: xor3_optsize: 226 ; CHECK: # %bb.0: 227 ; CHECK-NEXT: btcq $62, %rdi 228 ; CHECK-NEXT: movq %rdi, %rax 229 ; CHECK-NEXT: retq 230 %a = xor i64 %x, 4611686018427387904 ; toggle bit 62 231 ret i64 %a 232 } 233 234 define i64 @xor4_optsize(i64 %x) optsize { 235 ; CHECK-LABEL: xor4_optsize: 236 ; CHECK: # %bb.0: 237 ; CHECK-NEXT: btcq $63, %rdi 238 ; CHECK-NEXT: movq %rdi, %rax 239 ; CHECK-NEXT: retq 240 %a = xor i64 %x, 9223372036854775808 ; toggle bit 63 241 ret i64 %a 242 } 243