1ceeff95cSSimon Tatham; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*254b4f25SSimon Tatham; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve -verify-machineinstrs -o - %s | FileCheck %s 3ceeff95cSSimon Tatham 4*254b4f25SSimon Tathamdefine i64 @test_asrl(i64 %value, i32 %shift) { 5*254b4f25SSimon Tatham; CHECK-LABEL: test_asrl: 6*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 7*254b4f25SSimon Tatham; CHECK-NEXT: asrl r0, r1, r2 8*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 9*254b4f25SSimon Tathamentry: 10*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 11*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 12*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 13*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.asrl(i32 %2, i32 %1, i32 %shift) 14*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 15*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 16*254b4f25SSimon Tatham %6 = shl i64 %5, 32 17*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 18*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 19*254b4f25SSimon Tatham %9 = or i64 %6, %8 20*254b4f25SSimon Tatham ret i64 %9 21*254b4f25SSimon Tatham} 22*254b4f25SSimon Tatham 23*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.asrl(i32, i32, i32) 24*254b4f25SSimon Tatham 25*254b4f25SSimon Tathamdefine i64 @test_lsll(i64 %value, i32 %shift) { 26*254b4f25SSimon Tatham; CHECK-LABEL: test_lsll: 27*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 28*254b4f25SSimon Tatham; CHECK-NEXT: lsll r0, r1, r2 29*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 30*254b4f25SSimon Tathamentry: 31*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 32*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 33*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 34*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.lsll(i32 %2, i32 %1, i32 %shift) 35*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 36*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 37*254b4f25SSimon Tatham %6 = shl i64 %5, 32 38*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 39*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 40*254b4f25SSimon Tatham %9 = or i64 %6, %8 41*254b4f25SSimon Tatham ret i64 %9 42*254b4f25SSimon Tatham} 43*254b4f25SSimon Tatham 44*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.lsll(i32, i32, i32) 45*254b4f25SSimon Tatham 46*254b4f25SSimon Tathamdefine i32 @test_sqrshr(i32 %value, i32 %shift) { 47*254b4f25SSimon Tatham; CHECK-LABEL: test_sqrshr: 48*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 49*254b4f25SSimon Tatham; CHECK-NEXT: sqrshr r0, r1 50*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 51*254b4f25SSimon Tathamentry: 52*254b4f25SSimon Tatham %0 = call i32 @llvm.arm.mve.sqrshr(i32 %value, i32 %shift) 53*254b4f25SSimon Tatham ret i32 %0 54*254b4f25SSimon Tatham} 55*254b4f25SSimon Tatham 56*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.sqrshr(i32, i32) 57*254b4f25SSimon Tatham 58*254b4f25SSimon Tathamdefine i64 @test_sqrshrl(i64 %value, i32 %shift) { 59*254b4f25SSimon Tatham; CHECK-LABEL: test_sqrshrl: 60*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 61*254b4f25SSimon Tatham; CHECK-NEXT: sqrshrl r0, r1, #64, r2 62*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 63*254b4f25SSimon Tathamentry: 64*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 65*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 66*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 67*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 %2, i32 %1, i32 %shift, i32 64) 68*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 69*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 70*254b4f25SSimon Tatham %6 = shl i64 %5, 32 71*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 72*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 73*254b4f25SSimon Tatham %9 = or i64 %6, %8 74*254b4f25SSimon Tatham ret i64 %9 75*254b4f25SSimon Tatham} 76*254b4f25SSimon Tatham 77*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.sqrshrl(i32, i32, i32, i32) 78*254b4f25SSimon Tatham 79*254b4f25SSimon Tathamdefine i64 @test_sqrshrl_sat48(i64 %value, i32 %shift) { 80*254b4f25SSimon Tatham; CHECK-LABEL: test_sqrshrl_sat48: 81*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 82*254b4f25SSimon Tatham; CHECK-NEXT: sqrshrl r0, r1, #48, r2 83*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 84*254b4f25SSimon Tathamentry: 85*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 86*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 87*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 88*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.sqrshrl(i32 %2, i32 %1, i32 %shift, i32 48) 89*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 90*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 91*254b4f25SSimon Tatham %6 = shl i64 %5, 32 92*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 93*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 94*254b4f25SSimon Tatham %9 = or i64 %6, %8 95*254b4f25SSimon Tatham ret i64 %9 96*254b4f25SSimon Tatham} 97*254b4f25SSimon Tatham 98*254b4f25SSimon Tathamdefine i32 @test_sqshl(i32 %value) { 99*254b4f25SSimon Tatham; CHECK-LABEL: test_sqshl: 100*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 101*254b4f25SSimon Tatham; CHECK-NEXT: sqshl r0, #2 102*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 103*254b4f25SSimon Tathamentry: 104*254b4f25SSimon Tatham %0 = call i32 @llvm.arm.mve.sqshl(i32 %value, i32 2) 105*254b4f25SSimon Tatham ret i32 %0 106*254b4f25SSimon Tatham} 107*254b4f25SSimon Tatham 108*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.sqshl(i32, i32) 109*254b4f25SSimon Tatham 110*254b4f25SSimon Tathamdefine i64 @test_sqshll(i64 %value) { 111*254b4f25SSimon Tatham; CHECK-LABEL: test_sqshll: 112*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 113*254b4f25SSimon Tatham; CHECK-NEXT: sqshll r0, r1, #17 114*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 115*254b4f25SSimon Tathamentry: 116*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 117*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 118*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 119*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.sqshll(i32 %2, i32 %1, i32 17) 120*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 121*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 122*254b4f25SSimon Tatham %6 = shl i64 %5, 32 123*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 124*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 125*254b4f25SSimon Tatham %9 = or i64 %6, %8 126*254b4f25SSimon Tatham ret i64 %9 127*254b4f25SSimon Tatham} 128*254b4f25SSimon Tatham 129*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.sqshll(i32, i32, i32) 130*254b4f25SSimon Tatham 131*254b4f25SSimon Tathamdefine i32 @test_srshr(i32 %value) { 132*254b4f25SSimon Tatham; CHECK-LABEL: test_srshr: 133*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 134*254b4f25SSimon Tatham; CHECK-NEXT: srshr r0, #6 135*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 136*254b4f25SSimon Tathamentry: 137*254b4f25SSimon Tatham %0 = call i32 @llvm.arm.mve.srshr(i32 %value, i32 6) 138*254b4f25SSimon Tatham ret i32 %0 139*254b4f25SSimon Tatham} 140*254b4f25SSimon Tatham 141*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.srshr(i32, i32) 142*254b4f25SSimon Tatham 143*254b4f25SSimon Tathamdefine i64 @test_srshrl(i64 %value) { 144*254b4f25SSimon Tatham; CHECK-LABEL: test_srshrl: 145*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 146*254b4f25SSimon Tatham; CHECK-NEXT: srshrl r0, r1, #26 147*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 148*254b4f25SSimon Tathamentry: 149*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 150*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 151*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 152*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.srshrl(i32 %2, i32 %1, i32 26) 153*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 154*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 155*254b4f25SSimon Tatham %6 = shl i64 %5, 32 156*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 157*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 158*254b4f25SSimon Tatham %9 = or i64 %6, %8 159*254b4f25SSimon Tatham ret i64 %9 160*254b4f25SSimon Tatham} 161*254b4f25SSimon Tatham 162*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.srshrl(i32, i32, i32) 163*254b4f25SSimon Tatham 164*254b4f25SSimon Tathamdefine i32 @test_uqrshl(i32 %value, i32 %shift) { 165*254b4f25SSimon Tatham; CHECK-LABEL: test_uqrshl: 166*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 167*254b4f25SSimon Tatham; CHECK-NEXT: uqrshl r0, r1 168*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 169*254b4f25SSimon Tathamentry: 170*254b4f25SSimon Tatham %0 = call i32 @llvm.arm.mve.uqrshl(i32 %value, i32 %shift) 171*254b4f25SSimon Tatham ret i32 %0 172*254b4f25SSimon Tatham} 173*254b4f25SSimon Tatham 174*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.uqrshl(i32, i32) 175*254b4f25SSimon Tatham 176*254b4f25SSimon Tathamdefine i64 @test_uqrshll(i64 %value, i32 %shift) { 177*254b4f25SSimon Tatham; CHECK-LABEL: test_uqrshll: 178*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 179*254b4f25SSimon Tatham; CHECK-NEXT: uqrshll r0, r1, #64, r2 180*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 181*254b4f25SSimon Tathamentry: 182*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 183*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 184*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 185*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.uqrshll(i32 %2, i32 %1, i32 %shift, i32 64) 186*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 187*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 188*254b4f25SSimon Tatham %6 = shl i64 %5, 32 189*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 190*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 191*254b4f25SSimon Tatham %9 = or i64 %6, %8 192*254b4f25SSimon Tatham ret i64 %9 193*254b4f25SSimon Tatham} 194*254b4f25SSimon Tatham 195*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.uqrshll(i32, i32, i32, i32) 196*254b4f25SSimon Tatham 197*254b4f25SSimon Tathamdefine i64 @test_uqrshll_sat48(i64 %value, i32 %shift) { 198*254b4f25SSimon Tatham; CHECK-LABEL: test_uqrshll_sat48: 199*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 200*254b4f25SSimon Tatham; CHECK-NEXT: uqrshll r0, r1, #48, r2 201*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 202*254b4f25SSimon Tathamentry: 203*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 204*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 205*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 206*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.uqrshll(i32 %2, i32 %1, i32 %shift, i32 48) 207*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 208*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 209*254b4f25SSimon Tatham %6 = shl i64 %5, 32 210*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 211*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 212*254b4f25SSimon Tatham %9 = or i64 %6, %8 213*254b4f25SSimon Tatham ret i64 %9 214*254b4f25SSimon Tatham} 215*254b4f25SSimon Tatham 216*254b4f25SSimon Tathamdefine i32 @test_uqshl(i32 %value) { 217*254b4f25SSimon Tatham; CHECK-LABEL: test_uqshl: 218*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 219*254b4f25SSimon Tatham; CHECK-NEXT: uqshl r0, #21 220*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 221*254b4f25SSimon Tathamentry: 222*254b4f25SSimon Tatham %0 = call i32 @llvm.arm.mve.uqshl(i32 %value, i32 21) 223*254b4f25SSimon Tatham ret i32 %0 224*254b4f25SSimon Tatham} 225*254b4f25SSimon Tatham 226*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.uqshl(i32, i32) 227*254b4f25SSimon Tatham 228*254b4f25SSimon Tathamdefine i64 @test_uqshll(i64 %value) { 229*254b4f25SSimon Tatham; CHECK-LABEL: test_uqshll: 230*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 231*254b4f25SSimon Tatham; CHECK-NEXT: uqshll r0, r1, #16 232*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 233*254b4f25SSimon Tathamentry: 234*254b4f25SSimon Tatham %0 = lshr i64 %value, 32 235*254b4f25SSimon Tatham %1 = trunc i64 %0 to i32 236*254b4f25SSimon Tatham %2 = trunc i64 %value to i32 237*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.uqshll(i32 %2, i32 %1, i32 16) 238*254b4f25SSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 239*254b4f25SSimon Tatham %5 = zext i32 %4 to i64 240*254b4f25SSimon Tatham %6 = shl i64 %5, 32 241*254b4f25SSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 242*254b4f25SSimon Tatham %8 = zext i32 %7 to i64 243*254b4f25SSimon Tatham %9 = or i64 %6, %8 244*254b4f25SSimon Tatham ret i64 %9 245*254b4f25SSimon Tatham} 246*254b4f25SSimon Tatham 247*254b4f25SSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.uqshll(i32, i32, i32) 248*254b4f25SSimon Tatham 249*254b4f25SSimon Tathamdefine i32 @test_urshr(i32 %value) { 250*254b4f25SSimon Tatham; CHECK-LABEL: test_urshr: 251*254b4f25SSimon Tatham; CHECK: @ %bb.0: @ %entry 252*254b4f25SSimon Tatham; CHECK-NEXT: urshr r0, #22 253*254b4f25SSimon Tatham; CHECK-NEXT: bx lr 254*254b4f25SSimon Tathamentry: 255*254b4f25SSimon Tatham %0 = call i32 @llvm.arm.mve.urshr(i32 %value, i32 22) 256*254b4f25SSimon Tatham ret i32 %0 257*254b4f25SSimon Tatham} 258*254b4f25SSimon Tatham 259*254b4f25SSimon Tathamdeclare i32 @llvm.arm.mve.urshr(i32, i32) 260*254b4f25SSimon Tatham 261*254b4f25SSimon Tathamdefine i64 @test_urshrl(i64 %value) { 262ceeff95cSSimon Tatham; CHECK-LABEL: test_urshrl: 263ceeff95cSSimon Tatham; CHECK: @ %bb.0: @ %entry 264ceeff95cSSimon Tatham; CHECK-NEXT: urshrl r0, r1, #6 265ceeff95cSSimon Tatham; CHECK-NEXT: bx lr 266ceeff95cSSimon Tathamentry: 267ceeff95cSSimon Tatham %0 = lshr i64 %value, 32 268ceeff95cSSimon Tatham %1 = trunc i64 %0 to i32 269ceeff95cSSimon Tatham %2 = trunc i64 %value to i32 270*254b4f25SSimon Tatham %3 = call { i32, i32 } @llvm.arm.mve.urshrl(i32 %2, i32 %1, i32 6) 271ceeff95cSSimon Tatham %4 = extractvalue { i32, i32 } %3, 1 272ceeff95cSSimon Tatham %5 = zext i32 %4 to i64 273*254b4f25SSimon Tatham %6 = shl i64 %5, 32 274ceeff95cSSimon Tatham %7 = extractvalue { i32, i32 } %3, 0 275ceeff95cSSimon Tatham %8 = zext i32 %7 to i64 276ceeff95cSSimon Tatham %9 = or i64 %6, %8 277ceeff95cSSimon Tatham ret i64 %9 278ceeff95cSSimon Tatham} 279ceeff95cSSimon Tatham 280ceeff95cSSimon Tathamdeclare { i32, i32 } @llvm.arm.mve.urshrl(i32, i32, i32) 281