1*3eaed9e6Smelonedo; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*3eaed9e6Smelonedo; RUN: llc -O0 -mtriple=riscv32 -mattr=+xcvbitmanip -verify-machineinstrs < %s \ 3*3eaed9e6Smelonedo; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-O0 4*3eaed9e6Smelonedo; RUN: llc -O3 -mtriple=riscv32 -mattr=+xcvbitmanip -verify-machineinstrs < %s \ 5*3eaed9e6Smelonedo; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-O3 6*3eaed9e6Smelonedo 7*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.extract(i32, i32) 8*3eaed9e6Smelonedo 9*3eaed9e6Smelonedodefine i32 @test.cv.extractr(i32 %a, i32 %b) { 10*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extractr: 11*3eaed9e6Smelonedo; CHECK: # %bb.0: 12*3eaed9e6Smelonedo; CHECK-NEXT: cv.extractr a0, a0, a1 13*3eaed9e6Smelonedo; CHECK-NEXT: ret 14*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 %b) 15*3eaed9e6Smelonedo ret i32 %1 16*3eaed9e6Smelonedo} 17*3eaed9e6Smelonedo 18*3eaed9e6Smelonedodefine i32 @test.cv.extract(i32 %a) { 19*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extract: 20*3eaed9e6Smelonedo; CHECK: # %bb.0: 21*3eaed9e6Smelonedo; CHECK-NEXT: cv.extract a0, a0, 2, 1 22*3eaed9e6Smelonedo; CHECK-NEXT: ret 23*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 65) 24*3eaed9e6Smelonedo ret i32 %1 25*3eaed9e6Smelonedo} 26*3eaed9e6Smelonedo 27*3eaed9e6Smelonedodefine i32 @test.cv.extract1023(i32 %a) { 28*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extract1023: 29*3eaed9e6Smelonedo; CHECK: # %bb.0: 30*3eaed9e6Smelonedo; CHECK-NEXT: cv.extract a0, a0, 31, 31 31*3eaed9e6Smelonedo; CHECK-NEXT: ret 32*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 1023) 33*3eaed9e6Smelonedo ret i32 %1 34*3eaed9e6Smelonedo} 35*3eaed9e6Smelonedo 36*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.extractu(i32, i32) 37*3eaed9e6Smelonedo 38*3eaed9e6Smelonedodefine i32 @test.cv.extractur(i32 %a, i32 %b) { 39*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extractur: 40*3eaed9e6Smelonedo; CHECK: # %bb.0: 41*3eaed9e6Smelonedo; CHECK-NEXT: cv.extractur a0, a0, a1 42*3eaed9e6Smelonedo; CHECK-NEXT: ret 43*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.extractu(i32 %a, i32 %b) 44*3eaed9e6Smelonedo ret i32 %1 45*3eaed9e6Smelonedo} 46*3eaed9e6Smelonedo 47*3eaed9e6Smelonedodefine i32 @test.cv.extractu(i32 %a) { 48*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extractu: 49*3eaed9e6Smelonedo; CHECK: # %bb.0: 50*3eaed9e6Smelonedo; CHECK-NEXT: cv.extractu a0, a0, 2, 1 51*3eaed9e6Smelonedo; CHECK-NEXT: ret 52*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.extractu(i32 %a, i32 65) 53*3eaed9e6Smelonedo ret i32 %1 54*3eaed9e6Smelonedo} 55*3eaed9e6Smelonedo 56*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.insert(i32, i32, i32) 57*3eaed9e6Smelonedo 58*3eaed9e6Smelonedodefine i32 @test.cv.insert(i32 %c, i32 %a) { 59*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.insert: 60*3eaed9e6Smelonedo; CHECK: # %bb.0: 61*3eaed9e6Smelonedo; CHECK-NEXT: cv.insert a0, a1, 2, 1 62*3eaed9e6Smelonedo; CHECK-NEXT: ret 63*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.insert(i32 %a, i32 65, i32 %c) 64*3eaed9e6Smelonedo ret i32 %1 65*3eaed9e6Smelonedo} 66*3eaed9e6Smelonedo 67*3eaed9e6Smelonedodefine i32 @test.cv.insertr(i32 %c, i32 %b, i32 %a) { 68*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.insertr: 69*3eaed9e6Smelonedo; CHECK: # %bb.0: 70*3eaed9e6Smelonedo; CHECK-NEXT: cv.insertr a0, a2, a1 71*3eaed9e6Smelonedo; CHECK-NEXT: ret 72*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.insert(i32 %a, i32 %b, i32 %c) 73*3eaed9e6Smelonedo ret i32 %1 74*3eaed9e6Smelonedo} 75*3eaed9e6Smelonedo 76*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.bclr(i32, i32) 77*3eaed9e6Smelonedo 78*3eaed9e6Smelonedodefine i32 @test.cv.bclrr(i32 %a, i32 %b) { 79*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bclrr: 80*3eaed9e6Smelonedo; CHECK: # %bb.0: 81*3eaed9e6Smelonedo; CHECK-NEXT: cv.bclrr a0, a0, a1 82*3eaed9e6Smelonedo; CHECK-NEXT: ret 83*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.bclr(i32 %a, i32 %b) 84*3eaed9e6Smelonedo ret i32 %1 85*3eaed9e6Smelonedo} 86*3eaed9e6Smelonedo 87*3eaed9e6Smelonedodefine i32 @test.cv.bclr(i32 %a) { 88*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bclr: 89*3eaed9e6Smelonedo; CHECK: # %bb.0: 90*3eaed9e6Smelonedo; CHECK-NEXT: cv.bclr a0, a0, 2, 1 91*3eaed9e6Smelonedo; CHECK-NEXT: ret 92*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.bclr(i32 %a, i32 65) 93*3eaed9e6Smelonedo ret i32 %1 94*3eaed9e6Smelonedo} 95*3eaed9e6Smelonedo 96*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.bset(i32, i32) 97*3eaed9e6Smelonedo 98*3eaed9e6Smelonedodefine i32 @test.cv.bsetr(i32 %a, i32 %b) { 99*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bsetr: 100*3eaed9e6Smelonedo; CHECK: # %bb.0: 101*3eaed9e6Smelonedo; CHECK-NEXT: cv.bsetr a0, a0, a1 102*3eaed9e6Smelonedo; CHECK-NEXT: ret 103*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.bset(i32 %a, i32 %b) 104*3eaed9e6Smelonedo ret i32 %1 105*3eaed9e6Smelonedo} 106*3eaed9e6Smelonedo 107*3eaed9e6Smelonedodefine i32 @test.cv.bset(i32 %a) { 108*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bset: 109*3eaed9e6Smelonedo; CHECK: # %bb.0: 110*3eaed9e6Smelonedo; CHECK-NEXT: cv.bset a0, a0, 2, 1 111*3eaed9e6Smelonedo; CHECK-NEXT: ret 112*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.bset(i32 %a, i32 65) 113*3eaed9e6Smelonedo ret i32 %1 114*3eaed9e6Smelonedo} 115*3eaed9e6Smelonedo 116*3eaed9e6Smelonedodeclare i32 @llvm.cttz.i32(i32, i1) 117*3eaed9e6Smelonedo 118*3eaed9e6Smelonedodefine i32 @test.cv.ff1(i32 %a) { 119*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.ff1: 120*3eaed9e6Smelonedo; CHECK: # %bb.0: 121*3eaed9e6Smelonedo; CHECK-NEXT: cv.ff1 a0, a0 122*3eaed9e6Smelonedo; CHECK-NEXT: ret 123*3eaed9e6Smelonedo %1 = call i32 @llvm.cttz.i32(i32 %a, i1 0) 124*3eaed9e6Smelonedo ret i32 %1 125*3eaed9e6Smelonedo} 126*3eaed9e6Smelonedo 127*3eaed9e6Smelonedodeclare i32 @llvm.ctlz.i32(i32, i1) 128*3eaed9e6Smelonedo 129*3eaed9e6Smelonedodefine i32 @test.cv.fl1(i32 %a) { 130*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.fl1: 131*3eaed9e6Smelonedo; CHECK: # %bb.0: 132*3eaed9e6Smelonedo; CHECK-NEXT: cv.fl1 a0, a0 133*3eaed9e6Smelonedo; CHECK-NEXT: ret 134*3eaed9e6Smelonedo %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 0) 135*3eaed9e6Smelonedo ret i32 %1 136*3eaed9e6Smelonedo} 137*3eaed9e6Smelonedo 138*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.clb(i32) 139*3eaed9e6Smelonedo 140*3eaed9e6Smelonedodefine i32 @test.cv.clb(i32 %a) { 141*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.clb: 142*3eaed9e6Smelonedo; CHECK: # %bb.0: 143*3eaed9e6Smelonedo; CHECK-NEXT: cv.clb a0, a0 144*3eaed9e6Smelonedo; CHECK-NEXT: ret 145*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.clb(i32 %a) 146*3eaed9e6Smelonedo ret i32 %1 147*3eaed9e6Smelonedo} 148*3eaed9e6Smelonedo 149*3eaed9e6Smelonedodeclare i32 @llvm.ctpop(i32) 150*3eaed9e6Smelonedo 151*3eaed9e6Smelonedodefine i32 @test.cv.cnt(i32 %a) { 152*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.cnt: 153*3eaed9e6Smelonedo; CHECK: # %bb.0: 154*3eaed9e6Smelonedo; CHECK-NEXT: cv.cnt a0, a0 155*3eaed9e6Smelonedo; CHECK-NEXT: ret 156*3eaed9e6Smelonedo %1 = call i32 @llvm.ctpop(i32 %a) 157*3eaed9e6Smelonedo ret i32 %1 158*3eaed9e6Smelonedo} 159*3eaed9e6Smelonedo 160*3eaed9e6Smelonedodeclare i32 @llvm.fshl.i32(i32, i32, i32) 161*3eaed9e6Smelonedo 162*3eaed9e6Smelonedodefine i32 @test.llvm.fshl.imm(i32 %a) { 163*3eaed9e6Smelonedo; CHECK-LABEL: test.llvm.fshl.imm: 164*3eaed9e6Smelonedo; CHECK: # %bb.0: 165*3eaed9e6Smelonedo; CHECK-NEXT: li a1, 30 166*3eaed9e6Smelonedo; CHECK-NEXT: cv.ror a0, a0, a1 167*3eaed9e6Smelonedo; CHECK-NEXT: ret 168*3eaed9e6Smelonedo %1 = call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 2) 169*3eaed9e6Smelonedo ret i32 %1 170*3eaed9e6Smelonedo} 171*3eaed9e6Smelonedo 172*3eaed9e6Smelonedodefine i32 @test.llvm.fshl.reg(i32 %a, i32 %b) { 173*3eaed9e6Smelonedo; CHECK-O0-LABEL: test.llvm.fshl.reg: 174*3eaed9e6Smelonedo; CHECK-O0: # %bb.0: 175*3eaed9e6Smelonedo; CHECK-O0-NEXT: mv a2, a1 176*3eaed9e6Smelonedo; CHECK-O0-NEXT: li a1, 0 177*3eaed9e6Smelonedo; CHECK-O0-NEXT: sub a1, a1, a2 178*3eaed9e6Smelonedo; CHECK-O0-NEXT: cv.ror a0, a0, a1 179*3eaed9e6Smelonedo; CHECK-O0-NEXT: ret 180*3eaed9e6Smelonedo; 181*3eaed9e6Smelonedo; CHECK-O3-LABEL: test.llvm.fshl.reg: 182*3eaed9e6Smelonedo; CHECK-O3: # %bb.0: 183*3eaed9e6Smelonedo; CHECK-O3-NEXT: neg a1, a1 184*3eaed9e6Smelonedo; CHECK-O3-NEXT: cv.ror a0, a0, a1 185*3eaed9e6Smelonedo; CHECK-O3-NEXT: ret 186*3eaed9e6Smelonedo %1 = call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 %b) 187*3eaed9e6Smelonedo ret i32 %1 188*3eaed9e6Smelonedo} 189*3eaed9e6Smelonedo 190*3eaed9e6Smelonedodeclare i32 @llvm.fshr.i32(i32, i32, i32) 191*3eaed9e6Smelonedo 192*3eaed9e6Smelonedodefine i32 @test.llvm.fshr.imm(i32 %a) { 193*3eaed9e6Smelonedo; CHECK-LABEL: test.llvm.fshr.imm: 194*3eaed9e6Smelonedo; CHECK: # %bb.0: 195*3eaed9e6Smelonedo; CHECK-NEXT: li a1, 2 196*3eaed9e6Smelonedo; CHECK-NEXT: cv.ror a0, a0, a1 197*3eaed9e6Smelonedo; CHECK-NEXT: ret 198*3eaed9e6Smelonedo %1 = call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 2) 199*3eaed9e6Smelonedo ret i32 %1 200*3eaed9e6Smelonedo} 201*3eaed9e6Smelonedo 202*3eaed9e6Smelonedodefine i32 @test.llvm.fshr.reg(i32 %a, i32 %b) { 203*3eaed9e6Smelonedo; CHECK-LABEL: test.llvm.fshr.reg: 204*3eaed9e6Smelonedo; CHECK: # %bb.0: 205*3eaed9e6Smelonedo; CHECK-NEXT: cv.ror a0, a0, a1 206*3eaed9e6Smelonedo; CHECK-NEXT: ret 207*3eaed9e6Smelonedo %1 = call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 %b) 208*3eaed9e6Smelonedo ret i32 %1 209*3eaed9e6Smelonedo} 210*3eaed9e6Smelonedo 211*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.bitrev(i32, i32, i32) 212*3eaed9e6Smelonedo 213*3eaed9e6Smelonedodefine i32 @test.cv.bitrev(i32 %a) { 214*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bitrev: 215*3eaed9e6Smelonedo; CHECK: # %bb.0: 216*3eaed9e6Smelonedo; CHECK-NEXT: cv.bitrev a0, a0, 2, 1 217*3eaed9e6Smelonedo; CHECK-NEXT: ret 218*3eaed9e6Smelonedo %1 = call i32 @llvm.riscv.cv.bitmanip.bitrev(i32 %a, i32 1, i32 2) 219*3eaed9e6Smelonedo ret i32 %1 220*3eaed9e6Smelonedo} 221*3eaed9e6Smelonedo 222*3eaed9e6Smelonedodeclare i32 @llvm.bitreverse(i32) 223*3eaed9e6Smelonedo 224*3eaed9e6Smelonedodefine i32 @test.llvm.bitrev(i32 %a) { 225*3eaed9e6Smelonedo; CHECK-LABEL: test.llvm.bitrev: 226*3eaed9e6Smelonedo; CHECK: # %bb.0: 227*3eaed9e6Smelonedo; CHECK-NEXT: cv.bitrev a0, a0, 0, 0 228*3eaed9e6Smelonedo; CHECK-NEXT: ret 229*3eaed9e6Smelonedo %1 = call i32 @llvm.bitreverse(i32 %a) 230*3eaed9e6Smelonedo ret i32 %1 231*3eaed9e6Smelonedo} 232