1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s 2 3 4 define <8 x i8> @and8xi8(<8 x i8> %a, <8 x i8> %b) { 5 ;CHECK: and {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 6 %tmp1 = and <8 x i8> %a, %b; 7 ret <8 x i8> %tmp1 8 } 9 10 define <16 x i8> @and16xi8(<16 x i8> %a, <16 x i8> %b) { 11 ;CHECK: and {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 12 %tmp1 = and <16 x i8> %a, %b; 13 ret <16 x i8> %tmp1 14 } 15 16 17 define <8 x i8> @orr8xi8(<8 x i8> %a, <8 x i8> %b) { 18 ;CHECK: orr {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 19 %tmp1 = or <8 x i8> %a, %b; 20 ret <8 x i8> %tmp1 21 } 22 23 define <16 x i8> @orr16xi8(<16 x i8> %a, <16 x i8> %b) { 24 ;CHECK: orr {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 25 %tmp1 = or <16 x i8> %a, %b; 26 ret <16 x i8> %tmp1 27 } 28 29 30 define <8 x i8> @xor8xi8(<8 x i8> %a, <8 x i8> %b) { 31 ;CHECK: eor {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 32 %tmp1 = xor <8 x i8> %a, %b; 33 ret <8 x i8> %tmp1 34 } 35 36 define <16 x i8> @xor16xi8(<16 x i8> %a, <16 x i8> %b) { 37 ;CHECK: eor {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 38 %tmp1 = xor <16 x i8> %a, %b; 39 ret <16 x i8> %tmp1 40 } 41 42 define <8 x i8> @bsl8xi8_const(<8 x i8> %a, <8 x i8> %b) { 43 ;CHECK: bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 44 %tmp1 = and <8 x i8> %a, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 > 45 %tmp2 = and <8 x i8> %b, < i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0 > 46 %tmp3 = or <8 x i8> %tmp1, %tmp2 47 ret <8 x i8> %tmp3 48 } 49 50 define <16 x i8> @bsl16xi8_const(<16 x i8> %a, <16 x i8> %b) { 51 ;CHECK: bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 52 %tmp1 = and <16 x i8> %a, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 > 53 %tmp2 = and <16 x i8> %b, < i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0 > 54 %tmp3 = or <16 x i8> %tmp1, %tmp2 55 ret <16 x i8> %tmp3 56 } 57 58 define <8 x i8> @orn8xi8(<8 x i8> %a, <8 x i8> %b) { 59 ;CHECK: orn {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 60 %tmp1 = xor <8 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 > 61 %tmp2 = or <8 x i8> %a, %tmp1 62 ret <8 x i8> %tmp2 63 } 64 65 define <16 x i8> @orn16xi8(<16 x i8> %a, <16 x i8> %b) { 66 ;CHECK: orn {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 67 %tmp1 = xor <16 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 > 68 %tmp2 = or <16 x i8> %a, %tmp1 69 ret <16 x i8> %tmp2 70 } 71 72 define <8 x i8> @bic8xi8(<8 x i8> %a, <8 x i8> %b) { 73 ;CHECK: bic {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 74 %tmp1 = xor <8 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 > 75 %tmp2 = and <8 x i8> %a, %tmp1 76 ret <8 x i8> %tmp2 77 } 78 79 define <16 x i8> @bic16xi8(<16 x i8> %a, <16 x i8> %b) { 80 ;CHECK: bic {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 81 %tmp1 = xor <16 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 > 82 %tmp2 = and <16 x i8> %a, %tmp1 83 ret <16 x i8> %tmp2 84 } 85 86 define <2 x i32> @orrimm2s_lsl0(<2 x i32> %a) { 87 ;CHECK: orr {{v[0-31]+}}.2s, #0xff 88 %tmp1 = or <2 x i32> %a, < i32 255, i32 255> 89 ret <2 x i32> %tmp1 90 } 91 92 define <2 x i32> @orrimm2s_lsl8(<2 x i32> %a) { 93 ;CHECK: orr {{v[0-31]+}}.2s, #0xff, lsl #8 94 %tmp1 = or <2 x i32> %a, < i32 65280, i32 65280> 95 ret <2 x i32> %tmp1 96 } 97 98 define <2 x i32> @orrimm2s_lsl16(<2 x i32> %a) { 99 ;CHECK: orr {{v[0-31]+}}.2s, #0xff, lsl #16 100 %tmp1 = or <2 x i32> %a, < i32 16711680, i32 16711680> 101 ret <2 x i32> %tmp1 102 } 103 104 define <2 x i32> @orrimm2s_lsl24(<2 x i32> %a) { 105 ;CHECK: orr {{v[0-31]+}}.2s, #0xff, lsl #24 106 %tmp1 = or <2 x i32> %a, < i32 4278190080, i32 4278190080> 107 ret <2 x i32> %tmp1 108 } 109 110 define <4 x i32> @orrimm4s_lsl0(<4 x i32> %a) { 111 ;CHECK: orr {{v[0-31]+}}.4s, #0xff 112 %tmp1 = or <4 x i32> %a, < i32 255, i32 255, i32 255, i32 255> 113 ret <4 x i32> %tmp1 114 } 115 116 define <4 x i32> @orrimm4s_lsl8(<4 x i32> %a) { 117 ;CHECK: orr {{v[0-31]+}}.4s, #0xff, lsl #8 118 %tmp1 = or <4 x i32> %a, < i32 65280, i32 65280, i32 65280, i32 65280> 119 ret <4 x i32> %tmp1 120 } 121 122 define <4 x i32> @orrimm4s_lsl16(<4 x i32> %a) { 123 ;CHECK: orr {{v[0-31]+}}.4s, #0xff, lsl #16 124 %tmp1 = or <4 x i32> %a, < i32 16711680, i32 16711680, i32 16711680, i32 16711680> 125 ret <4 x i32> %tmp1 126 } 127 128 define <4 x i32> @orrimm4s_lsl24(<4 x i32> %a) { 129 ;CHECK: orr {{v[0-31]+}}.4s, #0xff, lsl #24 130 %tmp1 = or <4 x i32> %a, < i32 4278190080, i32 4278190080, i32 4278190080, i32 4278190080> 131 ret <4 x i32> %tmp1 132 } 133 134 define <4 x i16> @orrimm4h_lsl0(<4 x i16> %a) { 135 ;CHECK: orr {{v[0-31]+}}.4h, #0xff 136 %tmp1 = or <4 x i16> %a, < i16 255, i16 255, i16 255, i16 255 > 137 ret <4 x i16> %tmp1 138 } 139 140 define <4 x i16> @orrimm4h_lsl8(<4 x i16> %a) { 141 ;CHECK: orr {{v[0-31]+}}.4h, #0xff, lsl #8 142 %tmp1 = or <4 x i16> %a, < i16 65280, i16 65280, i16 65280, i16 65280 > 143 ret <4 x i16> %tmp1 144 } 145 146 define <8 x i16> @orrimm8h_lsl0(<8 x i16> %a) { 147 ;CHECK: orr {{v[0-31]+}}.8h, #0xff 148 %tmp1 = or <8 x i16> %a, < i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255 > 149 ret <8 x i16> %tmp1 150 } 151 152 define <8 x i16> @orrimm8h_lsl8(<8 x i16> %a) { 153 ;CHECK: orr {{v[0-31]+}}.8h, #0xff, lsl #8 154 %tmp1 = or <8 x i16> %a, < i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280 > 155 ret <8 x i16> %tmp1 156 } 157 158 define <2 x i32> @bicimm2s_lsl0(<2 x i32> %a) { 159 ;CHECK: bic {{v[0-31]+}}.2s, #0x10 160 %tmp1 = and <2 x i32> %a, < i32 4294967279, i32 4294967279 > 161 ret <2 x i32> %tmp1 162 } 163 164 define <2 x i32> @bicimm2s_lsl8(<2 x i32> %a) { 165 ;CHECK: bic {{v[0-31]+}}.2s, #0x10, lsl #8 166 %tmp1 = and <2 x i32> %a, < i32 18446744073709547519, i32 18446744073709547519 > 167 ret <2 x i32> %tmp1 168 } 169 170 define <2 x i32> @bicimm2s_lsl16(<2 x i32> %a) { 171 ;CHECK: bic {{v[0-31]+}}.2s, #0x10, lsl #16 172 %tmp1 = and <2 x i32> %a, < i32 18446744073708503039, i32 18446744073708503039 > 173 ret <2 x i32> %tmp1 174 } 175 176 define <2 x i32> @bicimm2s_lsl124(<2 x i32> %a) { 177 ;CHECK: bic {{v[0-31]+}}.2s, #0x10, lsl #24 178 %tmp1 = and <2 x i32> %a, < i32 18446744073441116159, i32 18446744073441116159> 179 ret <2 x i32> %tmp1 180 } 181 182 define <4 x i32> @bicimm4s_lsl0(<4 x i32> %a) { 183 ;CHECK: bic {{v[0-31]+}}.4s, #0x10 184 %tmp1 = and <4 x i32> %a, < i32 4294967279, i32 4294967279, i32 4294967279, i32 4294967279 > 185 ret <4 x i32> %tmp1 186 } 187 188 define <4 x i32> @bicimm4s_lsl8(<4 x i32> %a) { 189 ;CHECK: bic {{v[0-31]+}}.4s, #0x10, lsl #8 190 %tmp1 = and <4 x i32> %a, < i32 18446744073709547519, i32 18446744073709547519, i32 18446744073709547519, i32 18446744073709547519 > 191 ret <4 x i32> %tmp1 192 } 193 194 define <4 x i32> @bicimm4s_lsl16(<4 x i32> %a) { 195 ;CHECK: bic {{v[0-31]+}}.4s, #0x10, lsl #16 196 %tmp1 = and <4 x i32> %a, < i32 18446744073708503039, i32 18446744073708503039, i32 18446744073708503039, i32 18446744073708503039 > 197 ret <4 x i32> %tmp1 198 } 199 200 define <4 x i32> @bicimm4s_lsl124(<4 x i32> %a) { 201 ;CHECK: bic {{v[0-31]+}}.4s, #0x10, lsl #24 202 %tmp1 = and <4 x i32> %a, < i32 18446744073441116159, i32 18446744073441116159, i32 18446744073441116159, i32 18446744073441116159> 203 ret <4 x i32> %tmp1 204 } 205 206 define <4 x i16> @bicimm4h_lsl0_a(<4 x i16> %a) { 207 ;CHECK: bic {{v[0-31]+}}.4h, #0x10 208 %tmp1 = and <4 x i16> %a, < i16 18446744073709551599, i16 18446744073709551599, i16 18446744073709551599, i16 18446744073709551599 > 209 ret <4 x i16> %tmp1 210 } 211 212 define <4 x i16> @bicimm4h_lsl0_b(<4 x i16> %a) { 213 ;CHECK: bic {{v[0-31]+}}.4h, #0x0 214 %tmp1 = and <4 x i16> %a, < i16 65280, i16 65280, i16 65280, i16 65280 > 215 ret <4 x i16> %tmp1 216 } 217 218 define <4 x i16> @bicimm4h_lsl8_a(<4 x i16> %a) { 219 ;CHECK: bic {{v[0-31]+}}.4h, #0x10, lsl #8 220 %tmp1 = and <4 x i16> %a, < i16 18446744073709547519, i16 18446744073709547519, i16 18446744073709547519, i16 18446744073709547519> 221 ret <4 x i16> %tmp1 222 } 223 224 define <4 x i16> @bicimm4h_lsl8_b(<4 x i16> %a) { 225 ;CHECK: bic {{v[0-31]+}}.4h, #0x0, lsl #8 226 %tmp1 = and <4 x i16> %a, < i16 255, i16 255, i16 255, i16 255> 227 ret <4 x i16> %tmp1 228 } 229 230 define <8 x i16> @bicimm8h_lsl0_a(<8 x i16> %a) { 231 ;CHECK: bic {{v[0-31]+}}.8h, #0x10 232 %tmp1 = and <8 x i16> %a, < i16 18446744073709551599, i16 18446744073709551599, i16 18446744073709551599, i16 18446744073709551599, 233 i16 18446744073709551599, i16 18446744073709551599, i16 18446744073709551599, i16 18446744073709551599 > 234 ret <8 x i16> %tmp1 235 } 236 237 define <8 x i16> @bicimm8h_lsl0_b(<8 x i16> %a) { 238 ;CHECK: bic {{v[0-31]+}}.8h, #0x0 239 %tmp1 = and <8 x i16> %a, < i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280 > 240 ret <8 x i16> %tmp1 241 } 242 243 define <8 x i16> @bicimm8h_lsl8_a(<8 x i16> %a) { 244 ;CHECK: bic {{v[0-31]+}}.8h, #0x10, lsl #8 245 %tmp1 = and <8 x i16> %a, < i16 18446744073709547519, i16 18446744073709547519, i16 18446744073709547519, i16 18446744073709547519, 246 i16 18446744073709547519, i16 18446744073709547519, i16 18446744073709547519, i16 18446744073709547519> 247 ret <8 x i16> %tmp1 248 } 249 250 define <8 x i16> @bicimm8h_lsl8_b(<8 x i16> %a) { 251 ;CHECK: bic {{v[0-31]+}}.8h, #0x0, lsl #8 252 %tmp1 = and <8 x i16> %a, < i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 253 ret <8 x i16> %tmp1 254 } 255 256 define <2 x i32> @and2xi32(<2 x i32> %a, <2 x i32> %b) { 257 ;CHECK: and {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 258 %tmp1 = and <2 x i32> %a, %b; 259 ret <2 x i32> %tmp1 260 } 261 262 define <4 x i16> @and4xi16(<4 x i16> %a, <4 x i16> %b) { 263 ;CHECK: and {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 264 %tmp1 = and <4 x i16> %a, %b; 265 ret <4 x i16> %tmp1 266 } 267 268 define <1 x i64> @and1xi64(<1 x i64> %a, <1 x i64> %b) { 269 ;CHECK: and {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 270 %tmp1 = and <1 x i64> %a, %b; 271 ret <1 x i64> %tmp1 272 } 273 274 define <4 x i32> @and4xi32(<4 x i32> %a, <4 x i32> %b) { 275 ;CHECK: and {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 276 %tmp1 = and <4 x i32> %a, %b; 277 ret <4 x i32> %tmp1 278 } 279 280 define <8 x i16> @and8xi16(<8 x i16> %a, <8 x i16> %b) { 281 ;CHECK: and {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 282 %tmp1 = and <8 x i16> %a, %b; 283 ret <8 x i16> %tmp1 284 } 285 286 define <2 x i64> @and2xi64(<2 x i64> %a, <2 x i64> %b) { 287 ;CHECK: and {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 288 %tmp1 = and <2 x i64> %a, %b; 289 ret <2 x i64> %tmp1 290 } 291 292 define <2 x i32> @orr2xi32(<2 x i32> %a, <2 x i32> %b) { 293 ;CHECK: orr {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 294 %tmp1 = or <2 x i32> %a, %b; 295 ret <2 x i32> %tmp1 296 } 297 298 define <4 x i16> @orr4xi16(<4 x i16> %a, <4 x i16> %b) { 299 ;CHECK: orr {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 300 %tmp1 = or <4 x i16> %a, %b; 301 ret <4 x i16> %tmp1 302 } 303 304 define <1 x i64> @orr1xi64(<1 x i64> %a, <1 x i64> %b) { 305 ;CHECK: orr {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 306 %tmp1 = or <1 x i64> %a, %b; 307 ret <1 x i64> %tmp1 308 } 309 310 define <4 x i32> @orr4xi32(<4 x i32> %a, <4 x i32> %b) { 311 ;CHECK: orr {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 312 %tmp1 = or <4 x i32> %a, %b; 313 ret <4 x i32> %tmp1 314 } 315 316 define <8 x i16> @orr8xi16(<8 x i16> %a, <8 x i16> %b) { 317 ;CHECK: orr {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 318 %tmp1 = or <8 x i16> %a, %b; 319 ret <8 x i16> %tmp1 320 } 321 322 define <2 x i64> @orr2xi64(<2 x i64> %a, <2 x i64> %b) { 323 ;CHECK: orr {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 324 %tmp1 = or <2 x i64> %a, %b; 325 ret <2 x i64> %tmp1 326 } 327 328 define <2 x i32> @eor2xi32(<2 x i32> %a, <2 x i32> %b) { 329 ;CHECK: eor {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 330 %tmp1 = xor <2 x i32> %a, %b; 331 ret <2 x i32> %tmp1 332 } 333 334 define <4 x i16> @eor4xi16(<4 x i16> %a, <4 x i16> %b) { 335 ;CHECK: eor {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 336 %tmp1 = xor <4 x i16> %a, %b; 337 ret <4 x i16> %tmp1 338 } 339 340 define <1 x i64> @eor1xi64(<1 x i64> %a, <1 x i64> %b) { 341 ;CHECK: eor {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 342 %tmp1 = xor <1 x i64> %a, %b; 343 ret <1 x i64> %tmp1 344 } 345 346 define <4 x i32> @eor4xi32(<4 x i32> %a, <4 x i32> %b) { 347 ;CHECK: eor {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 348 %tmp1 = xor <4 x i32> %a, %b; 349 ret <4 x i32> %tmp1 350 } 351 352 define <8 x i16> @eor8xi16(<8 x i16> %a, <8 x i16> %b) { 353 ;CHECK: eor {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 354 %tmp1 = xor <8 x i16> %a, %b; 355 ret <8 x i16> %tmp1 356 } 357 358 define <2 x i64> @eor2xi64(<2 x i64> %a, <2 x i64> %b) { 359 ;CHECK: eor {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 360 %tmp1 = xor <2 x i64> %a, %b; 361 ret <2 x i64> %tmp1 362 } 363 364 365 define <2 x i32> @bic2xi32(<2 x i32> %a, <2 x i32> %b) { 366 ;CHECK: bic {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 367 %tmp1 = xor <2 x i32> %b, < i32 -1, i32 -1 > 368 %tmp2 = and <2 x i32> %a, %tmp1 369 ret <2 x i32> %tmp2 370 } 371 372 define <4 x i16> @bic4xi16(<4 x i16> %a, <4 x i16> %b) { 373 ;CHECK: bic {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 374 %tmp1 = xor <4 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1 > 375 %tmp2 = and <4 x i16> %a, %tmp1 376 ret <4 x i16> %tmp2 377 } 378 379 define <1 x i64> @bic1xi64(<1 x i64> %a, <1 x i64> %b) { 380 ;CHECK: bic {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 381 %tmp1 = xor <1 x i64> %b, < i64 -1> 382 %tmp2 = and <1 x i64> %a, %tmp1 383 ret <1 x i64> %tmp2 384 } 385 386 define <4 x i32> @bic4xi32(<4 x i32> %a, <4 x i32> %b) { 387 ;CHECK: bic {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 388 %tmp1 = xor <4 x i32> %b, < i32 -1, i32 -1, i32 -1, i32 -1> 389 %tmp2 = and <4 x i32> %a, %tmp1 390 ret <4 x i32> %tmp2 391 } 392 393 define <8 x i16> @bic8xi16(<8 x i16> %a, <8 x i16> %b) { 394 ;CHECK: bic {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 395 %tmp1 = xor <8 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1, i16 -1, i16 -1, i16 -1, i16 -1 > 396 %tmp2 = and <8 x i16> %a, %tmp1 397 ret <8 x i16> %tmp2 398 } 399 400 define <2 x i64> @bic2xi64(<2 x i64> %a, <2 x i64> %b) { 401 ;CHECK: bic {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 402 %tmp1 = xor <2 x i64> %b, < i64 -1, i64 -1> 403 %tmp2 = and <2 x i64> %a, %tmp1 404 ret <2 x i64> %tmp2 405 } 406 407 define <2 x i32> @orn2xi32(<2 x i32> %a, <2 x i32> %b) { 408 ;CHECK: orn {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 409 %tmp1 = xor <2 x i32> %b, < i32 -1, i32 -1 > 410 %tmp2 = or <2 x i32> %a, %tmp1 411 ret <2 x i32> %tmp2 412 } 413 414 define <4 x i16> @orn4xi16(<4 x i16> %a, <4 x i16> %b) { 415 ;CHECK: orn {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 416 %tmp1 = xor <4 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1 > 417 %tmp2 = or <4 x i16> %a, %tmp1 418 ret <4 x i16> %tmp2 419 } 420 421 define <1 x i64> @orn1xi64(<1 x i64> %a, <1 x i64> %b) { 422 ;CHECK: orn {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 423 %tmp1 = xor <1 x i64> %b, < i64 -1> 424 %tmp2 = or <1 x i64> %a, %tmp1 425 ret <1 x i64> %tmp2 426 } 427 428 define <4 x i32> @orn4xi32(<4 x i32> %a, <4 x i32> %b) { 429 ;CHECK: orn {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 430 %tmp1 = xor <4 x i32> %b, < i32 -1, i32 -1, i32 -1, i32 -1> 431 %tmp2 = or <4 x i32> %a, %tmp1 432 ret <4 x i32> %tmp2 433 } 434 435 define <8 x i16> @orn8xi16(<8 x i16> %a, <8 x i16> %b) { 436 ;CHECK: orn {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 437 %tmp1 = xor <8 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1, i16 -1, i16 -1, i16 -1, i16 -1 > 438 %tmp2 = or <8 x i16> %a, %tmp1 439 ret <8 x i16> %tmp2 440 } 441 442 define <2 x i64> @orn2xi64(<2 x i64> %a, <2 x i64> %b) { 443 ;CHECK: orn {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 444 %tmp1 = xor <2 x i64> %b, < i64 -1, i64 -1> 445 %tmp2 = or <2 x i64> %a, %tmp1 446 ret <2 x i64> %tmp2 447 } 448 define <2 x i32> @bsl2xi32_const(<2 x i32> %a, <2 x i32> %b) { 449 ;CHECK: bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 450 %tmp1 = and <2 x i32> %a, < i32 -1, i32 -1 > 451 %tmp2 = and <2 x i32> %b, < i32 0, i32 0 > 452 %tmp3 = or <2 x i32> %tmp1, %tmp2 453 ret <2 x i32> %tmp3 454 } 455 456 457 define <4 x i16> @bsl4xi16_const(<4 x i16> %a, <4 x i16> %b) { 458 ;CHECK: bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 459 %tmp1 = and <4 x i16> %a, < i16 -1, i16 -1, i16 -1,i16 -1 > 460 %tmp2 = and <4 x i16> %b, < i16 0, i16 0,i16 0, i16 0 > 461 %tmp3 = or <4 x i16> %tmp1, %tmp2 462 ret <4 x i16> %tmp3 463 } 464 465 define <1 x i64> @bsl1xi64_const(<1 x i64> %a, <1 x i64> %b) { 466 ;CHECK: bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 467 %tmp1 = and <1 x i64> %a, < i64 -1 > 468 %tmp2 = and <1 x i64> %b, < i64 0 > 469 %tmp3 = or <1 x i64> %tmp1, %tmp2 470 ret <1 x i64> %tmp3 471 } 472 473 define <4 x i32> @bsl4xi32_const(<4 x i32> %a, <4 x i32> %b) { 474 ;CHECK: bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 475 %tmp1 = and <4 x i32> %a, < i32 -1, i32 -1, i32 -1, i32 -1 > 476 %tmp2 = and <4 x i32> %b, < i32 0, i32 0, i32 0, i32 0 > 477 %tmp3 = or <4 x i32> %tmp1, %tmp2 478 ret <4 x i32> %tmp3 479 } 480 481 define <8 x i16> @bsl8xi16_const(<8 x i16> %a, <8 x i16> %b) { 482 ;CHECK: bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 483 %tmp1 = and <8 x i16> %a, < i16 -1, i16 -1, i16 -1,i16 -1, i16 -1, i16 -1, i16 -1,i16 -1 > 484 %tmp2 = and <8 x i16> %b, < i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0 > 485 %tmp3 = or <8 x i16> %tmp1, %tmp2 486 ret <8 x i16> %tmp3 487 } 488 489 define <2 x i64> @bsl2xi64_const(<2 x i64> %a, <2 x i64> %b) { 490 ;CHECK: bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 491 %tmp1 = and <2 x i64> %a, < i64 -1, i64 -1 > 492 %tmp2 = and <2 x i64> %b, < i64 0, i64 0 > 493 %tmp3 = or <2 x i64> %tmp1, %tmp2 494 ret <2 x i64> %tmp3 495 } 496 497 498 define <8 x i8> @bsl8xi8(<8 x i8> %v1, <8 x i8> %v2, <8 x i8> %v3) { 499 ;CHECK: bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 500 %1 = and <8 x i8> %v1, %v2 501 %2 = xor <8 x i8> %v1, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 502 %3 = and <8 x i8> %2, %v3 503 %4 = or <8 x i8> %1, %3 504 ret <8 x i8> %4 505 } 506 507 define <4 x i16> @bsl4xi16(<4 x i16> %v1, <4 x i16> %v2, <4 x i16> %v3) { 508 ;CHECK: bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 509 %1 = and <4 x i16> %v1, %v2 510 %2 = xor <4 x i16> %v1, <i16 -1, i16 -1, i16 -1, i16 -1> 511 %3 = and <4 x i16> %2, %v3 512 %4 = or <4 x i16> %1, %3 513 ret <4 x i16> %4 514 } 515 516 define <2 x i32> @bsl2xi32(<2 x i32> %v1, <2 x i32> %v2, <2 x i32> %v3) { 517 ;CHECK: bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 518 %1 = and <2 x i32> %v1, %v2 519 %2 = xor <2 x i32> %v1, <i32 -1, i32 -1> 520 %3 = and <2 x i32> %2, %v3 521 %4 = or <2 x i32> %1, %3 522 ret <2 x i32> %4 523 } 524 525 define <1 x i64> @bsl1xi64(<1 x i64> %v1, <1 x i64> %v2, <1 x i64> %v3) { 526 ;CHECK: bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b 527 %1 = and <1 x i64> %v1, %v2 528 %2 = xor <1 x i64> %v1, <i64 -1> 529 %3 = and <1 x i64> %2, %v3 530 %4 = or <1 x i64> %1, %3 531 ret <1 x i64> %4 532 } 533 534 define <16 x i8> @bsl16xi8(<16 x i8> %v1, <16 x i8> %v2, <16 x i8> %v3) { 535 ;CHECK: bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 536 %1 = and <16 x i8> %v1, %v2 537 %2 = xor <16 x i8> %v1, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 538 %3 = and <16 x i8> %2, %v3 539 %4 = or <16 x i8> %1, %3 540 ret <16 x i8> %4 541 } 542 543 define <8 x i16> @bsl8xi16(<8 x i16> %v1, <8 x i16> %v2, <8 x i16> %v3) { 544 ;CHECK: bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 545 %1 = and <8 x i16> %v1, %v2 546 %2 = xor <8 x i16> %v1, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 547 %3 = and <8 x i16> %2, %v3 548 %4 = or <8 x i16> %1, %3 549 ret <8 x i16> %4 550 } 551 552 define <4 x i32> @bsl4xi32(<4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) { 553 ;CHECK: bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 554 %1 = and <4 x i32> %v1, %v2 555 %2 = xor <4 x i32> %v1, <i32 -1, i32 -1, i32 -1, i32 -1> 556 %3 = and <4 x i32> %2, %v3 557 %4 = or <4 x i32> %1, %3 558 ret <4 x i32> %4 559 } 560 561 define <2 x i64> @bsl2xi64(<2 x i64> %v1, <2 x i64> %v2, <2 x i64> %v3) { 562 ;CHECK: bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b 563 %1 = and <2 x i64> %v1, %v2 564 %2 = xor <2 x i64> %v1, <i64 -1, i64 -1> 565 %3 = and <2 x i64> %2, %v3 566 %4 = or <2 x i64> %1, %3 567 ret <2 x i64> %4 568 } 569 570 define <8 x i8> @orrimm8b_as_orrimm4h_lsl0(<8 x i8> %a) { 571 ;CHECK: orr {{v[0-31]+}}.4h, #0xff 572 %val = or <8 x i8> %a, <i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0> 573 ret <8 x i8> %val 574 } 575 576 define <8 x i8> @orrimm8b_as_orimm4h_lsl8(<8 x i8> %a) { 577 ;CHECK: orr {{v[0-31]+}}.4h, #0xff, lsl #8 578 %val = or <8 x i8> %a, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255> 579 ret <8 x i8> %val 580 } 581 582 define <16 x i8> @orimm16b_as_orrimm8h_lsl0(<16 x i8> %a) { 583 ;CHECK: orr {{v[0-31]+}}.8h, #0xff 584 %val = or <16 x i8> %a, <i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0> 585 ret <16 x i8> %val 586 } 587 588 define <16 x i8> @orimm16b_as_orrimm8h_lsl8(<16 x i8> %a) { 589 ;CHECK: orr {{v[0-31]+}}.8h, #0xff, lsl #8 590 %val = or <16 x i8> %a, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255> 591 ret <16 x i8> %val 592 } 593 594 595