1 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+tbm < %s | FileCheck %s 2 3 define i32 @test_x86_tbm_bextri_u32(i32 %a) nounwind readnone { 4 entry: 5 ; CHECK-LABEL: test_x86_tbm_bextri_u32: 6 ; CHECK-NOT: mov 7 ; CHECK: bextr $ 8 %0 = lshr i32 %a, 4 9 %1 = and i32 %0, 4095 10 ret i32 %1 11 } 12 13 define i32 @test_x86_tbm_bextri_u32_m(i32* nocapture %a) nounwind readonly { 14 entry: 15 ; CHECK-LABEL: test_x86_tbm_bextri_u32_m: 16 ; CHECK-NOT: mov 17 ; CHECK: bextr $ 18 %0 = load i32, i32* %a 19 %1 = lshr i32 %0, 4 20 %2 = and i32 %1, 4095 21 ret i32 %2 22 } 23 24 define i64 @test_x86_tbm_bextri_u64(i64 %a) nounwind readnone { 25 entry: 26 ; CHECK-LABEL: test_x86_tbm_bextri_u64: 27 ; CHECK-NOT: mov 28 ; CHECK: bextr $ 29 %0 = lshr i64 %a, 4 30 %1 = and i64 %0, 4095 31 ret i64 %1 32 } 33 34 define i64 @test_x86_tbm_bextri_u64_m(i64* nocapture %a) nounwind readonly { 35 entry: 36 ; CHECK-LABEL: test_x86_tbm_bextri_u64_m: 37 ; CHECK-NOT: mov 38 ; CHECK: bextr $ 39 %0 = load i64, i64* %a 40 %1 = lshr i64 %0, 4 41 %2 = and i64 %1, 4095 42 ret i64 %2 43 } 44 45 define i32 @test_x86_tbm_blcfill_u32(i32 %a) nounwind readnone { 46 entry: 47 ; CHECK-LABEL: test_x86_tbm_blcfill_u32: 48 ; CHECK-NOT: mov 49 ; CHECK: blcfill % 50 %0 = add i32 %a, 1 51 %1 = and i32 %0, %a 52 ret i32 %1 53 } 54 55 define i64 @test_x86_tbm_blcfill_u64(i64 %a) nounwind readnone { 56 entry: 57 ; CHECK-LABEL: test_x86_tbm_blcfill_u64: 58 ; CHECK-NOT: mov 59 ; CHECK: blcfill % 60 %0 = add i64 %a, 1 61 %1 = and i64 %0, %a 62 ret i64 %1 63 } 64 65 define i32 @test_x86_tbm_blci_u32(i32 %a) nounwind readnone { 66 entry: 67 ; CHECK-LABEL: test_x86_tbm_blci_u32: 68 ; CHECK-NOT: mov 69 ; CHECK: blci % 70 %0 = add i32 1, %a 71 %1 = xor i32 %0, -1 72 %2 = or i32 %1, %a 73 ret i32 %2 74 } 75 76 define i64 @test_x86_tbm_blci_u64(i64 %a) nounwind readnone { 77 entry: 78 ; CHECK-LABEL: test_x86_tbm_blci_u64: 79 ; CHECK-NOT: mov 80 ; CHECK: blci % 81 %0 = add i64 1, %a 82 %1 = xor i64 %0, -1 83 %2 = or i64 %1, %a 84 ret i64 %2 85 } 86 87 define i32 @test_x86_tbm_blci_u32_b(i32 %a) nounwind readnone { 88 entry: 89 ; CHECK-LABEL: test_x86_tbm_blci_u32_b: 90 ; CHECK-NOT: mov 91 ; CHECK: blci % 92 %0 = sub i32 -2, %a 93 %1 = or i32 %0, %a 94 ret i32 %1 95 } 96 97 define i64 @test_x86_tbm_blci_u64_b(i64 %a) nounwind readnone { 98 entry: 99 ; CHECK-LABEL: test_x86_tbm_blci_u64_b: 100 ; CHECK-NOT: mov 101 ; CHECK: blci % 102 %0 = sub i64 -2, %a 103 %1 = or i64 %0, %a 104 ret i64 %1 105 } 106 107 define i32 @test_x86_tbm_blcic_u32(i32 %a) nounwind readnone { 108 entry: 109 ; CHECK-LABEL: test_x86_tbm_blcic_u32: 110 ; CHECK-NOT: mov 111 ; CHECK: blcic % 112 %0 = xor i32 %a, -1 113 %1 = add i32 %a, 1 114 %2 = and i32 %1, %0 115 ret i32 %2 116 } 117 118 define i64 @test_x86_tbm_blcic_u64(i64 %a) nounwind readnone { 119 entry: 120 ; CHECK-LABEL: test_x86_tbm_blcic_u64: 121 ; CHECK-NOT: mov 122 ; CHECK: blcic % 123 %0 = xor i64 %a, -1 124 %1 = add i64 %a, 1 125 %2 = and i64 %1, %0 126 ret i64 %2 127 } 128 129 define i32 @test_x86_tbm_blcmsk_u32(i32 %a) nounwind readnone { 130 entry: 131 ; CHECK-LABEL: test_x86_tbm_blcmsk_u32: 132 ; CHECK-NOT: mov 133 ; CHECK: blcmsk % 134 %0 = add i32 %a, 1 135 %1 = xor i32 %0, %a 136 ret i32 %1 137 } 138 139 define i64 @test_x86_tbm_blcmsk_u64(i64 %a) nounwind readnone { 140 entry: 141 ; CHECK-LABEL: test_x86_tbm_blcmsk_u64: 142 ; CHECK-NOT: mov 143 ; CHECK: blcmsk % 144 %0 = add i64 %a, 1 145 %1 = xor i64 %0, %a 146 ret i64 %1 147 } 148 149 define i32 @test_x86_tbm_blcs_u32(i32 %a) nounwind readnone { 150 entry: 151 ; CHECK-LABEL: test_x86_tbm_blcs_u32: 152 ; CHECK-NOT: mov 153 ; CHECK: blcs % 154 %0 = add i32 %a, 1 155 %1 = or i32 %0, %a 156 ret i32 %1 157 } 158 159 define i64 @test_x86_tbm_blcs_u64(i64 %a) nounwind readnone { 160 entry: 161 ; CHECK-LABEL: test_x86_tbm_blcs_u64: 162 ; CHECK-NOT: mov 163 ; CHECK: blcs % 164 %0 = add i64 %a, 1 165 %1 = or i64 %0, %a 166 ret i64 %1 167 } 168 169 define i32 @test_x86_tbm_blsfill_u32(i32 %a) nounwind readnone { 170 entry: 171 ; CHECK-LABEL: test_x86_tbm_blsfill_u32: 172 ; CHECK-NOT: mov 173 ; CHECK: blsfill % 174 %0 = add i32 %a, -1 175 %1 = or i32 %0, %a 176 ret i32 %1 177 } 178 179 define i64 @test_x86_tbm_blsfill_u64(i64 %a) nounwind readnone { 180 entry: 181 ; CHECK-LABEL: test_x86_tbm_blsfill_u64: 182 ; CHECK-NOT: mov 183 ; CHECK: blsfill % 184 %0 = add i64 %a, -1 185 %1 = or i64 %0, %a 186 ret i64 %1 187 } 188 189 define i32 @test_x86_tbm_blsic_u32(i32 %a) nounwind readnone { 190 entry: 191 ; CHECK-LABEL: test_x86_tbm_blsic_u32: 192 ; CHECK-NOT: mov 193 ; CHECK: blsic % 194 %0 = xor i32 %a, -1 195 %1 = add i32 %a, -1 196 %2 = or i32 %0, %1 197 ret i32 %2 198 } 199 200 define i64 @test_x86_tbm_blsic_u64(i64 %a) nounwind readnone { 201 entry: 202 ; CHECK-LABEL: test_x86_tbm_blsic_u64: 203 ; CHECK-NOT: mov 204 ; CHECK: blsic % 205 %0 = xor i64 %a, -1 206 %1 = add i64 %a, -1 207 %2 = or i64 %0, %1 208 ret i64 %2 209 } 210 211 define i32 @test_x86_tbm_t1mskc_u32(i32 %a) nounwind readnone { 212 entry: 213 ; CHECK-LABEL: test_x86_tbm_t1mskc_u32: 214 ; CHECK-NOT: mov 215 ; CHECK: t1mskc % 216 %0 = xor i32 %a, -1 217 %1 = add i32 %a, 1 218 %2 = or i32 %0, %1 219 ret i32 %2 220 } 221 222 define i64 @Ttest_x86_tbm_t1mskc_u64(i64 %a) nounwind readnone { 223 entry: 224 ; CHECK-LABEL: test_x86_tbm_t1mskc_u64: 225 ; CHECK-NOT: mov 226 ; CHECK: t1mskc % 227 %0 = xor i64 %a, -1 228 %1 = add i64 %a, 1 229 %2 = or i64 %0, %1 230 ret i64 %2 231 } 232 233 define i32 @test_x86_tbm_tzmsk_u32(i32 %a) nounwind readnone { 234 entry: 235 ; CHECK-LABEL: test_x86_tbm_tzmsk_u32: 236 ; CHECK-NOT: mov 237 ; CHECK: tzmsk % 238 %0 = xor i32 %a, -1 239 %1 = add i32 %a, -1 240 %2 = and i32 %0, %1 241 ret i32 %2 242 } 243 244 define i64 @test_x86_tbm_tzmsk_u64(i64 %a) nounwind readnone { 245 entry: 246 ; CHECK-LABEL: test_x86_tbm_tzmsk_u64: 247 ; CHECK-NOT: mov 248 ; CHECK: tzmsk % 249 %0 = xor i64 %a, -1 250 %1 = add i64 %a, -1 251 %2 = and i64 %0, %1 252 ret i64 %2 253 } 254