1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 2 // RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s 3 // RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -DPOLYMORPHIC -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s 4 5 // REQUIRES: aarch64-registered-target || arm-registered-target 6 7 #include <arm_mve.h> 8 9 // CHECK-LABEL: @test_vshlq_n_s8( 10 // CHECK-NEXT: entry: 11 // CHECK-NEXT: [[TMP0:%.*]] = shl <16 x i8> [[A:%.*]], splat (i8 5) 12 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 13 // 14 int8x16_t test_vshlq_n_s8(int8x16_t a) 15 { 16 #ifdef POLYMORPHIC 17 return vshlq_n(a, 5); 18 #else /* POLYMORPHIC */ 19 return vshlq_n_s8(a, 5); 20 #endif /* POLYMORPHIC */ 21 } 22 23 // CHECK-LABEL: @test_vshlq_n_s16( 24 // CHECK-NEXT: entry: 25 // CHECK-NEXT: [[TMP0:%.*]] = shl <8 x i16> [[A:%.*]], splat (i16 5) 26 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 27 // 28 int16x8_t test_vshlq_n_s16(int16x8_t a) 29 { 30 #ifdef POLYMORPHIC 31 return vshlq_n(a, 5); 32 #else /* POLYMORPHIC */ 33 return vshlq_n_s16(a, 5); 34 #endif /* POLYMORPHIC */ 35 } 36 37 // CHECK-LABEL: @test_vshlq_n_s32( 38 // CHECK-NEXT: entry: 39 // CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i32> [[A:%.*]], splat (i32 18) 40 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 41 // 42 int32x4_t test_vshlq_n_s32(int32x4_t a) 43 { 44 #ifdef POLYMORPHIC 45 return vshlq_n(a, 18); 46 #else /* POLYMORPHIC */ 47 return vshlq_n_s32(a, 18); 48 #endif /* POLYMORPHIC */ 49 } 50 51 // CHECK-LABEL: @test_vshlq_n_s8_trivial( 52 // CHECK-NEXT: entry: 53 // CHECK-NEXT: [[TMP0:%.*]] = shl <16 x i8> [[A:%.*]], zeroinitializer 54 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 55 // 56 int8x16_t test_vshlq_n_s8_trivial(int8x16_t a) 57 { 58 #ifdef POLYMORPHIC 59 return vshlq_n(a, 0); 60 #else /* POLYMORPHIC */ 61 return vshlq_n_s8(a, 0); 62 #endif /* POLYMORPHIC */ 63 } 64 65 // CHECK-LABEL: @test_vshlq_n_s16_trivial( 66 // CHECK-NEXT: entry: 67 // CHECK-NEXT: [[TMP0:%.*]] = shl <8 x i16> [[A:%.*]], zeroinitializer 68 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 69 // 70 int16x8_t test_vshlq_n_s16_trivial(int16x8_t a) 71 { 72 #ifdef POLYMORPHIC 73 return vshlq_n(a, 0); 74 #else /* POLYMORPHIC */ 75 return vshlq_n_s16(a, 0); 76 #endif /* POLYMORPHIC */ 77 } 78 79 // CHECK-LABEL: @test_vshlq_n_s32_trivial( 80 // CHECK-NEXT: entry: 81 // CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i32> [[A:%.*]], zeroinitializer 82 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 83 // 84 int32x4_t test_vshlq_n_s32_trivial(int32x4_t a) 85 { 86 #ifdef POLYMORPHIC 87 return vshlq_n(a, 0); 88 #else /* POLYMORPHIC */ 89 return vshlq_n_s32(a, 0); 90 #endif /* POLYMORPHIC */ 91 } 92 93 // CHECK-LABEL: @test_vshlq_n_u8( 94 // CHECK-NEXT: entry: 95 // CHECK-NEXT: [[TMP0:%.*]] = shl <16 x i8> [[A:%.*]], splat (i8 3) 96 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 97 // 98 uint8x16_t test_vshlq_n_u8(uint8x16_t a) 99 { 100 #ifdef POLYMORPHIC 101 return vshlq_n(a, 3); 102 #else /* POLYMORPHIC */ 103 return vshlq_n_u8(a, 3); 104 #endif /* POLYMORPHIC */ 105 } 106 107 // CHECK-LABEL: @test_vshlq_n_u16( 108 // CHECK-NEXT: entry: 109 // CHECK-NEXT: [[TMP0:%.*]] = shl <8 x i16> [[A:%.*]], splat (i16 11) 110 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 111 // 112 uint16x8_t test_vshlq_n_u16(uint16x8_t a) 113 { 114 #ifdef POLYMORPHIC 115 return vshlq_n(a, 11); 116 #else /* POLYMORPHIC */ 117 return vshlq_n_u16(a, 11); 118 #endif /* POLYMORPHIC */ 119 } 120 121 // CHECK-LABEL: @test_vshlq_n_u32( 122 // CHECK-NEXT: entry: 123 // CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i32> [[A:%.*]], splat (i32 7) 124 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 125 // 126 uint32x4_t test_vshlq_n_u32(uint32x4_t a) 127 { 128 #ifdef POLYMORPHIC 129 return vshlq_n(a, 7); 130 #else /* POLYMORPHIC */ 131 return vshlq_n_u32(a, 7); 132 #endif /* POLYMORPHIC */ 133 } 134 135 // CHECK-LABEL: @test_vshlq_n_u8_trivial( 136 // CHECK-NEXT: entry: 137 // CHECK-NEXT: [[TMP0:%.*]] = shl <16 x i8> [[A:%.*]], zeroinitializer 138 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 139 // 140 uint8x16_t test_vshlq_n_u8_trivial(uint8x16_t a) 141 { 142 #ifdef POLYMORPHIC 143 return vshlq_n(a, 0); 144 #else /* POLYMORPHIC */ 145 return vshlq_n_u8(a, 0); 146 #endif /* POLYMORPHIC */ 147 } 148 149 // CHECK-LABEL: @test_vshlq_n_u16_trivial( 150 // CHECK-NEXT: entry: 151 // CHECK-NEXT: [[TMP0:%.*]] = shl <8 x i16> [[A:%.*]], zeroinitializer 152 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 153 // 154 uint16x8_t test_vshlq_n_u16_trivial(uint16x8_t a) 155 { 156 #ifdef POLYMORPHIC 157 return vshlq_n(a, 0); 158 #else /* POLYMORPHIC */ 159 return vshlq_n_u16(a, 0); 160 #endif /* POLYMORPHIC */ 161 } 162 163 // CHECK-LABEL: @test_vshlq_n_u32_trivial( 164 // CHECK-NEXT: entry: 165 // CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i32> [[A:%.*]], zeroinitializer 166 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 167 // 168 uint32x4_t test_vshlq_n_u32_trivial(uint32x4_t a) 169 { 170 #ifdef POLYMORPHIC 171 return vshlq_n(a, 0); 172 #else /* POLYMORPHIC */ 173 return vshlq_n_u32(a, 0); 174 #endif /* POLYMORPHIC */ 175 } 176 177 // CHECK-LABEL: @test_vshrq_n_s8( 178 // CHECK-NEXT: entry: 179 // CHECK-NEXT: [[TMP0:%.*]] = ashr <16 x i8> [[A:%.*]], splat (i8 4) 180 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 181 // 182 int8x16_t test_vshrq_n_s8(int8x16_t a) 183 { 184 #ifdef POLYMORPHIC 185 return vshrq(a, 4); 186 #else /* POLYMORPHIC */ 187 return vshrq_n_s8(a, 4); 188 #endif /* POLYMORPHIC */ 189 } 190 191 // CHECK-LABEL: @test_vshrq_n_s16( 192 // CHECK-NEXT: entry: 193 // CHECK-NEXT: [[TMP0:%.*]] = ashr <8 x i16> [[A:%.*]], splat (i16 10) 194 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 195 // 196 int16x8_t test_vshrq_n_s16(int16x8_t a) 197 { 198 #ifdef POLYMORPHIC 199 return vshrq(a, 10); 200 #else /* POLYMORPHIC */ 201 return vshrq_n_s16(a, 10); 202 #endif /* POLYMORPHIC */ 203 } 204 205 // CHECK-LABEL: @test_vshrq_n_s32( 206 // CHECK-NEXT: entry: 207 // CHECK-NEXT: [[TMP0:%.*]] = ashr <4 x i32> [[A:%.*]], splat (i32 19) 208 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 209 // 210 int32x4_t test_vshrq_n_s32(int32x4_t a) 211 { 212 #ifdef POLYMORPHIC 213 return vshrq(a, 19); 214 #else /* POLYMORPHIC */ 215 return vshrq_n_s32(a, 19); 216 #endif /* POLYMORPHIC */ 217 } 218 219 // CHECK-LABEL: @test_vshrq_n_s8_trivial( 220 // CHECK-NEXT: entry: 221 // CHECK-NEXT: [[TMP0:%.*]] = ashr <16 x i8> [[A:%.*]], splat (i8 7) 222 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 223 // 224 int8x16_t test_vshrq_n_s8_trivial(int8x16_t a) 225 { 226 #ifdef POLYMORPHIC 227 return vshrq(a, 8); 228 #else /* POLYMORPHIC */ 229 return vshrq_n_s8(a, 8); 230 #endif /* POLYMORPHIC */ 231 } 232 233 // CHECK-LABEL: @test_vshrq_n_s16_trivial( 234 // CHECK-NEXT: entry: 235 // CHECK-NEXT: [[TMP0:%.*]] = ashr <8 x i16> [[A:%.*]], splat (i16 15) 236 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 237 // 238 int16x8_t test_vshrq_n_s16_trivial(int16x8_t a) 239 { 240 #ifdef POLYMORPHIC 241 return vshrq(a, 16); 242 #else /* POLYMORPHIC */ 243 return vshrq_n_s16(a, 16); 244 #endif /* POLYMORPHIC */ 245 } 246 247 // CHECK-LABEL: @test_vshrq_n_s32_trivial( 248 // CHECK-NEXT: entry: 249 // CHECK-NEXT: [[TMP0:%.*]] = ashr <4 x i32> [[A:%.*]], splat (i32 31) 250 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 251 // 252 int32x4_t test_vshrq_n_s32_trivial(int32x4_t a) 253 { 254 #ifdef POLYMORPHIC 255 return vshrq(a, 32); 256 #else /* POLYMORPHIC */ 257 return vshrq_n_s32(a, 32); 258 #endif /* POLYMORPHIC */ 259 } 260 261 // CHECK-LABEL: @test_vshrq_n_u8( 262 // CHECK-NEXT: entry: 263 // CHECK-NEXT: [[TMP0:%.*]] = lshr <16 x i8> [[A:%.*]], splat (i8 1) 264 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 265 // 266 uint8x16_t test_vshrq_n_u8(uint8x16_t a) 267 { 268 #ifdef POLYMORPHIC 269 return vshrq(a, 1); 270 #else /* POLYMORPHIC */ 271 return vshrq_n_u8(a, 1); 272 #endif /* POLYMORPHIC */ 273 } 274 275 // CHECK-LABEL: @test_vshrq_n_u16( 276 // CHECK-NEXT: entry: 277 // CHECK-NEXT: [[TMP0:%.*]] = lshr <8 x i16> [[A:%.*]], splat (i16 10) 278 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 279 // 280 uint16x8_t test_vshrq_n_u16(uint16x8_t a) 281 { 282 #ifdef POLYMORPHIC 283 return vshrq(a, 10); 284 #else /* POLYMORPHIC */ 285 return vshrq_n_u16(a, 10); 286 #endif /* POLYMORPHIC */ 287 } 288 289 // CHECK-LABEL: @test_vshrq_n_u32( 290 // CHECK-NEXT: entry: 291 // CHECK-NEXT: [[TMP0:%.*]] = lshr <4 x i32> [[A:%.*]], splat (i32 10) 292 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 293 // 294 uint32x4_t test_vshrq_n_u32(uint32x4_t a) 295 { 296 #ifdef POLYMORPHIC 297 return vshrq(a, 10); 298 #else /* POLYMORPHIC */ 299 return vshrq_n_u32(a, 10); 300 #endif /* POLYMORPHIC */ 301 } 302 303 // CHECK-LABEL: @test_vshrq_n_u8_trivial( 304 // CHECK-NEXT: entry: 305 // CHECK-NEXT: ret <16 x i8> zeroinitializer 306 // 307 uint8x16_t test_vshrq_n_u8_trivial(uint8x16_t a) 308 { 309 #ifdef POLYMORPHIC 310 return vshrq(a, 8); 311 #else /* POLYMORPHIC */ 312 return vshrq_n_u8(a, 8); 313 #endif /* POLYMORPHIC */ 314 } 315 316 // CHECK-LABEL: @test_vshrq_n_u16_trivial( 317 // CHECK-NEXT: entry: 318 // CHECK-NEXT: ret <8 x i16> zeroinitializer 319 // 320 uint16x8_t test_vshrq_n_u16_trivial(uint16x8_t a) 321 { 322 #ifdef POLYMORPHIC 323 return vshrq(a, 16); 324 #else /* POLYMORPHIC */ 325 return vshrq_n_u16(a, 16); 326 #endif /* POLYMORPHIC */ 327 } 328 329 // CHECK-LABEL: @test_vshrq_n_u32_trivial( 330 // CHECK-NEXT: entry: 331 // CHECK-NEXT: ret <4 x i32> zeroinitializer 332 // 333 uint32x4_t test_vshrq_n_u32_trivial(uint32x4_t a) 334 { 335 #ifdef POLYMORPHIC 336 return vshrq(a, 32); 337 #else /* POLYMORPHIC */ 338 return vshrq_n_u32(a, 32); 339 #endif /* POLYMORPHIC */ 340 } 341 342 // CHECK-LABEL: @test_vshlq_m_n_s8( 343 // CHECK-NEXT: entry: 344 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 345 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 346 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 6, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 347 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 348 // 349 int8x16_t test_vshlq_m_n_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p) 350 { 351 #ifdef POLYMORPHIC 352 return vshlq_m_n(inactive, a, 6, p); 353 #else /* POLYMORPHIC */ 354 return vshlq_m_n_s8(inactive, a, 6, p); 355 #endif /* POLYMORPHIC */ 356 } 357 358 // CHECK-LABEL: @test_vshlq_m_n_s16( 359 // CHECK-NEXT: entry: 360 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 361 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 362 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 13, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 363 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 364 // 365 int16x8_t test_vshlq_m_n_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p) 366 { 367 #ifdef POLYMORPHIC 368 return vshlq_m_n(inactive, a, 13, p); 369 #else /* POLYMORPHIC */ 370 return vshlq_m_n_s16(inactive, a, 13, p); 371 #endif /* POLYMORPHIC */ 372 } 373 374 // CHECK-LABEL: @test_vshlq_m_n_s32( 375 // CHECK-NEXT: entry: 376 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 377 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 378 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 379 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 380 // 381 int32x4_t test_vshlq_m_n_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p) 382 { 383 #ifdef POLYMORPHIC 384 return vshlq_m_n(inactive, a, 0, p); 385 #else /* POLYMORPHIC */ 386 return vshlq_m_n_s32(inactive, a, 0, p); 387 #endif /* POLYMORPHIC */ 388 } 389 390 // CHECK-LABEL: @test_vshlq_m_n_u8( 391 // CHECK-NEXT: entry: 392 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 393 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 394 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 3, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 395 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 396 // 397 uint8x16_t test_vshlq_m_n_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p) 398 { 399 #ifdef POLYMORPHIC 400 return vshlq_m_n(inactive, a, 3, p); 401 #else /* POLYMORPHIC */ 402 return vshlq_m_n_u8(inactive, a, 3, p); 403 #endif /* POLYMORPHIC */ 404 } 405 406 // CHECK-LABEL: @test_vshlq_m_n_u16( 407 // CHECK-NEXT: entry: 408 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 409 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 410 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 411 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 412 // 413 uint16x8_t test_vshlq_m_n_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p) 414 { 415 #ifdef POLYMORPHIC 416 return vshlq_m_n(inactive, a, 1, p); 417 #else /* POLYMORPHIC */ 418 return vshlq_m_n_u16(inactive, a, 1, p); 419 #endif /* POLYMORPHIC */ 420 } 421 422 // CHECK-LABEL: @test_vshlq_m_n_u32( 423 // CHECK-NEXT: entry: 424 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 425 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 426 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 24, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 427 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 428 // 429 uint32x4_t test_vshlq_m_n_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p) 430 { 431 #ifdef POLYMORPHIC 432 return vshlq_m_n(inactive, a, 24, p); 433 #else /* POLYMORPHIC */ 434 return vshlq_m_n_u32(inactive, a, 24, p); 435 #endif /* POLYMORPHIC */ 436 } 437 438 // CHECK-LABEL: @test_vshrq_m_n_s8( 439 // CHECK-NEXT: entry: 440 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 441 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 442 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 2, i32 0, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 443 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 444 // 445 int8x16_t test_vshrq_m_n_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p) 446 { 447 #ifdef POLYMORPHIC 448 return vshrq_m(inactive, a, 2, p); 449 #else /* POLYMORPHIC */ 450 return vshrq_m_n_s8(inactive, a, 2, p); 451 #endif /* POLYMORPHIC */ 452 } 453 454 // CHECK-LABEL: @test_vshrq_m_n_s16( 455 // CHECK-NEXT: entry: 456 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 457 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 458 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 3, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 459 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 460 // 461 int16x8_t test_vshrq_m_n_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p) 462 { 463 #ifdef POLYMORPHIC 464 return vshrq_m(inactive, a, 3, p); 465 #else /* POLYMORPHIC */ 466 return vshrq_m_n_s16(inactive, a, 3, p); 467 #endif /* POLYMORPHIC */ 468 } 469 470 // CHECK-LABEL: @test_vshrq_m_n_s32( 471 // CHECK-NEXT: entry: 472 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 473 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 474 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 13, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 475 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 476 // 477 int32x4_t test_vshrq_m_n_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p) 478 { 479 #ifdef POLYMORPHIC 480 return vshrq_m(inactive, a, 13, p); 481 #else /* POLYMORPHIC */ 482 return vshrq_m_n_s32(inactive, a, 13, p); 483 #endif /* POLYMORPHIC */ 484 } 485 486 // CHECK-LABEL: @test_vshrq_m_n_u8( 487 // CHECK-NEXT: entry: 488 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 489 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 490 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 4, i32 1, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 491 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 492 // 493 uint8x16_t test_vshrq_m_n_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p) 494 { 495 #ifdef POLYMORPHIC 496 return vshrq_m(inactive, a, 4, p); 497 #else /* POLYMORPHIC */ 498 return vshrq_m_n_u8(inactive, a, 4, p); 499 #endif /* POLYMORPHIC */ 500 } 501 502 // CHECK-LABEL: @test_vshrq_m_n_u16( 503 // CHECK-NEXT: entry: 504 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 505 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 506 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 14, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 507 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 508 // 509 uint16x8_t test_vshrq_m_n_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p) 510 { 511 #ifdef POLYMORPHIC 512 return vshrq_m(inactive, a, 14, p); 513 #else /* POLYMORPHIC */ 514 return vshrq_m_n_u16(inactive, a, 14, p); 515 #endif /* POLYMORPHIC */ 516 } 517 518 // CHECK-LABEL: @test_vshrq_m_n_u32( 519 // CHECK-NEXT: entry: 520 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 521 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 522 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 21, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 523 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 524 // 525 uint32x4_t test_vshrq_m_n_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p) 526 { 527 #ifdef POLYMORPHIC 528 return vshrq_m(inactive, a, 21, p); 529 #else /* POLYMORPHIC */ 530 return vshrq_m_n_u32(inactive, a, 21, p); 531 #endif /* POLYMORPHIC */ 532 } 533 534 // CHECK-LABEL: @test_vshlq_x_n_s8( 535 // CHECK-NEXT: entry: 536 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 537 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 538 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 1, <16 x i1> [[TMP1]], <16 x i8> undef) 539 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 540 // 541 int8x16_t test_vshlq_x_n_s8(int8x16_t a, mve_pred16_t p) 542 { 543 #ifdef POLYMORPHIC 544 return vshlq_x_n(a, 1, p); 545 #else /* POLYMORPHIC */ 546 return vshlq_x_n_s8(a, 1, p); 547 #endif /* POLYMORPHIC */ 548 } 549 550 // CHECK-LABEL: @test_vshlq_x_n_s16( 551 // CHECK-NEXT: entry: 552 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 553 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 554 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 15, <8 x i1> [[TMP1]], <8 x i16> undef) 555 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 556 // 557 int16x8_t test_vshlq_x_n_s16(int16x8_t a, mve_pred16_t p) 558 { 559 #ifdef POLYMORPHIC 560 return vshlq_x_n(a, 15, p); 561 #else /* POLYMORPHIC */ 562 return vshlq_x_n_s16(a, 15, p); 563 #endif /* POLYMORPHIC */ 564 } 565 566 // CHECK-LABEL: @test_vshlq_x_n_s32( 567 // CHECK-NEXT: entry: 568 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 569 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 570 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 13, <4 x i1> [[TMP1]], <4 x i32> undef) 571 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 572 // 573 int32x4_t test_vshlq_x_n_s32(int32x4_t a, mve_pred16_t p) 574 { 575 #ifdef POLYMORPHIC 576 return vshlq_x_n(a, 13, p); 577 #else /* POLYMORPHIC */ 578 return vshlq_x_n_s32(a, 13, p); 579 #endif /* POLYMORPHIC */ 580 } 581 582 // CHECK-LABEL: @test_vshlq_x_n_u8( 583 // CHECK-NEXT: entry: 584 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 585 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 586 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 4, <16 x i1> [[TMP1]], <16 x i8> undef) 587 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 588 // 589 uint8x16_t test_vshlq_x_n_u8(uint8x16_t a, mve_pred16_t p) 590 { 591 #ifdef POLYMORPHIC 592 return vshlq_x_n(a, 4, p); 593 #else /* POLYMORPHIC */ 594 return vshlq_x_n_u8(a, 4, p); 595 #endif /* POLYMORPHIC */ 596 } 597 598 // CHECK-LABEL: @test_vshlq_x_n_u16( 599 // CHECK-NEXT: entry: 600 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 601 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 602 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 10, <8 x i1> [[TMP1]], <8 x i16> undef) 603 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 604 // 605 uint16x8_t test_vshlq_x_n_u16(uint16x8_t a, mve_pred16_t p) 606 { 607 #ifdef POLYMORPHIC 608 return vshlq_x_n(a, 10, p); 609 #else /* POLYMORPHIC */ 610 return vshlq_x_n_u16(a, 10, p); 611 #endif /* POLYMORPHIC */ 612 } 613 614 // CHECK-LABEL: @test_vshlq_x_n_u32( 615 // CHECK-NEXT: entry: 616 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 617 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 618 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 30, <4 x i1> [[TMP1]], <4 x i32> undef) 619 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 620 // 621 uint32x4_t test_vshlq_x_n_u32(uint32x4_t a, mve_pred16_t p) 622 { 623 #ifdef POLYMORPHIC 624 return vshlq_x_n(a, 30, p); 625 #else /* POLYMORPHIC */ 626 return vshlq_x_n_u32(a, 30, p); 627 #endif /* POLYMORPHIC */ 628 } 629 630 // CHECK-LABEL: @test_vshrq_x_n_s8( 631 // CHECK-NEXT: entry: 632 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 633 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 634 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 4, i32 0, <16 x i1> [[TMP1]], <16 x i8> undef) 635 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 636 // 637 int8x16_t test_vshrq_x_n_s8(int8x16_t a, mve_pred16_t p) 638 { 639 #ifdef POLYMORPHIC 640 return vshrq_x(a, 4, p); 641 #else /* POLYMORPHIC */ 642 return vshrq_x_n_s8(a, 4, p); 643 #endif /* POLYMORPHIC */ 644 } 645 646 // CHECK-LABEL: @test_vshrq_x_n_s16( 647 // CHECK-NEXT: entry: 648 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 649 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 650 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 10, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef) 651 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 652 // 653 int16x8_t test_vshrq_x_n_s16(int16x8_t a, mve_pred16_t p) 654 { 655 #ifdef POLYMORPHIC 656 return vshrq_x(a, 10, p); 657 #else /* POLYMORPHIC */ 658 return vshrq_x_n_s16(a, 10, p); 659 #endif /* POLYMORPHIC */ 660 } 661 662 // CHECK-LABEL: @test_vshrq_x_n_s32( 663 // CHECK-NEXT: entry: 664 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 665 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 666 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 7, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef) 667 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 668 // 669 int32x4_t test_vshrq_x_n_s32(int32x4_t a, mve_pred16_t p) 670 { 671 #ifdef POLYMORPHIC 672 return vshrq_x(a, 7, p); 673 #else /* POLYMORPHIC */ 674 return vshrq_x_n_s32(a, 7, p); 675 #endif /* POLYMORPHIC */ 676 } 677 678 // CHECK-LABEL: @test_vshrq_x_n_u8( 679 // CHECK-NEXT: entry: 680 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 681 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 682 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.shr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 7, i32 1, <16 x i1> [[TMP1]], <16 x i8> undef) 683 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 684 // 685 uint8x16_t test_vshrq_x_n_u8(uint8x16_t a, mve_pred16_t p) 686 { 687 #ifdef POLYMORPHIC 688 return vshrq_x(a, 7, p); 689 #else /* POLYMORPHIC */ 690 return vshrq_x_n_u8(a, 7, p); 691 #endif /* POLYMORPHIC */ 692 } 693 694 // CHECK-LABEL: @test_vshrq_x_n_u16( 695 // CHECK-NEXT: entry: 696 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 697 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 698 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.shr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 7, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef) 699 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 700 // 701 uint16x8_t test_vshrq_x_n_u16(uint16x8_t a, mve_pred16_t p) 702 { 703 #ifdef POLYMORPHIC 704 return vshrq_x(a, 7, p); 705 #else /* POLYMORPHIC */ 706 return vshrq_x_n_u16(a, 7, p); 707 #endif /* POLYMORPHIC */ 708 } 709 710 // CHECK-LABEL: @test_vshrq_x_n_u32( 711 // CHECK-NEXT: entry: 712 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 713 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 714 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.shr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 6, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef) 715 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 716 // 717 uint32x4_t test_vshrq_x_n_u32(uint32x4_t a, mve_pred16_t p) 718 { 719 #ifdef POLYMORPHIC 720 return vshrq_x(a, 6, p); 721 #else /* POLYMORPHIC */ 722 return vshrq_x_n_u32(a, 6, p); 723 #endif /* POLYMORPHIC */ 724 } 725 726 // CHECK-LABEL: @test_vqshlq_n_s8( 727 // CHECK-NEXT: entry: 728 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vqshl.imm.v16i8(<16 x i8> [[A:%.*]], i32 3, i32 0) 729 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 730 // 731 int8x16_t test_vqshlq_n_s8(int8x16_t a) 732 { 733 #ifdef POLYMORPHIC 734 return vqshlq_n(a, 3); 735 #else /* POLYMORPHIC */ 736 return vqshlq_n_s8(a, 3); 737 #endif /* POLYMORPHIC */ 738 } 739 740 // CHECK-LABEL: @test_vqshlq_n_s16( 741 // CHECK-NEXT: entry: 742 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vqshl.imm.v8i16(<8 x i16> [[A:%.*]], i32 4, i32 0) 743 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 744 // 745 int16x8_t test_vqshlq_n_s16(int16x8_t a) 746 { 747 #ifdef POLYMORPHIC 748 return vqshlq_n(a, 4); 749 #else /* POLYMORPHIC */ 750 return vqshlq_n_s16(a, 4); 751 #endif /* POLYMORPHIC */ 752 } 753 754 // CHECK-LABEL: @test_vqshlq_n_s32( 755 // CHECK-NEXT: entry: 756 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqshl.imm.v4i32(<4 x i32> [[A:%.*]], i32 4, i32 0) 757 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 758 // 759 int32x4_t test_vqshlq_n_s32(int32x4_t a) 760 { 761 #ifdef POLYMORPHIC 762 return vqshlq_n(a, 4); 763 #else /* POLYMORPHIC */ 764 return vqshlq_n_s32(a, 4); 765 #endif /* POLYMORPHIC */ 766 } 767 768 // CHECK-LABEL: @test_vqshlq_n_u8( 769 // CHECK-NEXT: entry: 770 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vqshl.imm.v16i8(<16 x i8> [[A:%.*]], i32 0, i32 1) 771 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 772 // 773 uint8x16_t test_vqshlq_n_u8(uint8x16_t a) 774 { 775 #ifdef POLYMORPHIC 776 return vqshlq_n(a, 0); 777 #else /* POLYMORPHIC */ 778 return vqshlq_n_u8(a, 0); 779 #endif /* POLYMORPHIC */ 780 } 781 782 // CHECK-LABEL: @test_vqshlq_n_u16( 783 // CHECK-NEXT: entry: 784 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vqshl.imm.v8i16(<8 x i16> [[A:%.*]], i32 13, i32 1) 785 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 786 // 787 uint16x8_t test_vqshlq_n_u16(uint16x8_t a) 788 { 789 #ifdef POLYMORPHIC 790 return vqshlq_n(a, 13); 791 #else /* POLYMORPHIC */ 792 return vqshlq_n_u16(a, 13); 793 #endif /* POLYMORPHIC */ 794 } 795 796 // CHECK-LABEL: @test_vqshlq_n_u32( 797 // CHECK-NEXT: entry: 798 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqshl.imm.v4i32(<4 x i32> [[A:%.*]], i32 6, i32 1) 799 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 800 // 801 uint32x4_t test_vqshlq_n_u32(uint32x4_t a) 802 { 803 #ifdef POLYMORPHIC 804 return vqshlq_n(a, 6); 805 #else /* POLYMORPHIC */ 806 return vqshlq_n_u32(a, 6); 807 #endif /* POLYMORPHIC */ 808 } 809 810 // CHECK-LABEL: @test_vqshluq_n_s8( 811 // CHECK-NEXT: entry: 812 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vqshlu.imm.v16i8(<16 x i8> [[A:%.*]], i32 5) 813 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 814 // 815 uint8x16_t test_vqshluq_n_s8(int8x16_t a) 816 { 817 #ifdef POLYMORPHIC 818 return vqshluq(a, 5); 819 #else /* POLYMORPHIC */ 820 return vqshluq_n_s8(a, 5); 821 #endif /* POLYMORPHIC */ 822 } 823 824 // CHECK-LABEL: @test_vqshluq_n_s16( 825 // CHECK-NEXT: entry: 826 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vqshlu.imm.v8i16(<8 x i16> [[A:%.*]], i32 5) 827 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 828 // 829 uint16x8_t test_vqshluq_n_s16(int16x8_t a) 830 { 831 #ifdef POLYMORPHIC 832 return vqshluq(a, 5); 833 #else /* POLYMORPHIC */ 834 return vqshluq_n_s16(a, 5); 835 #endif /* POLYMORPHIC */ 836 } 837 838 // CHECK-LABEL: @test_vqshluq_n_s32( 839 // CHECK-NEXT: entry: 840 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqshlu.imm.v4i32(<4 x i32> [[A:%.*]], i32 4) 841 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 842 // 843 uint32x4_t test_vqshluq_n_s32(int32x4_t a) 844 { 845 #ifdef POLYMORPHIC 846 return vqshluq(a, 4); 847 #else /* POLYMORPHIC */ 848 return vqshluq_n_s32(a, 4); 849 #endif /* POLYMORPHIC */ 850 } 851 852 // CHECK-LABEL: @test_vrshrq_n_s8( 853 // CHECK-NEXT: entry: 854 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.v16i8(<16 x i8> [[A:%.*]], i32 4, i32 0) 855 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 856 // 857 int8x16_t test_vrshrq_n_s8(int8x16_t a) 858 { 859 #ifdef POLYMORPHIC 860 return vrshrq(a, 4); 861 #else /* POLYMORPHIC */ 862 return vrshrq_n_s8(a, 4); 863 #endif /* POLYMORPHIC */ 864 } 865 866 // CHECK-LABEL: @test_vrshrq_n_s16( 867 // CHECK-NEXT: entry: 868 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.v8i16(<8 x i16> [[A:%.*]], i32 12, i32 0) 869 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 870 // 871 int16x8_t test_vrshrq_n_s16(int16x8_t a) 872 { 873 #ifdef POLYMORPHIC 874 return vrshrq(a, 12); 875 #else /* POLYMORPHIC */ 876 return vrshrq_n_s16(a, 12); 877 #endif /* POLYMORPHIC */ 878 } 879 880 // CHECK-LABEL: @test_vrshrq_n_s32( 881 // CHECK-NEXT: entry: 882 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.v4i32(<4 x i32> [[A:%.*]], i32 30, i32 0) 883 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 884 // 885 int32x4_t test_vrshrq_n_s32(int32x4_t a) 886 { 887 #ifdef POLYMORPHIC 888 return vrshrq(a, 30); 889 #else /* POLYMORPHIC */ 890 return vrshrq_n_s32(a, 30); 891 #endif /* POLYMORPHIC */ 892 } 893 894 // CHECK-LABEL: @test_vrshrq_n_u8( 895 // CHECK-NEXT: entry: 896 // CHECK-NEXT: [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.v16i8(<16 x i8> [[A:%.*]], i32 1, i32 1) 897 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 898 // 899 uint8x16_t test_vrshrq_n_u8(uint8x16_t a) 900 { 901 #ifdef POLYMORPHIC 902 return vrshrq(a, 1); 903 #else /* POLYMORPHIC */ 904 return vrshrq_n_u8(a, 1); 905 #endif /* POLYMORPHIC */ 906 } 907 908 // CHECK-LABEL: @test_vrshrq_n_u16( 909 // CHECK-NEXT: entry: 910 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.v8i16(<8 x i16> [[A:%.*]], i32 15, i32 1) 911 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 912 // 913 uint16x8_t test_vrshrq_n_u16(uint16x8_t a) 914 { 915 #ifdef POLYMORPHIC 916 return vrshrq(a, 15); 917 #else /* POLYMORPHIC */ 918 return vrshrq_n_u16(a, 15); 919 #endif /* POLYMORPHIC */ 920 } 921 922 // CHECK-LABEL: @test_vrshrq_n_u32( 923 // CHECK-NEXT: entry: 924 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.v4i32(<4 x i32> [[A:%.*]], i32 20, i32 1) 925 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 926 // 927 uint32x4_t test_vrshrq_n_u32(uint32x4_t a) 928 { 929 #ifdef POLYMORPHIC 930 return vrshrq(a, 20); 931 #else /* POLYMORPHIC */ 932 return vrshrq_n_u32(a, 20); 933 #endif /* POLYMORPHIC */ 934 } 935 936 // CHECK-LABEL: @test_vqshlq_m_n_s8( 937 // CHECK-NEXT: entry: 938 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 939 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 940 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vqshl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 6, i32 0, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 941 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 942 // 943 int8x16_t test_vqshlq_m_n_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p) 944 { 945 #ifdef POLYMORPHIC 946 return vqshlq_m_n(inactive, a, 6, p); 947 #else /* POLYMORPHIC */ 948 return vqshlq_m_n_s8(inactive, a, 6, p); 949 #endif /* POLYMORPHIC */ 950 } 951 952 // CHECK-LABEL: @test_vqshlq_m_n_s16( 953 // CHECK-NEXT: entry: 954 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 955 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 956 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vqshl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 13, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 957 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 958 // 959 int16x8_t test_vqshlq_m_n_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p) 960 { 961 #ifdef POLYMORPHIC 962 return vqshlq_m_n(inactive, a, 13, p); 963 #else /* POLYMORPHIC */ 964 return vqshlq_m_n_s16(inactive, a, 13, p); 965 #endif /* POLYMORPHIC */ 966 } 967 968 // CHECK-LABEL: @test_vqshlq_m_n_s32( 969 // CHECK-NEXT: entry: 970 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 971 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 972 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqshl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 14, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 973 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 974 // 975 int32x4_t test_vqshlq_m_n_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p) 976 { 977 #ifdef POLYMORPHIC 978 return vqshlq_m_n(inactive, a, 14, p); 979 #else /* POLYMORPHIC */ 980 return vqshlq_m_n_s32(inactive, a, 14, p); 981 #endif /* POLYMORPHIC */ 982 } 983 984 // CHECK-LABEL: @test_vqshlq_m_n_u8( 985 // CHECK-NEXT: entry: 986 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 987 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 988 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vqshl.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 4, i32 1, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 989 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 990 // 991 uint8x16_t test_vqshlq_m_n_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p) 992 { 993 #ifdef POLYMORPHIC 994 return vqshlq_m_n(inactive, a, 4, p); 995 #else /* POLYMORPHIC */ 996 return vqshlq_m_n_u8(inactive, a, 4, p); 997 #endif /* POLYMORPHIC */ 998 } 999 1000 // CHECK-LABEL: @test_vqshlq_m_n_u16( 1001 // CHECK-NEXT: entry: 1002 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1003 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1004 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vqshl.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 9, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 1005 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1006 // 1007 uint16x8_t test_vqshlq_m_n_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p) 1008 { 1009 #ifdef POLYMORPHIC 1010 return vqshlq_m_n(inactive, a, 9, p); 1011 #else /* POLYMORPHIC */ 1012 return vqshlq_m_n_u16(inactive, a, 9, p); 1013 #endif /* POLYMORPHIC */ 1014 } 1015 1016 // CHECK-LABEL: @test_vqshlq_m_n_u32( 1017 // CHECK-NEXT: entry: 1018 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1019 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1020 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqshl.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 25, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 1021 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1022 // 1023 uint32x4_t test_vqshlq_m_n_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p) 1024 { 1025 #ifdef POLYMORPHIC 1026 return vqshlq_m_n(inactive, a, 25, p); 1027 #else /* POLYMORPHIC */ 1028 return vqshlq_m_n_u32(inactive, a, 25, p); 1029 #endif /* POLYMORPHIC */ 1030 } 1031 1032 // CHECK-LABEL: @test_vqshluq_m_n_s8( 1033 // CHECK-NEXT: entry: 1034 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1035 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 1036 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vqshlu.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 2, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 1037 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 1038 // 1039 uint8x16_t test_vqshluq_m_n_s8(uint8x16_t inactive, int8x16_t a, mve_pred16_t p) 1040 { 1041 #ifdef POLYMORPHIC 1042 return vqshluq_m(inactive, a, 2, p); 1043 #else /* POLYMORPHIC */ 1044 return vqshluq_m_n_s8(inactive, a, 2, p); 1045 #endif /* POLYMORPHIC */ 1046 } 1047 1048 // CHECK-LABEL: @test_vqshluq_m_n_s16( 1049 // CHECK-NEXT: entry: 1050 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1051 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1052 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vqshlu.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 12, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 1053 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1054 // 1055 uint16x8_t test_vqshluq_m_n_s16(uint16x8_t inactive, int16x8_t a, mve_pred16_t p) 1056 { 1057 #ifdef POLYMORPHIC 1058 return vqshluq_m(inactive, a, 12, p); 1059 #else /* POLYMORPHIC */ 1060 return vqshluq_m_n_s16(inactive, a, 12, p); 1061 #endif /* POLYMORPHIC */ 1062 } 1063 1064 // CHECK-LABEL: @test_vqshluq_m_n_s32( 1065 // CHECK-NEXT: entry: 1066 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1067 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1068 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqshlu.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 24, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 1069 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1070 // 1071 uint32x4_t test_vqshluq_m_n_s32(uint32x4_t inactive, int32x4_t a, mve_pred16_t p) 1072 { 1073 #ifdef POLYMORPHIC 1074 return vqshluq_m(inactive, a, 24, p); 1075 #else /* POLYMORPHIC */ 1076 return vqshluq_m_n_s32(inactive, a, 24, p); 1077 #endif /* POLYMORPHIC */ 1078 } 1079 1080 // CHECK-LABEL: @test_vrshrq_m_n_s8( 1081 // CHECK-NEXT: entry: 1082 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1083 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 1084 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 2, i32 0, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 1085 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 1086 // 1087 int8x16_t test_vrshrq_m_n_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p) 1088 { 1089 #ifdef POLYMORPHIC 1090 return vrshrq_m(inactive, a, 2, p); 1091 #else /* POLYMORPHIC */ 1092 return vrshrq_m_n_s8(inactive, a, 2, p); 1093 #endif /* POLYMORPHIC */ 1094 } 1095 1096 // CHECK-LABEL: @test_vrshrq_m_n_s16( 1097 // CHECK-NEXT: entry: 1098 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1099 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1100 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 11, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 1101 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1102 // 1103 int16x8_t test_vrshrq_m_n_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p) 1104 { 1105 #ifdef POLYMORPHIC 1106 return vrshrq_m(inactive, a, 11, p); 1107 #else /* POLYMORPHIC */ 1108 return vrshrq_m_n_s16(inactive, a, 11, p); 1109 #endif /* POLYMORPHIC */ 1110 } 1111 1112 // CHECK-LABEL: @test_vrshrq_m_n_s32( 1113 // CHECK-NEXT: entry: 1114 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1115 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1116 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 24, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 1117 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1118 // 1119 int32x4_t test_vrshrq_m_n_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p) 1120 { 1121 #ifdef POLYMORPHIC 1122 return vrshrq_m(inactive, a, 24, p); 1123 #else /* POLYMORPHIC */ 1124 return vrshrq_m_n_s32(inactive, a, 24, p); 1125 #endif /* POLYMORPHIC */ 1126 } 1127 1128 // CHECK-LABEL: @test_vrshrq_m_n_u8( 1129 // CHECK-NEXT: entry: 1130 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1131 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 1132 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 7, i32 1, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]]) 1133 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 1134 // 1135 uint8x16_t test_vrshrq_m_n_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p) 1136 { 1137 #ifdef POLYMORPHIC 1138 return vrshrq_m(inactive, a, 7, p); 1139 #else /* POLYMORPHIC */ 1140 return vrshrq_m_n_u8(inactive, a, 7, p); 1141 #endif /* POLYMORPHIC */ 1142 } 1143 1144 // CHECK-LABEL: @test_vrshrq_m_n_u16( 1145 // CHECK-NEXT: entry: 1146 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1147 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1148 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 4, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 1149 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1150 // 1151 uint16x8_t test_vrshrq_m_n_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p) 1152 { 1153 #ifdef POLYMORPHIC 1154 return vrshrq_m(inactive, a, 4, p); 1155 #else /* POLYMORPHIC */ 1156 return vrshrq_m_n_u16(inactive, a, 4, p); 1157 #endif /* POLYMORPHIC */ 1158 } 1159 1160 // CHECK-LABEL: @test_vrshrq_m_n_u32( 1161 // CHECK-NEXT: entry: 1162 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1163 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1164 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 27, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 1165 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1166 // 1167 uint32x4_t test_vrshrq_m_n_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p) 1168 { 1169 #ifdef POLYMORPHIC 1170 return vrshrq_m(inactive, a, 27, p); 1171 #else /* POLYMORPHIC */ 1172 return vrshrq_m_n_u32(inactive, a, 27, p); 1173 #endif /* POLYMORPHIC */ 1174 } 1175 1176 // CHECK-LABEL: @test_vrshrq_x_n_s8( 1177 // CHECK-NEXT: entry: 1178 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1179 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 1180 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 3, i32 0, <16 x i1> [[TMP1]], <16 x i8> undef) 1181 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 1182 // 1183 int8x16_t test_vrshrq_x_n_s8(int8x16_t a, mve_pred16_t p) 1184 { 1185 #ifdef POLYMORPHIC 1186 return vrshrq_x(a, 3, p); 1187 #else /* POLYMORPHIC */ 1188 return vrshrq_x_n_s8(a, 3, p); 1189 #endif /* POLYMORPHIC */ 1190 } 1191 1192 // CHECK-LABEL: @test_vrshrq_x_n_s16( 1193 // CHECK-NEXT: entry: 1194 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1195 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1196 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 12, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef) 1197 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1198 // 1199 int16x8_t test_vrshrq_x_n_s16(int16x8_t a, mve_pred16_t p) 1200 { 1201 #ifdef POLYMORPHIC 1202 return vrshrq_x(a, 12, p); 1203 #else /* POLYMORPHIC */ 1204 return vrshrq_x_n_s16(a, 12, p); 1205 #endif /* POLYMORPHIC */ 1206 } 1207 1208 // CHECK-LABEL: @test_vrshrq_x_n_s32( 1209 // CHECK-NEXT: entry: 1210 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1211 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1212 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 20, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef) 1213 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1214 // 1215 int32x4_t test_vrshrq_x_n_s32(int32x4_t a, mve_pred16_t p) 1216 { 1217 #ifdef POLYMORPHIC 1218 return vrshrq_x(a, 20, p); 1219 #else /* POLYMORPHIC */ 1220 return vrshrq_x_n_s32(a, 20, p); 1221 #endif /* POLYMORPHIC */ 1222 } 1223 1224 // CHECK-LABEL: @test_vrshrq_x_n_u8( 1225 // CHECK-NEXT: entry: 1226 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1227 // CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]]) 1228 // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrshr.imm.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 1, i32 1, <16 x i1> [[TMP1]], <16 x i8> undef) 1229 // CHECK-NEXT: ret <16 x i8> [[TMP2]] 1230 // 1231 uint8x16_t test_vrshrq_x_n_u8(uint8x16_t a, mve_pred16_t p) 1232 { 1233 #ifdef POLYMORPHIC 1234 return vrshrq_x(a, 1, p); 1235 #else /* POLYMORPHIC */ 1236 return vrshrq_x_n_u8(a, 1, p); 1237 #endif /* POLYMORPHIC */ 1238 } 1239 1240 // CHECK-LABEL: @test_vrshrq_x_n_u16( 1241 // CHECK-NEXT: entry: 1242 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1243 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1244 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrshr.imm.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 13, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef) 1245 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1246 // 1247 uint16x8_t test_vrshrq_x_n_u16(uint16x8_t a, mve_pred16_t p) 1248 { 1249 #ifdef POLYMORPHIC 1250 return vrshrq_x(a, 13, p); 1251 #else /* POLYMORPHIC */ 1252 return vrshrq_x_n_u16(a, 13, p); 1253 #endif /* POLYMORPHIC */ 1254 } 1255 1256 // CHECK-LABEL: @test_vrshrq_x_n_u32( 1257 // CHECK-NEXT: entry: 1258 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1259 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1260 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrshr.imm.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 6, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef) 1261 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1262 // 1263 uint32x4_t test_vrshrq_x_n_u32(uint32x4_t a, mve_pred16_t p) 1264 { 1265 #ifdef POLYMORPHIC 1266 return vrshrq_x(a, 6, p); 1267 #else /* POLYMORPHIC */ 1268 return vrshrq_x_n_u32(a, 6, p); 1269 #endif /* POLYMORPHIC */ 1270 } 1271 1272 // CHECK-LABEL: @test_vshllbq_n_s8( 1273 // CHECK-NEXT: entry: 1274 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.v8i16.v16i8(<16 x i8> [[A:%.*]], i32 2, i32 0, i32 0) 1275 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 1276 // 1277 int16x8_t test_vshllbq_n_s8(int8x16_t a) 1278 { 1279 #ifdef POLYMORPHIC 1280 return vshllbq(a, 2); 1281 #else /* POLYMORPHIC */ 1282 return vshllbq_n_s8(a, 2); 1283 #endif /* POLYMORPHIC */ 1284 } 1285 1286 // CHECK-LABEL: @test_vshllbq_n_s16( 1287 // CHECK-NEXT: entry: 1288 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.v4i32.v8i16(<8 x i16> [[A:%.*]], i32 13, i32 0, i32 0) 1289 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 1290 // 1291 int32x4_t test_vshllbq_n_s16(int16x8_t a) 1292 { 1293 #ifdef POLYMORPHIC 1294 return vshllbq(a, 13); 1295 #else /* POLYMORPHIC */ 1296 return vshllbq_n_s16(a, 13); 1297 #endif /* POLYMORPHIC */ 1298 } 1299 1300 // CHECK-LABEL: @test_vshllbq_n_u8( 1301 // CHECK-NEXT: entry: 1302 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.v8i16.v16i8(<16 x i8> [[A:%.*]], i32 5, i32 1, i32 0) 1303 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 1304 // 1305 uint16x8_t test_vshllbq_n_u8(uint8x16_t a) 1306 { 1307 #ifdef POLYMORPHIC 1308 return vshllbq(a, 5); 1309 #else /* POLYMORPHIC */ 1310 return vshllbq_n_u8(a, 5); 1311 #endif /* POLYMORPHIC */ 1312 } 1313 1314 // CHECK-LABEL: @test_vshllbq_n_u16( 1315 // CHECK-NEXT: entry: 1316 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.v4i32.v8i16(<8 x i16> [[A:%.*]], i32 6, i32 1, i32 0) 1317 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 1318 // 1319 uint32x4_t test_vshllbq_n_u16(uint16x8_t a) 1320 { 1321 #ifdef POLYMORPHIC 1322 return vshllbq(a, 6); 1323 #else /* POLYMORPHIC */ 1324 return vshllbq_n_u16(a, 6); 1325 #endif /* POLYMORPHIC */ 1326 } 1327 1328 // CHECK-LABEL: @test_vshlltq_n_s8( 1329 // CHECK-NEXT: entry: 1330 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.v8i16.v16i8(<16 x i8> [[A:%.*]], i32 7, i32 0, i32 1) 1331 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 1332 // 1333 int16x8_t test_vshlltq_n_s8(int8x16_t a) 1334 { 1335 #ifdef POLYMORPHIC 1336 return vshlltq(a, 7); 1337 #else /* POLYMORPHIC */ 1338 return vshlltq_n_s8(a, 7); 1339 #endif /* POLYMORPHIC */ 1340 } 1341 1342 // CHECK-LABEL: @test_vshlltq_n_s16( 1343 // CHECK-NEXT: entry: 1344 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.v4i32.v8i16(<8 x i16> [[A:%.*]], i32 2, i32 0, i32 1) 1345 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 1346 // 1347 int32x4_t test_vshlltq_n_s16(int16x8_t a) 1348 { 1349 #ifdef POLYMORPHIC 1350 return vshlltq(a, 2); 1351 #else /* POLYMORPHIC */ 1352 return vshlltq_n_s16(a, 2); 1353 #endif /* POLYMORPHIC */ 1354 } 1355 1356 // CHECK-LABEL: @test_vshlltq_n_u8( 1357 // CHECK-NEXT: entry: 1358 // CHECK-NEXT: [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.v8i16.v16i8(<16 x i8> [[A:%.*]], i32 7, i32 1, i32 1) 1359 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 1360 // 1361 uint16x8_t test_vshlltq_n_u8(uint8x16_t a) 1362 { 1363 #ifdef POLYMORPHIC 1364 return vshlltq(a, 7); 1365 #else /* POLYMORPHIC */ 1366 return vshlltq_n_u8(a, 7); 1367 #endif /* POLYMORPHIC */ 1368 } 1369 1370 // CHECK-LABEL: @test_vshlltq_n_u16( 1371 // CHECK-NEXT: entry: 1372 // CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.v4i32.v8i16(<8 x i16> [[A:%.*]], i32 14, i32 1, i32 1) 1373 // CHECK-NEXT: ret <4 x i32> [[TMP0]] 1374 // 1375 uint32x4_t test_vshlltq_n_u16(uint16x8_t a) 1376 { 1377 #ifdef POLYMORPHIC 1378 return vshlltq(a, 14); 1379 #else /* POLYMORPHIC */ 1380 return vshlltq_n_u16(a, 14); 1381 #endif /* POLYMORPHIC */ 1382 } 1383 1384 // CHECK-LABEL: @test_vshllbq_m_n_s8( 1385 // CHECK-NEXT: entry: 1386 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1387 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1388 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 6, i32 0, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 1389 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1390 // 1391 int16x8_t test_vshllbq_m_n_s8(int16x8_t inactive, int8x16_t a, mve_pred16_t p) 1392 { 1393 #ifdef POLYMORPHIC 1394 return vshllbq_m(inactive, a, 6, p); 1395 #else /* POLYMORPHIC */ 1396 return vshllbq_m_n_s8(inactive, a, 6, p); 1397 #endif /* POLYMORPHIC */ 1398 } 1399 1400 // CHECK-LABEL: @test_vshllbq_m_n_s16( 1401 // CHECK-NEXT: entry: 1402 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1403 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1404 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 10, i32 0, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 1405 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1406 // 1407 int32x4_t test_vshllbq_m_n_s16(int32x4_t inactive, int16x8_t a, mve_pred16_t p) 1408 { 1409 #ifdef POLYMORPHIC 1410 return vshllbq_m(inactive, a, 10, p); 1411 #else /* POLYMORPHIC */ 1412 return vshllbq_m_n_s16(inactive, a, 10, p); 1413 #endif /* POLYMORPHIC */ 1414 } 1415 1416 // CHECK-LABEL: @test_vshllbq_m_n_u8( 1417 // CHECK-NEXT: entry: 1418 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1419 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1420 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 3, i32 1, i32 0, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 1421 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1422 // 1423 uint16x8_t test_vshllbq_m_n_u8(uint16x8_t inactive, uint8x16_t a, mve_pred16_t p) 1424 { 1425 #ifdef POLYMORPHIC 1426 return vshllbq_m(inactive, a, 3, p); 1427 #else /* POLYMORPHIC */ 1428 return vshllbq_m_n_u8(inactive, a, 3, p); 1429 #endif /* POLYMORPHIC */ 1430 } 1431 1432 // CHECK-LABEL: @test_vshllbq_m_n_u16( 1433 // CHECK-NEXT: entry: 1434 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1435 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1436 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 14, i32 1, i32 0, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 1437 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1438 // 1439 uint32x4_t test_vshllbq_m_n_u16(uint32x4_t inactive, uint16x8_t a, mve_pred16_t p) 1440 { 1441 #ifdef POLYMORPHIC 1442 return vshllbq_m(inactive, a, 14, p); 1443 #else /* POLYMORPHIC */ 1444 return vshllbq_m_n_u16(inactive, a, 14, p); 1445 #endif /* POLYMORPHIC */ 1446 } 1447 1448 // CHECK-LABEL: @test_vshlltq_m_n_s8( 1449 // CHECK-NEXT: entry: 1450 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1451 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1452 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 4, i32 0, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 1453 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1454 // 1455 int16x8_t test_vshlltq_m_n_s8(int16x8_t inactive, int8x16_t a, mve_pred16_t p) 1456 { 1457 #ifdef POLYMORPHIC 1458 return vshlltq_m(inactive, a, 4, p); 1459 #else /* POLYMORPHIC */ 1460 return vshlltq_m_n_s8(inactive, a, 4, p); 1461 #endif /* POLYMORPHIC */ 1462 } 1463 1464 // CHECK-LABEL: @test_vshlltq_m_n_s16( 1465 // CHECK-NEXT: entry: 1466 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1467 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1468 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 12, i32 0, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 1469 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1470 // 1471 int32x4_t test_vshlltq_m_n_s16(int32x4_t inactive, int16x8_t a, mve_pred16_t p) 1472 { 1473 #ifdef POLYMORPHIC 1474 return vshlltq_m(inactive, a, 12, p); 1475 #else /* POLYMORPHIC */ 1476 return vshlltq_m_n_s16(inactive, a, 12, p); 1477 #endif /* POLYMORPHIC */ 1478 } 1479 1480 // CHECK-LABEL: @test_vshlltq_m_n_u8( 1481 // CHECK-NEXT: entry: 1482 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1483 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1484 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 2, i32 1, i32 1, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]]) 1485 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1486 // 1487 uint16x8_t test_vshlltq_m_n_u8(uint16x8_t inactive, uint8x16_t a, mve_pred16_t p) 1488 { 1489 #ifdef POLYMORPHIC 1490 return vshlltq_m(inactive, a, 2, p); 1491 #else /* POLYMORPHIC */ 1492 return vshlltq_m_n_u8(inactive, a, 2, p); 1493 #endif /* POLYMORPHIC */ 1494 } 1495 1496 // CHECK-LABEL: @test_vshlltq_m_n_u16( 1497 // CHECK-NEXT: entry: 1498 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1499 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1500 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 9, i32 1, i32 1, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]]) 1501 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1502 // 1503 uint32x4_t test_vshlltq_m_n_u16(uint32x4_t inactive, uint16x8_t a, mve_pred16_t p) 1504 { 1505 #ifdef POLYMORPHIC 1506 return vshlltq_m(inactive, a, 9, p); 1507 #else /* POLYMORPHIC */ 1508 return vshlltq_m_n_u16(inactive, a, 9, p); 1509 #endif /* POLYMORPHIC */ 1510 } 1511 1512 // CHECK-LABEL: @test_vshllbq_x_n_s8( 1513 // CHECK-NEXT: entry: 1514 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1515 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1516 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 1, i32 0, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef) 1517 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1518 // 1519 int16x8_t test_vshllbq_x_n_s8(int8x16_t a, mve_pred16_t p) 1520 { 1521 #ifdef POLYMORPHIC 1522 return vshllbq_x(a, 1, p); 1523 #else /* POLYMORPHIC */ 1524 return vshllbq_x_n_s8(a, 1, p); 1525 #endif /* POLYMORPHIC */ 1526 } 1527 1528 // CHECK-LABEL: @test_vshllbq_x_n_s16( 1529 // CHECK-NEXT: entry: 1530 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1531 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1532 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 10, i32 0, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef) 1533 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1534 // 1535 int32x4_t test_vshllbq_x_n_s16(int16x8_t a, mve_pred16_t p) 1536 { 1537 #ifdef POLYMORPHIC 1538 return vshllbq_x(a, 10, p); 1539 #else /* POLYMORPHIC */ 1540 return vshllbq_x_n_s16(a, 10, p); 1541 #endif /* POLYMORPHIC */ 1542 } 1543 1544 // CHECK-LABEL: @test_vshllbq_x_n_u8( 1545 // CHECK-NEXT: entry: 1546 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1547 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1548 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 6, i32 1, i32 0, <8 x i1> [[TMP1]], <8 x i16> undef) 1549 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1550 // 1551 uint16x8_t test_vshllbq_x_n_u8(uint8x16_t a, mve_pred16_t p) 1552 { 1553 #ifdef POLYMORPHIC 1554 return vshllbq_x(a, 6, p); 1555 #else /* POLYMORPHIC */ 1556 return vshllbq_x_n_u8(a, 6, p); 1557 #endif /* POLYMORPHIC */ 1558 } 1559 1560 // CHECK-LABEL: @test_vshllbq_x_n_u16( 1561 // CHECK-NEXT: entry: 1562 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1563 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1564 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 10, i32 1, i32 0, <4 x i1> [[TMP1]], <4 x i32> undef) 1565 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1566 // 1567 uint32x4_t test_vshllbq_x_n_u16(uint16x8_t a, mve_pred16_t p) 1568 { 1569 #ifdef POLYMORPHIC 1570 return vshllbq_x(a, 10, p); 1571 #else /* POLYMORPHIC */ 1572 return vshllbq_x_n_u16(a, 10, p); 1573 #endif /* POLYMORPHIC */ 1574 } 1575 1576 // CHECK-LABEL: @test_vshlltq_x_n_s8( 1577 // CHECK-NEXT: entry: 1578 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1579 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1580 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 2, i32 0, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef) 1581 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1582 // 1583 int16x8_t test_vshlltq_x_n_s8(int8x16_t a, mve_pred16_t p) 1584 { 1585 #ifdef POLYMORPHIC 1586 return vshlltq_x(a, 2, p); 1587 #else /* POLYMORPHIC */ 1588 return vshlltq_x_n_s8(a, 2, p); 1589 #endif /* POLYMORPHIC */ 1590 } 1591 1592 // CHECK-LABEL: @test_vshlltq_x_n_s16( 1593 // CHECK-NEXT: entry: 1594 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1595 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1596 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 6, i32 0, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef) 1597 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1598 // 1599 int32x4_t test_vshlltq_x_n_s16(int16x8_t a, mve_pred16_t p) 1600 { 1601 #ifdef POLYMORPHIC 1602 return vshlltq_x(a, 6, p); 1603 #else /* POLYMORPHIC */ 1604 return vshlltq_x_n_s16(a, 6, p); 1605 #endif /* POLYMORPHIC */ 1606 } 1607 1608 // CHECK-LABEL: @test_vshlltq_x_n_u8( 1609 // CHECK-NEXT: entry: 1610 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1611 // CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) 1612 // CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vshll.imm.predicated.v8i16.v16i8.v8i1(<16 x i8> [[A:%.*]], i32 5, i32 1, i32 1, <8 x i1> [[TMP1]], <8 x i16> undef) 1613 // CHECK-NEXT: ret <8 x i16> [[TMP2]] 1614 // 1615 uint16x8_t test_vshlltq_x_n_u8(uint8x16_t a, mve_pred16_t p) 1616 { 1617 #ifdef POLYMORPHIC 1618 return vshlltq_x(a, 5, p); 1619 #else /* POLYMORPHIC */ 1620 return vshlltq_x_n_u8(a, 5, p); 1621 #endif /* POLYMORPHIC */ 1622 } 1623 1624 // CHECK-LABEL: @test_vshlltq_x_n_u16( 1625 // CHECK-NEXT: entry: 1626 // CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32 1627 // CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) 1628 // CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vshll.imm.predicated.v4i32.v8i16.v4i1(<8 x i16> [[A:%.*]], i32 3, i32 1, i32 1, <4 x i1> [[TMP1]], <4 x i32> undef) 1629 // CHECK-NEXT: ret <4 x i32> [[TMP2]] 1630 // 1631 uint32x4_t test_vshlltq_x_n_u16(uint16x8_t a, mve_pred16_t p) 1632 { 1633 #ifdef POLYMORPHIC 1634 return vshlltq_x(a, 3, p); 1635 #else /* POLYMORPHIC */ 1636 return vshlltq_x_n_u16(a, 3, p); 1637 #endif /* POLYMORPHIC */ 1638 } 1639 1640