1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s 3 4declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32) 5declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32) 6 7declare { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>) 8declare { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>) 9declare { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>) 10 11declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32, i32, i32, i32, i32, <8 x i16>, <8 x i16>, <8 x i1>) 12declare { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>) 13declare { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32, i32, i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i1>) 14 15define arm_aapcs_vfpcc i64 @test_vmlaldavaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) { 16; CHECK-LABEL: test_vmlaldavaq_s16: 17; CHECK: @ %bb.0: @ %entry 18; CHECK-NEXT: vmlalva.s16 r0, r1, q0, q1 19; CHECK-NEXT: bx lr 20entry: 21 %0 = lshr i64 %a, 32 22 %1 = trunc i64 %0 to i32 23 %2 = trunc i64 %a to i32 24 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c) 25 %4 = extractvalue { i32, i32 } %3, 1 26 %5 = zext i32 %4 to i64 27 %6 = shl i64 %5, 32 28 %7 = extractvalue { i32, i32 } %3, 0 29 %8 = zext i32 %7 to i64 30 %9 = or i64 %6, %8 31 ret i64 %9 32} 33 34define arm_aapcs_vfpcc i64 @test_vmlaldavaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 35; CHECK-LABEL: test_vmlaldavaq_s32: 36; CHECK: @ %bb.0: @ %entry 37; CHECK-NEXT: vmlalva.s32 r0, r1, q0, q1 38; CHECK-NEXT: bx lr 39entry: 40 %0 = lshr i64 %a, 32 41 %1 = trunc i64 %0 to i32 42 %2 = trunc i64 %a to i32 43 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 44 %4 = extractvalue { i32, i32 } %3, 1 45 %5 = zext i32 %4 to i64 46 %6 = shl i64 %5, 32 47 %7 = extractvalue { i32, i32 } %3, 0 48 %8 = zext i32 %7 to i64 49 %9 = or i64 %6, %8 50 ret i64 %9 51} 52 53define arm_aapcs_vfpcc i64 @test_vmlaldavaq_u16(i64 %a, <8 x i16> %b, <8 x i16> %c) { 54; CHECK-LABEL: test_vmlaldavaq_u16: 55; CHECK: @ %bb.0: @ %entry 56; CHECK-NEXT: vmlalva.u16 r0, r1, q0, q1 57; CHECK-NEXT: bx lr 58entry: 59 %0 = lshr i64 %a, 32 60 %1 = trunc i64 %0 to i32 61 %2 = trunc i64 %a to i32 62 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 1, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c) 63 %4 = extractvalue { i32, i32 } %3, 1 64 %5 = zext i32 %4 to i64 65 %6 = shl i64 %5, 32 66 %7 = extractvalue { i32, i32 } %3, 0 67 %8 = zext i32 %7 to i64 68 %9 = or i64 %6, %8 69 ret i64 %9 70} 71 72define arm_aapcs_vfpcc i64 @test_vmlaldavaq_u32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 73; CHECK-LABEL: test_vmlaldavaq_u32: 74; CHECK: @ %bb.0: @ %entry 75; CHECK-NEXT: vmlalva.u32 r0, r1, q0, q1 76; CHECK-NEXT: bx lr 77entry: 78 %0 = lshr i64 %a, 32 79 %1 = trunc i64 %0 to i32 80 %2 = trunc i64 %a to i32 81 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 82 %4 = extractvalue { i32, i32 } %3, 1 83 %5 = zext i32 %4 to i64 84 %6 = shl i64 %5, 32 85 %7 = extractvalue { i32, i32 } %3, 0 86 %8 = zext i32 %7 to i64 87 %9 = or i64 %6, %8 88 ret i64 %9 89} 90 91define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) { 92; CHECK-LABEL: test_vmlaldavaxq_s16: 93; CHECK: @ %bb.0: @ %entry 94; CHECK-NEXT: vmlaldavax.s16 r0, r1, q0, q1 95; CHECK-NEXT: bx lr 96entry: 97 %0 = lshr i64 %a, 32 98 %1 = trunc i64 %0 to i32 99 %2 = trunc i64 %a to i32 100 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c) 101 %4 = extractvalue { i32, i32 } %3, 1 102 %5 = zext i32 %4 to i64 103 %6 = shl i64 %5, 32 104 %7 = extractvalue { i32, i32 } %3, 0 105 %8 = zext i32 %7 to i64 106 %9 = or i64 %6, %8 107 ret i64 %9 108} 109 110define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 111; CHECK-LABEL: test_vmlaldavaxq_s32: 112; CHECK: @ %bb.0: @ %entry 113; CHECK-NEXT: vmlaldavax.s32 r0, r1, q0, q1 114; CHECK-NEXT: bx lr 115entry: 116 %0 = lshr i64 %a, 32 117 %1 = trunc i64 %0 to i32 118 %2 = trunc i64 %a to i32 119 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 120 %4 = extractvalue { i32, i32 } %3, 1 121 %5 = zext i32 %4 to i64 122 %6 = shl i64 %5, 32 123 %7 = extractvalue { i32, i32 } %3, 0 124 %8 = zext i32 %7 to i64 125 %9 = or i64 %6, %8 126 ret i64 %9 127} 128 129define arm_aapcs_vfpcc i64 @test_vmlsldavaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) { 130; CHECK-LABEL: test_vmlsldavaq_s16: 131; CHECK: @ %bb.0: @ %entry 132; CHECK-NEXT: vmlsldava.s16 r0, r1, q0, q1 133; CHECK-NEXT: bx lr 134entry: 135 %0 = lshr i64 %a, 32 136 %1 = trunc i64 %0 to i32 137 %2 = trunc i64 %a to i32 138 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c) 139 %4 = extractvalue { i32, i32 } %3, 1 140 %5 = zext i32 %4 to i64 141 %6 = shl i64 %5, 32 142 %7 = extractvalue { i32, i32 } %3, 0 143 %8 = zext i32 %7 to i64 144 %9 = or i64 %6, %8 145 ret i64 %9 146} 147 148define arm_aapcs_vfpcc i64 @test_vmlsldavaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 149; CHECK-LABEL: test_vmlsldavaq_s32: 150; CHECK: @ %bb.0: @ %entry 151; CHECK-NEXT: vmlsldava.s32 r0, r1, q0, q1 152; CHECK-NEXT: bx lr 153entry: 154 %0 = lshr i64 %a, 32 155 %1 = trunc i64 %0 to i32 156 %2 = trunc i64 %a to i32 157 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 158 %4 = extractvalue { i32, i32 } %3, 1 159 %5 = zext i32 %4 to i64 160 %6 = shl i64 %5, 32 161 %7 = extractvalue { i32, i32 } %3, 0 162 %8 = zext i32 %7 to i64 163 %9 = or i64 %6, %8 164 ret i64 %9 165} 166 167define arm_aapcs_vfpcc i64 @test_vmlsldaxvaq_s16(i64 %a, <8 x i16> %b, <8 x i16> %c) { 168; CHECK-LABEL: test_vmlsldaxvaq_s16: 169; CHECK: @ %bb.0: @ %entry 170; CHECK-NEXT: vmlsldavax.s16 r0, r1, q0, q1 171; CHECK-NEXT: bx lr 172entry: 173 %0 = lshr i64 %a, 32 174 %1 = trunc i64 %0 to i32 175 %2 = trunc i64 %a to i32 176 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c) 177 %4 = extractvalue { i32, i32 } %3, 1 178 %5 = zext i32 %4 to i64 179 %6 = shl i64 %5, 32 180 %7 = extractvalue { i32, i32 } %3, 0 181 %8 = zext i32 %7 to i64 182 %9 = or i64 %6, %8 183 ret i64 %9 184} 185 186define arm_aapcs_vfpcc i64 @test_vmlsldavaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 187; CHECK-LABEL: test_vmlsldavaxq_s32: 188; CHECK: @ %bb.0: @ %entry 189; CHECK-NEXT: vmlsldavax.s32 r0, r1, q0, q1 190; CHECK-NEXT: bx lr 191entry: 192 %0 = lshr i64 %a, 32 193 %1 = trunc i64 %0 to i32 194 %2 = trunc i64 %a to i32 195 %3 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 196 %4 = extractvalue { i32, i32 } %3, 1 197 %5 = zext i32 %4 to i64 198 %6 = shl i64 %5, 32 199 %7 = extractvalue { i32, i32 } %3, 0 200 %8 = zext i32 %7 to i64 201 %9 = or i64 %6, %8 202 ret i64 %9 203} 204 205define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 206; CHECK-LABEL: test_vrmlaldavhaq_s32: 207; CHECK: @ %bb.0: @ %entry 208; CHECK-NEXT: vrmlalvha.s32 r0, r1, q0, q1 209; CHECK-NEXT: bx lr 210entry: 211 %0 = lshr i64 %a, 32 212 %1 = trunc i64 %0 to i32 213 %2 = trunc i64 %a to i32 214 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 215 %4 = extractvalue { i32, i32 } %3, 1 216 %5 = zext i32 %4 to i64 217 %6 = shl i64 %5, 32 218 %7 = extractvalue { i32, i32 } %3, 0 219 %8 = zext i32 %7 to i64 220 %9 = or i64 %6, %8 221 ret i64 %9 222} 223 224define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_u32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 225; CHECK-LABEL: test_vrmlaldavhaq_u32: 226; CHECK: @ %bb.0: @ %entry 227; CHECK-NEXT: vrmlalvha.u32 r0, r1, q0, q1 228; CHECK-NEXT: bx lr 229entry: 230 %0 = lshr i64 %a, 32 231 %1 = trunc i64 %0 to i32 232 %2 = trunc i64 %a to i32 233 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 234 %4 = extractvalue { i32, i32 } %3, 1 235 %5 = zext i32 %4 to i64 236 %6 = shl i64 %5, 32 237 %7 = extractvalue { i32, i32 } %3, 0 238 %8 = zext i32 %7 to i64 239 %9 = or i64 %6, %8 240 ret i64 %9 241} 242 243define arm_aapcs_vfpcc i64 @test_vrmlaldavhaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 244; CHECK-LABEL: test_vrmlaldavhaxq_s32: 245; CHECK: @ %bb.0: @ %entry 246; CHECK-NEXT: vrmlaldavhax.s32 r0, r1, q0, q1 247; CHECK-NEXT: bx lr 248entry: 249 %0 = lshr i64 %a, 32 250 %1 = trunc i64 %0 to i32 251 %2 = trunc i64 %a to i32 252 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 253 %4 = extractvalue { i32, i32 } %3, 1 254 %5 = zext i32 %4 to i64 255 %6 = shl i64 %5, 32 256 %7 = extractvalue { i32, i32 } %3, 0 257 %8 = zext i32 %7 to i64 258 %9 = or i64 %6, %8 259 ret i64 %9 260} 261 262define arm_aapcs_vfpcc i64 @test_vrmlsldavhaq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 263; CHECK-LABEL: test_vrmlsldavhaq_s32: 264; CHECK: @ %bb.0: @ %entry 265; CHECK-NEXT: vrmlsldavha.s32 r0, r1, q0, q1 266; CHECK-NEXT: bx lr 267entry: 268 %0 = lshr i64 %a, 32 269 %1 = trunc i64 %0 to i32 270 %2 = trunc i64 %a to i32 271 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 272 %4 = extractvalue { i32, i32 } %3, 1 273 %5 = zext i32 %4 to i64 274 %6 = shl i64 %5, 32 275 %7 = extractvalue { i32, i32 } %3, 0 276 %8 = zext i32 %7 to i64 277 %9 = or i64 %6, %8 278 ret i64 %9 279} 280 281define arm_aapcs_vfpcc i64 @test_vrmlsldavhaxq_s32(i64 %a, <4 x i32> %b, <4 x i32> %c) { 282; CHECK-LABEL: test_vrmlsldavhaxq_s32: 283; CHECK: @ %bb.0: @ %entry 284; CHECK-NEXT: vrmlsldavhax.s32 r0, r1, q0, q1 285; CHECK-NEXT: bx lr 286entry: 287 %0 = lshr i64 %a, 32 288 %1 = trunc i64 %0 to i32 289 %2 = trunc i64 %a to i32 290 %3 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c) 291 %4 = extractvalue { i32, i32 } %3, 1 292 %5 = zext i32 %4 to i64 293 %6 = shl i64 %5, 32 294 %7 = extractvalue { i32, i32 } %3, 0 295 %8 = zext i32 %7 to i64 296 %9 = or i64 %6, %8 297 ret i64 %9 298} 299 300define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { 301; CHECK-LABEL: test_vmlaldavaq_p_s16: 302; CHECK: @ %bb.0: @ %entry 303; CHECK-NEXT: vmsr p0, r2 304; CHECK-NEXT: vpst 305; CHECK-NEXT: vmlalvat.s16 r0, r1, q0, q1 306; CHECK-NEXT: bx lr 307entry: 308 %0 = lshr i64 %a, 32 309 %1 = trunc i64 %0 to i32 310 %2 = trunc i64 %a to i32 311 %3 = zext i16 %p to i32 312 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) 313 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4) 314 %6 = extractvalue { i32, i32 } %5, 1 315 %7 = zext i32 %6 to i64 316 %8 = shl i64 %7, 32 317 %9 = extractvalue { i32, i32 } %5, 0 318 %10 = zext i32 %9 to i64 319 %11 = or i64 %8, %10 320 ret i64 %11 321} 322 323define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 324; CHECK-LABEL: test_vmlaldavaq_p_s32: 325; CHECK: @ %bb.0: @ %entry 326; CHECK-NEXT: vmsr p0, r2 327; CHECK-NEXT: vpst 328; CHECK-NEXT: vmlalvat.s32 r0, r1, q0, q1 329; CHECK-NEXT: bx lr 330entry: 331 %0 = lshr i64 %a, 32 332 %1 = trunc i64 %0 to i32 333 %2 = trunc i64 %a to i32 334 %3 = zext i16 %p to i32 335 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 336 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 337 %6 = extractvalue { i32, i32 } %5, 1 338 %7 = zext i32 %6 to i64 339 %8 = shl i64 %7, 32 340 %9 = extractvalue { i32, i32 } %5, 0 341 %10 = zext i32 %9 to i64 342 %11 = or i64 %8, %10 343 ret i64 %11 344} 345 346define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_u16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { 347; CHECK-LABEL: test_vmlaldavaq_p_u16: 348; CHECK: @ %bb.0: @ %entry 349; CHECK-NEXT: vmsr p0, r2 350; CHECK-NEXT: vpst 351; CHECK-NEXT: vmlalvat.u16 r0, r1, q0, q1 352; CHECK-NEXT: bx lr 353entry: 354 %0 = lshr i64 %a, 32 355 %1 = trunc i64 %0 to i32 356 %2 = trunc i64 %a to i32 357 %3 = zext i16 %p to i32 358 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) 359 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4) 360 %6 = extractvalue { i32, i32 } %5, 1 361 %7 = zext i32 %6 to i64 362 %8 = shl i64 %7, 32 363 %9 = extractvalue { i32, i32 } %5, 0 364 %10 = zext i32 %9 to i64 365 %11 = or i64 %8, %10 366 ret i64 %11 367} 368 369define arm_aapcs_vfpcc i64 @test_vmlaldavaq_p_u32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 370; CHECK-LABEL: test_vmlaldavaq_p_u32: 371; CHECK: @ %bb.0: @ %entry 372; CHECK-NEXT: vmsr p0, r2 373; CHECK-NEXT: vpst 374; CHECK-NEXT: vmlalvat.u32 r0, r1, q0, q1 375; CHECK-NEXT: bx lr 376entry: 377 %0 = lshr i64 %a, 32 378 %1 = trunc i64 %0 to i32 379 %2 = trunc i64 %a to i32 380 %3 = zext i16 %p to i32 381 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 382 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 383 %6 = extractvalue { i32, i32 } %5, 1 384 %7 = zext i32 %6 to i64 385 %8 = shl i64 %7, 32 386 %9 = extractvalue { i32, i32 } %5, 0 387 %10 = zext i32 %9 to i64 388 %11 = or i64 %8, %10 389 ret i64 %11 390} 391 392define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { 393; CHECK-LABEL: test_vmlaldavaxq_p_s16: 394; CHECK: @ %bb.0: @ %entry 395; CHECK-NEXT: vmsr p0, r2 396; CHECK-NEXT: vpst 397; CHECK-NEXT: vmlaldavaxt.s16 r0, r1, q0, q1 398; CHECK-NEXT: bx lr 399entry: 400 %0 = lshr i64 %a, 32 401 %1 = trunc i64 %0 to i32 402 %2 = trunc i64 %a to i32 403 %3 = zext i16 %p to i32 404 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) 405 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4) 406 %6 = extractvalue { i32, i32 } %5, 1 407 %7 = zext i32 %6 to i64 408 %8 = shl i64 %7, 32 409 %9 = extractvalue { i32, i32 } %5, 0 410 %10 = zext i32 %9 to i64 411 %11 = or i64 %8, %10 412 ret i64 %11 413} 414 415define arm_aapcs_vfpcc i64 @test_vmlaldavaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 416; CHECK-LABEL: test_vmlaldavaxq_p_s32: 417; CHECK: @ %bb.0: @ %entry 418; CHECK-NEXT: vmsr p0, r2 419; CHECK-NEXT: vpst 420; CHECK-NEXT: vmlaldavaxt.s32 r0, r1, q0, q1 421; CHECK-NEXT: bx lr 422entry: 423 %0 = lshr i64 %a, 32 424 %1 = trunc i64 %0 to i32 425 %2 = trunc i64 %a to i32 426 %3 = zext i16 %p to i32 427 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 428 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 429 %6 = extractvalue { i32, i32 } %5, 1 430 %7 = zext i32 %6 to i64 431 %8 = shl i64 %7, 32 432 %9 = extractvalue { i32, i32 } %5, 0 433 %10 = zext i32 %9 to i64 434 %11 = or i64 %8, %10 435 ret i64 %11 436} 437 438define arm_aapcs_vfpcc i64 @test_vmlsldavaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { 439; CHECK-LABEL: test_vmlsldavaq_p_s16: 440; CHECK: @ %bb.0: @ %entry 441; CHECK-NEXT: vmsr p0, r2 442; CHECK-NEXT: vpst 443; CHECK-NEXT: vmlsldavat.s16 r0, r1, q0, q1 444; CHECK-NEXT: bx lr 445entry: 446 %0 = lshr i64 %a, 32 447 %1 = trunc i64 %0 to i32 448 %2 = trunc i64 %a to i32 449 %3 = zext i16 %p to i32 450 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) 451 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4) 452 %6 = extractvalue { i32, i32 } %5, 1 453 %7 = zext i32 %6 to i64 454 %8 = shl i64 %7, 32 455 %9 = extractvalue { i32, i32 } %5, 0 456 %10 = zext i32 %9 to i64 457 %11 = or i64 %8, %10 458 ret i64 %11 459} 460 461define arm_aapcs_vfpcc i64 @test_vmlsldavaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 462; CHECK-LABEL: test_vmlsldavaq_p_s32: 463; CHECK: @ %bb.0: @ %entry 464; CHECK-NEXT: vmsr p0, r2 465; CHECK-NEXT: vpst 466; CHECK-NEXT: vmlsldavat.s32 r0, r1, q0, q1 467; CHECK-NEXT: bx lr 468entry: 469 %0 = lshr i64 %a, 32 470 %1 = trunc i64 %0 to i32 471 %2 = trunc i64 %a to i32 472 %3 = zext i16 %p to i32 473 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 474 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 475 %6 = extractvalue { i32, i32 } %5, 1 476 %7 = zext i32 %6 to i64 477 %8 = shl i64 %7, 32 478 %9 = extractvalue { i32, i32 } %5, 0 479 %10 = zext i32 %9 to i64 480 %11 = or i64 %8, %10 481 ret i64 %11 482} 483 484define arm_aapcs_vfpcc i64 @test_vmlsldaxvaq_p_s16(i64 %a, <8 x i16> %b, <8 x i16> %c, i16 zeroext %p) { 485; CHECK-LABEL: test_vmlsldaxvaq_p_s16: 486; CHECK: @ %bb.0: @ %entry 487; CHECK-NEXT: vmsr p0, r2 488; CHECK-NEXT: vpst 489; CHECK-NEXT: vmlsldavaxt.s16 r0, r1, q0, q1 490; CHECK-NEXT: bx lr 491entry: 492 %0 = lshr i64 %a, 32 493 %1 = trunc i64 %0 to i32 494 %2 = trunc i64 %a to i32 495 %3 = zext i16 %p to i32 496 %4 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %3) 497 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <8 x i16> %b, <8 x i16> %c, <8 x i1> %4) 498 %6 = extractvalue { i32, i32 } %5, 1 499 %7 = zext i32 %6 to i64 500 %8 = shl i64 %7, 32 501 %9 = extractvalue { i32, i32 } %5, 0 502 %10 = zext i32 %9 to i64 503 %11 = or i64 %8, %10 504 ret i64 %11 505} 506 507define arm_aapcs_vfpcc i64 @test_vmlsldavaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 508; CHECK-LABEL: test_vmlsldavaxq_p_s32: 509; CHECK: @ %bb.0: @ %entry 510; CHECK-NEXT: vmsr p0, r2 511; CHECK-NEXT: vpst 512; CHECK-NEXT: vmlsldavaxt.s32 r0, r1, q0, q1 513; CHECK-NEXT: bx lr 514entry: 515 %0 = lshr i64 %a, 32 516 %1 = trunc i64 %0 to i32 517 %2 = trunc i64 %a to i32 518 %3 = zext i16 %p to i32 519 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 520 %5 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 521 %6 = extractvalue { i32, i32 } %5, 1 522 %7 = zext i32 %6 to i64 523 %8 = shl i64 %7, 32 524 %9 = extractvalue { i32, i32 } %5, 0 525 %10 = zext i32 %9 to i64 526 %11 = or i64 %8, %10 527 ret i64 %11 528} 529 530define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 531; CHECK-LABEL: test_vrmlaldavhaq_p_s32: 532; CHECK: @ %bb.0: @ %entry 533; CHECK-NEXT: vmsr p0, r2 534; CHECK-NEXT: vpst 535; CHECK-NEXT: vrmlalvhat.s32 r0, r1, q0, q1 536; CHECK-NEXT: bx lr 537entry: 538 %0 = lshr i64 %a, 32 539 %1 = trunc i64 %0 to i32 540 %2 = trunc i64 %a to i32 541 %3 = zext i16 %p to i32 542 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 543 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 544 %6 = extractvalue { i32, i32 } %5, 1 545 %7 = zext i32 %6 to i64 546 %8 = shl i64 %7, 32 547 %9 = extractvalue { i32, i32 } %5, 0 548 %10 = zext i32 %9 to i64 549 %11 = or i64 %8, %10 550 ret i64 %11 551} 552 553define arm_aapcs_vfpcc i64 @test_vrmlaldavhaq_p_u32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 554; CHECK-LABEL: test_vrmlaldavhaq_p_u32: 555; CHECK: @ %bb.0: @ %entry 556; CHECK-NEXT: vmsr p0, r2 557; CHECK-NEXT: vpst 558; CHECK-NEXT: vrmlalvhat.u32 r0, r1, q0, q1 559; CHECK-NEXT: bx lr 560entry: 561 %0 = lshr i64 %a, 32 562 %1 = trunc i64 %0 to i32 563 %2 = trunc i64 %a to i32 564 %3 = zext i16 %p to i32 565 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 566 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 567 %6 = extractvalue { i32, i32 } %5, 1 568 %7 = zext i32 %6 to i64 569 %8 = shl i64 %7, 32 570 %9 = extractvalue { i32, i32 } %5, 0 571 %10 = zext i32 %9 to i64 572 %11 = or i64 %8, %10 573 ret i64 %11 574} 575 576define arm_aapcs_vfpcc i64 @test_vrmlaldavhaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 577; CHECK-LABEL: test_vrmlaldavhaxq_p_s32: 578; CHECK: @ %bb.0: @ %entry 579; CHECK-NEXT: vmsr p0, r2 580; CHECK-NEXT: vpst 581; CHECK-NEXT: vrmlaldavhaxt.s32 r0, r1, q0, q1 582; CHECK-NEXT: bx lr 583entry: 584 %0 = lshr i64 %a, 32 585 %1 = trunc i64 %0 to i32 586 %2 = trunc i64 %a to i32 587 %3 = zext i16 %p to i32 588 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 589 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 590 %6 = extractvalue { i32, i32 } %5, 1 591 %7 = zext i32 %6 to i64 592 %8 = shl i64 %7, 32 593 %9 = extractvalue { i32, i32 } %5, 0 594 %10 = zext i32 %9 to i64 595 %11 = or i64 %8, %10 596 ret i64 %11 597} 598 599define arm_aapcs_vfpcc i64 @test_vrmlsldavhaq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 600; CHECK-LABEL: test_vrmlsldavhaq_p_s32: 601; CHECK: @ %bb.0: @ %entry 602; CHECK-NEXT: vmsr p0, r2 603; CHECK-NEXT: vpst 604; CHECK-NEXT: vrmlsldavhat.s32 r0, r1, q0, q1 605; CHECK-NEXT: bx lr 606entry: 607 %0 = lshr i64 %a, 32 608 %1 = trunc i64 %0 to i32 609 %2 = trunc i64 %a to i32 610 %3 = zext i16 %p to i32 611 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 612 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 613 %6 = extractvalue { i32, i32 } %5, 1 614 %7 = zext i32 %6 to i64 615 %8 = shl i64 %7, 32 616 %9 = extractvalue { i32, i32 } %5, 0 617 %10 = zext i32 %9 to i64 618 %11 = or i64 %8, %10 619 ret i64 %11 620} 621 622define arm_aapcs_vfpcc i64 @test_vrmlsldavhaxq_p_s32(i64 %a, <4 x i32> %b, <4 x i32> %c, i16 zeroext %p) { 623; CHECK-LABEL: test_vrmlsldavhaxq_p_s32: 624; CHECK: @ %bb.0: @ %entry 625; CHECK-NEXT: vmsr p0, r2 626; CHECK-NEXT: vpst 627; CHECK-NEXT: vrmlsldavhaxt.s32 r0, r1, q0, q1 628; CHECK-NEXT: bx lr 629entry: 630 %0 = lshr i64 %a, 32 631 %1 = trunc i64 %0 to i32 632 %2 = trunc i64 %a to i32 633 %3 = zext i16 %p to i32 634 %4 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %3) 635 %5 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 %2, i32 %1, <4 x i32> %b, <4 x i32> %c, <4 x i1> %4) 636 %6 = extractvalue { i32, i32 } %5, 1 637 %7 = zext i32 %6 to i64 638 %8 = shl i64 %7, 32 639 %9 = extractvalue { i32, i32 } %5, 0 640 %10 = zext i32 %9 to i64 641 %11 = or i64 %8, %10 642 ret i64 %11 643} 644 645define arm_aapcs_vfpcc i64 @test_vmlaldavq_s16(<8 x i16> %a, <8 x i16> %b) { 646; CHECK-LABEL: test_vmlaldavq_s16: 647; CHECK: @ %bb.0: @ %entry 648; CHECK-NEXT: vmlalv.s16 r0, r1, q0, q1 649; CHECK-NEXT: bx lr 650entry: 651 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b) 652 %1 = extractvalue { i32, i32 } %0, 1 653 %2 = zext i32 %1 to i64 654 %3 = shl i64 %2, 32 655 %4 = extractvalue { i32, i32 } %0, 0 656 %5 = zext i32 %4 to i64 657 %6 = or i64 %3, %5 658 ret i64 %6 659} 660 661define arm_aapcs_vfpcc i64 @test_vmlaldavq_s32(<4 x i32> %a, <4 x i32> %b) { 662; CHECK-LABEL: test_vmlaldavq_s32: 663; CHECK: @ %bb.0: @ %entry 664; CHECK-NEXT: vmlalv.s32 r0, r1, q0, q1 665; CHECK-NEXT: bx lr 666entry: 667 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 668 %1 = extractvalue { i32, i32 } %0, 1 669 %2 = zext i32 %1 to i64 670 %3 = shl i64 %2, 32 671 %4 = extractvalue { i32, i32 } %0, 0 672 %5 = zext i32 %4 to i64 673 %6 = or i64 %3, %5 674 ret i64 %6 675} 676 677define arm_aapcs_vfpcc i64 @test_vmlaldavq_u16(<8 x i16> %a, <8 x i16> %b) { 678; CHECK-LABEL: test_vmlaldavq_u16: 679; CHECK: @ %bb.0: @ %entry 680; CHECK-NEXT: vmlalv.u16 r0, r1, q0, q1 681; CHECK-NEXT: bx lr 682entry: 683 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 1, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b) 684 %1 = extractvalue { i32, i32 } %0, 1 685 %2 = zext i32 %1 to i64 686 %3 = shl i64 %2, 32 687 %4 = extractvalue { i32, i32 } %0, 0 688 %5 = zext i32 %4 to i64 689 %6 = or i64 %3, %5 690 ret i64 %6 691} 692 693define arm_aapcs_vfpcc i64 @test_vmlaldavq_u32(<4 x i32> %a, <4 x i32> %b) { 694; CHECK-LABEL: test_vmlaldavq_u32: 695; CHECK: @ %bb.0: @ %entry 696; CHECK-NEXT: vmlalv.u32 r0, r1, q0, q1 697; CHECK-NEXT: bx lr 698entry: 699 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 700 %1 = extractvalue { i32, i32 } %0, 1 701 %2 = zext i32 %1 to i64 702 %3 = shl i64 %2, 32 703 %4 = extractvalue { i32, i32 } %0, 0 704 %5 = zext i32 %4 to i64 705 %6 = or i64 %3, %5 706 ret i64 %6 707} 708 709define arm_aapcs_vfpcc i64 @test_vmlaldavxq_s16(<8 x i16> %a, <8 x i16> %b) { 710; CHECK-LABEL: test_vmlaldavxq_s16: 711; CHECK: @ %bb.0: @ %entry 712; CHECK-NEXT: vmlaldavx.s16 r0, r1, q0, q1 713; CHECK-NEXT: bx lr 714entry: 715 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 0, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b) 716 %1 = extractvalue { i32, i32 } %0, 1 717 %2 = zext i32 %1 to i64 718 %3 = shl i64 %2, 32 719 %4 = extractvalue { i32, i32 } %0, 0 720 %5 = zext i32 %4 to i64 721 %6 = or i64 %3, %5 722 ret i64 %6 723} 724 725define arm_aapcs_vfpcc i64 @test_vmlaldavxq_s32(<4 x i32> %a, <4 x i32> %b) { 726; CHECK-LABEL: test_vmlaldavxq_s32: 727; CHECK: @ %bb.0: @ %entry 728; CHECK-NEXT: vmlaldavx.s32 r0, r1, q0, q1 729; CHECK-NEXT: bx lr 730entry: 731 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 732 %1 = extractvalue { i32, i32 } %0, 1 733 %2 = zext i32 %1 to i64 734 %3 = shl i64 %2, 32 735 %4 = extractvalue { i32, i32 } %0, 0 736 %5 = zext i32 %4 to i64 737 %6 = or i64 %3, %5 738 ret i64 %6 739} 740 741define arm_aapcs_vfpcc i64 @test_vmlsldavq_s16(<8 x i16> %a, <8 x i16> %b) { 742; CHECK-LABEL: test_vmlsldavq_s16: 743; CHECK: @ %bb.0: @ %entry 744; CHECK-NEXT: vmlsldav.s16 r0, r1, q0, q1 745; CHECK-NEXT: bx lr 746entry: 747 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b) 748 %1 = extractvalue { i32, i32 } %0, 1 749 %2 = zext i32 %1 to i64 750 %3 = shl i64 %2, 32 751 %4 = extractvalue { i32, i32 } %0, 0 752 %5 = zext i32 %4 to i64 753 %6 = or i64 %3, %5 754 ret i64 %6 755} 756 757define arm_aapcs_vfpcc i64 @test_vmlsldavq_s32(<4 x i32> %a, <4 x i32> %b) { 758; CHECK-LABEL: test_vmlsldavq_s32: 759; CHECK: @ %bb.0: @ %entry 760; CHECK-NEXT: vmlsldav.s32 r0, r1, q0, q1 761; CHECK-NEXT: bx lr 762entry: 763 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 764 %1 = extractvalue { i32, i32 } %0, 1 765 %2 = zext i32 %1 to i64 766 %3 = shl i64 %2, 32 767 %4 = extractvalue { i32, i32 } %0, 0 768 %5 = zext i32 %4 to i64 769 %6 = or i64 %3, %5 770 ret i64 %6 771} 772 773define arm_aapcs_vfpcc i64 @test_vmlsldavxvq_s16(<8 x i16> %a, <8 x i16> %b) { 774; CHECK-LABEL: test_vmlsldavxvq_s16: 775; CHECK: @ %bb.0: @ %entry 776; CHECK-NEXT: vmlsldavx.s16 r0, r1, q0, q1 777; CHECK-NEXT: bx lr 778entry: 779 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v8i16(i32 0, i32 1, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b) 780 %1 = extractvalue { i32, i32 } %0, 1 781 %2 = zext i32 %1 to i64 782 %3 = shl i64 %2, 32 783 %4 = extractvalue { i32, i32 } %0, 0 784 %5 = zext i32 %4 to i64 785 %6 = or i64 %3, %5 786 ret i64 %6 787} 788 789define arm_aapcs_vfpcc i64 @test_vmlsldavxq_s32(<4 x i32> %a, <4 x i32> %b) { 790; CHECK-LABEL: test_vmlsldavxq_s32: 791; CHECK: @ %bb.0: @ %entry 792; CHECK-NEXT: vmlsldavx.s32 r0, r1, q0, q1 793; CHECK-NEXT: bx lr 794entry: 795 %0 = call { i32, i32 } @llvm.arm.mve.vmlldava.v4i32(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 796 %1 = extractvalue { i32, i32 } %0, 1 797 %2 = zext i32 %1 to i64 798 %3 = shl i64 %2, 32 799 %4 = extractvalue { i32, i32 } %0, 0 800 %5 = zext i32 %4 to i64 801 %6 = or i64 %3, %5 802 ret i64 %6 803} 804 805define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_s32(<4 x i32> %a, <4 x i32> %b) { 806; CHECK-LABEL: test_vrmlaldavhq_s32: 807; CHECK: @ %bb.0: @ %entry 808; CHECK-NEXT: vrmlalvh.s32 r0, r1, q0, q1 809; CHECK-NEXT: bx lr 810entry: 811 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 812 %1 = extractvalue { i32, i32 } %0, 1 813 %2 = zext i32 %1 to i64 814 %3 = shl i64 %2, 32 815 %4 = extractvalue { i32, i32 } %0, 0 816 %5 = zext i32 %4 to i64 817 %6 = or i64 %3, %5 818 ret i64 %6 819} 820 821define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_u32(<4 x i32> %a, <4 x i32> %b) { 822; CHECK-LABEL: test_vrmlaldavhq_u32: 823; CHECK: @ %bb.0: @ %entry 824; CHECK-NEXT: vrmlalvh.u32 r0, r1, q0, q1 825; CHECK-NEXT: bx lr 826entry: 827 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 828 %1 = extractvalue { i32, i32 } %0, 1 829 %2 = zext i32 %1 to i64 830 %3 = shl i64 %2, 32 831 %4 = extractvalue { i32, i32 } %0, 0 832 %5 = zext i32 %4 to i64 833 %6 = or i64 %3, %5 834 ret i64 %6 835} 836 837define arm_aapcs_vfpcc i64 @test_vrmlaldavhxq_s32(<4 x i32> %a, <4 x i32> %b) { 838; CHECK-LABEL: test_vrmlaldavhxq_s32: 839; CHECK: @ %bb.0: @ %entry 840; CHECK-NEXT: vrmlaldavhx.s32 r0, r1, q0, q1 841; CHECK-NEXT: bx lr 842entry: 843 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 844 %1 = extractvalue { i32, i32 } %0, 1 845 %2 = zext i32 %1 to i64 846 %3 = shl i64 %2, 32 847 %4 = extractvalue { i32, i32 } %0, 0 848 %5 = zext i32 %4 to i64 849 %6 = or i64 %3, %5 850 ret i64 %6 851} 852 853define arm_aapcs_vfpcc i64 @test_vrmlsldavhq_s32(<4 x i32> %a, <4 x i32> %b) { 854; CHECK-LABEL: test_vrmlsldavhq_s32: 855; CHECK: @ %bb.0: @ %entry 856; CHECK-NEXT: vrmlsldavh.s32 r0, r1, q0, q1 857; CHECK-NEXT: bx lr 858entry: 859 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 860 %1 = extractvalue { i32, i32 } %0, 1 861 %2 = zext i32 %1 to i64 862 %3 = shl i64 %2, 32 863 %4 = extractvalue { i32, i32 } %0, 0 864 %5 = zext i32 %4 to i64 865 %6 = or i64 %3, %5 866 ret i64 %6 867} 868 869define arm_aapcs_vfpcc i64 @test_vrmlsldavhxq_s32(<4 x i32> %a, <4 x i32> %b) { 870; CHECK-LABEL: test_vrmlsldavhxq_s32: 871; CHECK: @ %bb.0: @ %entry 872; CHECK-NEXT: vrmlsldavhx.s32 r0, r1, q0, q1 873; CHECK-NEXT: bx lr 874entry: 875 %0 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.v4i32(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b) 876 %1 = extractvalue { i32, i32 } %0, 1 877 %2 = zext i32 %1 to i64 878 %3 = shl i64 %2, 32 879 %4 = extractvalue { i32, i32 } %0, 0 880 %5 = zext i32 %4 to i64 881 %6 = or i64 %3, %5 882 ret i64 %6 883} 884 885define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { 886; CHECK-LABEL: test_vmlaldavq_p_s16: 887; CHECK: @ %bb.0: @ %entry 888; CHECK-NEXT: vmsr p0, r0 889; CHECK-NEXT: vpst 890; CHECK-NEXT: vmlalvt.s16 r0, r1, q0, q1 891; CHECK-NEXT: bx lr 892entry: 893 %0 = zext i16 %p to i32 894 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) 895 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1) 896 %3 = extractvalue { i32, i32 } %2, 1 897 %4 = zext i32 %3 to i64 898 %5 = shl i64 %4, 32 899 %6 = extractvalue { i32, i32 } %2, 0 900 %7 = zext i32 %6 to i64 901 %8 = or i64 %5, %7 902 ret i64 %8 903} 904 905define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 906; CHECK-LABEL: test_vmlaldavq_p_s32: 907; CHECK: @ %bb.0: @ %entry 908; CHECK-NEXT: vmsr p0, r0 909; CHECK-NEXT: vpst 910; CHECK-NEXT: vmlalvt.s32 r0, r1, q0, q1 911; CHECK-NEXT: bx lr 912entry: 913 %0 = zext i16 %p to i32 914 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 915 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 916 %3 = extractvalue { i32, i32 } %2, 1 917 %4 = zext i32 %3 to i64 918 %5 = shl i64 %4, 32 919 %6 = extractvalue { i32, i32 } %2, 0 920 %7 = zext i32 %6 to i64 921 %8 = or i64 %5, %7 922 ret i64 %8 923} 924 925define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_u16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { 926; CHECK-LABEL: test_vmlaldavq_p_u16: 927; CHECK: @ %bb.0: @ %entry 928; CHECK-NEXT: vmsr p0, r0 929; CHECK-NEXT: vpst 930; CHECK-NEXT: vmlalvt.u16 r0, r1, q0, q1 931; CHECK-NEXT: bx lr 932entry: 933 %0 = zext i16 %p to i32 934 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) 935 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 1, i32 0, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1) 936 %3 = extractvalue { i32, i32 } %2, 1 937 %4 = zext i32 %3 to i64 938 %5 = shl i64 %4, 32 939 %6 = extractvalue { i32, i32 } %2, 0 940 %7 = zext i32 %6 to i64 941 %8 = or i64 %5, %7 942 ret i64 %8 943} 944 945define arm_aapcs_vfpcc i64 @test_vmlaldavq_p_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 946; CHECK-LABEL: test_vmlaldavq_p_u32: 947; CHECK: @ %bb.0: @ %entry 948; CHECK-NEXT: vmsr p0, r0 949; CHECK-NEXT: vpst 950; CHECK-NEXT: vmlalvt.u32 r0, r1, q0, q1 951; CHECK-NEXT: bx lr 952entry: 953 %0 = zext i16 %p to i32 954 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 955 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 956 %3 = extractvalue { i32, i32 } %2, 1 957 %4 = zext i32 %3 to i64 958 %5 = shl i64 %4, 32 959 %6 = extractvalue { i32, i32 } %2, 0 960 %7 = zext i32 %6 to i64 961 %8 = or i64 %5, %7 962 ret i64 %8 963} 964 965define arm_aapcs_vfpcc i64 @test_vmlaldavxq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { 966; CHECK-LABEL: test_vmlaldavxq_p_s16: 967; CHECK: @ %bb.0: @ %entry 968; CHECK-NEXT: vmsr p0, r0 969; CHECK-NEXT: vpst 970; CHECK-NEXT: vmlaldavxt.s16 r0, r1, q0, q1 971; CHECK-NEXT: bx lr 972entry: 973 %0 = zext i16 %p to i32 974 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) 975 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 0, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1) 976 %3 = extractvalue { i32, i32 } %2, 1 977 %4 = zext i32 %3 to i64 978 %5 = shl i64 %4, 32 979 %6 = extractvalue { i32, i32 } %2, 0 980 %7 = zext i32 %6 to i64 981 %8 = or i64 %5, %7 982 ret i64 %8 983} 984 985define arm_aapcs_vfpcc i64 @test_vmlaldavxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 986; CHECK-LABEL: test_vmlaldavxq_p_s32: 987; CHECK: @ %bb.0: @ %entry 988; CHECK-NEXT: vmsr p0, r0 989; CHECK-NEXT: vpst 990; CHECK-NEXT: vmlaldavxt.s32 r0, r1, q0, q1 991; CHECK-NEXT: bx lr 992entry: 993 %0 = zext i16 %p to i32 994 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 995 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 996 %3 = extractvalue { i32, i32 } %2, 1 997 %4 = zext i32 %3 to i64 998 %5 = shl i64 %4, 32 999 %6 = extractvalue { i32, i32 } %2, 0 1000 %7 = zext i32 %6 to i64 1001 %8 = or i64 %5, %7 1002 ret i64 %8 1003} 1004 1005define arm_aapcs_vfpcc i64 @test_vmlsldavq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { 1006; CHECK-LABEL: test_vmlsldavq_p_s16: 1007; CHECK: @ %bb.0: @ %entry 1008; CHECK-NEXT: vmsr p0, r0 1009; CHECK-NEXT: vpst 1010; CHECK-NEXT: vmlsldavt.s16 r0, r1, q0, q1 1011; CHECK-NEXT: bx lr 1012entry: 1013 %0 = zext i16 %p to i32 1014 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) 1015 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 0, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1) 1016 %3 = extractvalue { i32, i32 } %2, 1 1017 %4 = zext i32 %3 to i64 1018 %5 = shl i64 %4, 32 1019 %6 = extractvalue { i32, i32 } %2, 0 1020 %7 = zext i32 %6 to i64 1021 %8 = or i64 %5, %7 1022 ret i64 %8 1023} 1024 1025define arm_aapcs_vfpcc i64 @test_vmlsldavq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 1026; CHECK-LABEL: test_vmlsldavq_p_s32: 1027; CHECK: @ %bb.0: @ %entry 1028; CHECK-NEXT: vmsr p0, r0 1029; CHECK-NEXT: vpst 1030; CHECK-NEXT: vmlsldavt.s32 r0, r1, q0, q1 1031; CHECK-NEXT: bx lr 1032entry: 1033 %0 = zext i16 %p to i32 1034 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 1035 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 1036 %3 = extractvalue { i32, i32 } %2, 1 1037 %4 = zext i32 %3 to i64 1038 %5 = shl i64 %4, 32 1039 %6 = extractvalue { i32, i32 } %2, 0 1040 %7 = zext i32 %6 to i64 1041 %8 = or i64 %5, %7 1042 ret i64 %8 1043} 1044 1045define arm_aapcs_vfpcc i64 @test_vmlsldaxvq_p_s16(<8 x i16> %a, <8 x i16> %b, i16 zeroext %p) { 1046; CHECK-LABEL: test_vmlsldaxvq_p_s16: 1047; CHECK: @ %bb.0: @ %entry 1048; CHECK-NEXT: vmsr p0, r0 1049; CHECK-NEXT: vpst 1050; CHECK-NEXT: vmlsldavxt.s16 r0, r1, q0, q1 1051; CHECK-NEXT: bx lr 1052entry: 1053 %0 = zext i16 %p to i32 1054 %1 = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0) 1055 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v8i16.v8i1(i32 0, i32 1, i32 1, i32 0, i32 0, <8 x i16> %a, <8 x i16> %b, <8 x i1> %1) 1056 %3 = extractvalue { i32, i32 } %2, 1 1057 %4 = zext i32 %3 to i64 1058 %5 = shl i64 %4, 32 1059 %6 = extractvalue { i32, i32 } %2, 0 1060 %7 = zext i32 %6 to i64 1061 %8 = or i64 %5, %7 1062 ret i64 %8 1063} 1064 1065define arm_aapcs_vfpcc i64 @test_vmlsldavxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 1066; CHECK-LABEL: test_vmlsldavxq_p_s32: 1067; CHECK: @ %bb.0: @ %entry 1068; CHECK-NEXT: vmsr p0, r0 1069; CHECK-NEXT: vpst 1070; CHECK-NEXT: vmlsldavxt.s32 r0, r1, q0, q1 1071; CHECK-NEXT: bx lr 1072entry: 1073 %0 = zext i16 %p to i32 1074 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 1075 %2 = call { i32, i32 } @llvm.arm.mve.vmlldava.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 1076 %3 = extractvalue { i32, i32 } %2, 1 1077 %4 = zext i32 %3 to i64 1078 %5 = shl i64 %4, 32 1079 %6 = extractvalue { i32, i32 } %2, 0 1080 %7 = zext i32 %6 to i64 1081 %8 = or i64 %5, %7 1082 ret i64 %8 1083} 1084 1085define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 1086; CHECK-LABEL: test_vrmlaldavhq_p_s32: 1087; CHECK: @ %bb.0: @ %entry 1088; CHECK-NEXT: vmsr p0, r0 1089; CHECK-NEXT: vpst 1090; CHECK-NEXT: vrmlalvht.s32 r0, r1, q0, q1 1091; CHECK-NEXT: bx lr 1092entry: 1093 %0 = zext i16 %p to i32 1094 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 1095 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 1096 %3 = extractvalue { i32, i32 } %2, 1 1097 %4 = zext i32 %3 to i64 1098 %5 = shl i64 %4, 32 1099 %6 = extractvalue { i32, i32 } %2, 0 1100 %7 = zext i32 %6 to i64 1101 %8 = or i64 %5, %7 1102 ret i64 %8 1103} 1104 1105define arm_aapcs_vfpcc i64 @test_vrmlaldavhq_p_u32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 1106; CHECK-LABEL: test_vrmlaldavhq_p_u32: 1107; CHECK: @ %bb.0: @ %entry 1108; CHECK-NEXT: vmsr p0, r0 1109; CHECK-NEXT: vpst 1110; CHECK-NEXT: vrmlalvht.u32 r0, r1, q0, q1 1111; CHECK-NEXT: bx lr 1112entry: 1113 %0 = zext i16 %p to i32 1114 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 1115 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 1, i32 0, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 1116 %3 = extractvalue { i32, i32 } %2, 1 1117 %4 = zext i32 %3 to i64 1118 %5 = shl i64 %4, 32 1119 %6 = extractvalue { i32, i32 } %2, 0 1120 %7 = zext i32 %6 to i64 1121 %8 = or i64 %5, %7 1122 ret i64 %8 1123} 1124 1125define arm_aapcs_vfpcc i64 @test_vrmlaldavhxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 1126; CHECK-LABEL: test_vrmlaldavhxq_p_s32: 1127; CHECK: @ %bb.0: @ %entry 1128; CHECK-NEXT: vmsr p0, r0 1129; CHECK-NEXT: vpst 1130; CHECK-NEXT: vrmlaldavhxt.s32 r0, r1, q0, q1 1131; CHECK-NEXT: bx lr 1132entry: 1133 %0 = zext i16 %p to i32 1134 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 1135 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 0, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 1136 %3 = extractvalue { i32, i32 } %2, 1 1137 %4 = zext i32 %3 to i64 1138 %5 = shl i64 %4, 32 1139 %6 = extractvalue { i32, i32 } %2, 0 1140 %7 = zext i32 %6 to i64 1141 %8 = or i64 %5, %7 1142 ret i64 %8 1143} 1144 1145define arm_aapcs_vfpcc i64 @test_vrmlsldavhq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 1146; CHECK-LABEL: test_vrmlsldavhq_p_s32: 1147; CHECK: @ %bb.0: @ %entry 1148; CHECK-NEXT: vmsr p0, r0 1149; CHECK-NEXT: vpst 1150; CHECK-NEXT: vrmlsldavht.s32 r0, r1, q0, q1 1151; CHECK-NEXT: bx lr 1152entry: 1153 %0 = zext i16 %p to i32 1154 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 1155 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 0, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 1156 %3 = extractvalue { i32, i32 } %2, 1 1157 %4 = zext i32 %3 to i64 1158 %5 = shl i64 %4, 32 1159 %6 = extractvalue { i32, i32 } %2, 0 1160 %7 = zext i32 %6 to i64 1161 %8 = or i64 %5, %7 1162 ret i64 %8 1163} 1164 1165define arm_aapcs_vfpcc i64 @test_vrmlsldavhxq_p_s32(<4 x i32> %a, <4 x i32> %b, i16 zeroext %p) { 1166; CHECK-LABEL: test_vrmlsldavhxq_p_s32: 1167; CHECK: @ %bb.0: @ %entry 1168; CHECK-NEXT: vmsr p0, r0 1169; CHECK-NEXT: vpst 1170; CHECK-NEXT: vrmlsldavhxt.s32 r0, r1, q0, q1 1171; CHECK-NEXT: bx lr 1172entry: 1173 %0 = zext i16 %p to i32 1174 %1 = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0) 1175 %2 = call { i32, i32 } @llvm.arm.mve.vrmlldavha.predicated.v4i32.v4i1(i32 0, i32 1, i32 1, i32 0, i32 0, <4 x i32> %a, <4 x i32> %b, <4 x i1> %1) 1176 %3 = extractvalue { i32, i32 } %2, 1 1177 %4 = zext i32 %3 to i64 1178 %5 = shl i64 %4, 32 1179 %6 = extractvalue { i32, i32 } %2, 0 1180 %7 = zext i32 %6 to i64 1181 %8 = or i64 %5, %7 1182 ret i64 %8 1183} 1184