253 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -O0 -mtriple=riscv32 -mattr=+xcvbitmanip -verify-machineinstrs < %s \3; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-O04; RUN: llc -O3 -mtriple=riscv32 -mattr=+xcvbitmanip -verify-machineinstrs < %s \5; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-O36 7define i32 @test.cv.extractr(i32 %a, i32 %b) {8; CHECK-LABEL: test.cv.extractr:9; CHECK: # %bb.0:10; CHECK-NEXT: cv.extractr a0, a0, a111; CHECK-NEXT: ret12 %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 %b)13 ret i32 %114}15 16define i32 @test.cv.extract(i32 %a) {17; CHECK-LABEL: test.cv.extract:18; CHECK: # %bb.0:19; CHECK-NEXT: cv.extract a0, a0, 2, 120; CHECK-NEXT: ret21 %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 65)22 ret i32 %123}24 25define i32 @test.cv.extract1023(i32 %a) {26; CHECK-LABEL: test.cv.extract1023:27; CHECK: # %bb.0:28; CHECK-NEXT: cv.extract a0, a0, 31, 3129; CHECK-NEXT: ret30 %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 1023)31 ret i32 %132}33 34define i32 @test.cv.extractur(i32 %a, i32 %b) {35; CHECK-LABEL: test.cv.extractur:36; CHECK: # %bb.0:37; CHECK-NEXT: cv.extractur a0, a0, a138; CHECK-NEXT: ret39 %1 = call i32 @llvm.riscv.cv.bitmanip.extractu(i32 %a, i32 %b)40 ret i32 %141}42 43define i32 @test.cv.extractu(i32 %a) {44; CHECK-LABEL: test.cv.extractu:45; CHECK: # %bb.0:46; CHECK-NEXT: cv.extractu a0, a0, 2, 147; CHECK-NEXT: ret48 %1 = call i32 @llvm.riscv.cv.bitmanip.extractu(i32 %a, i32 65)49 ret i32 %150}51 52define i32 @test.cv.insert(i32 %c, i32 %a) {53; CHECK-LABEL: test.cv.insert:54; CHECK: # %bb.0:55; CHECK-NEXT: cv.insert a0, a1, 2, 156; CHECK-NEXT: ret57 %1 = call i32 @llvm.riscv.cv.bitmanip.insert(i32 %a, i32 65, i32 %c)58 ret i32 %159}60 61define i32 @test.cv.insertr(i32 %c, i32 %b, i32 %a) {62; CHECK-LABEL: test.cv.insertr:63; CHECK: # %bb.0:64; CHECK-NEXT: cv.insertr a0, a2, a165; CHECK-NEXT: ret66 %1 = call i32 @llvm.riscv.cv.bitmanip.insert(i32 %a, i32 %b, i32 %c)67 ret i32 %168}69 70define i32 @test.cv.bclrr(i32 %a, i32 %b) {71; CHECK-LABEL: test.cv.bclrr:72; CHECK: # %bb.0:73; CHECK-NEXT: cv.bclrr a0, a0, a174; CHECK-NEXT: ret75 %1 = call i32 @llvm.riscv.cv.bitmanip.bclr(i32 %a, i32 %b)76 ret i32 %177}78 79define i32 @test.cv.bclr(i32 %a) {80; CHECK-LABEL: test.cv.bclr:81; CHECK: # %bb.0:82; CHECK-NEXT: cv.bclr a0, a0, 2, 183; CHECK-NEXT: ret84 %1 = call i32 @llvm.riscv.cv.bitmanip.bclr(i32 %a, i32 65)85 ret i32 %186}87 88define i32 @test.cv.bsetr(i32 %a, i32 %b) {89; CHECK-LABEL: test.cv.bsetr:90; CHECK: # %bb.0:91; CHECK-NEXT: cv.bsetr a0, a0, a192; CHECK-NEXT: ret93 %1 = call i32 @llvm.riscv.cv.bitmanip.bset(i32 %a, i32 %b)94 ret i32 %195}96 97define i32 @test.cv.bset(i32 %a) {98; CHECK-LABEL: test.cv.bset:99; CHECK: # %bb.0:100; CHECK-NEXT: cv.bset a0, a0, 2, 1101; CHECK-NEXT: ret102 %1 = call i32 @llvm.riscv.cv.bitmanip.bset(i32 %a, i32 65)103 ret i32 %1104}105 106define i32 @test.cv.ff1(i32 %a) {107; CHECK-LABEL: test.cv.ff1:108; CHECK: # %bb.0:109; CHECK-NEXT: cv.ff1 a0, a0110; CHECK-NEXT: ret111 %1 = call i32 @llvm.cttz.i32(i32 %a, i1 0)112 ret i32 %1113}114 115define i32 @test.cv.fl1(i32 %a) {116; CHECK-LABEL: test.cv.fl1:117; CHECK: # %bb.0:118; CHECK-NEXT: cv.fl1 a0, a0119; CHECK-NEXT: ret120 %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 0)121 ret i32 %1122}123 124define i32 @test.cv.clb(i32 %a) {125; CHECK-LABEL: test.cv.clb:126; CHECK: # %bb.0:127; CHECK-NEXT: cv.clb a0, a0128; CHECK-NEXT: ret129 %1 = call i32 @llvm.riscv.cv.bitmanip.clb(i32 %a)130 ret i32 %1131}132 133define i32 @test.cv.cnt(i32 %a) {134; CHECK-LABEL: test.cv.cnt:135; CHECK: # %bb.0:136; CHECK-NEXT: cv.cnt a0, a0137; CHECK-NEXT: ret138 %1 = call i32 @llvm.ctpop(i32 %a)139 ret i32 %1140}141 142define i32 @test.llvm.fshl.imm(i32 %a) {143; CHECK-LABEL: test.llvm.fshl.imm:144; CHECK: # %bb.0:145; CHECK-NEXT: li a1, 30146; CHECK-NEXT: cv.ror a0, a0, a1147; CHECK-NEXT: ret148 %1 = call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 2)149 ret i32 %1150}151 152define i32 @test.llvm.fshl.reg(i32 %a, i32 %b) {153; CHECK-O0-LABEL: test.llvm.fshl.reg:154; CHECK-O0: # %bb.0:155; CHECK-O0-NEXT: mv a2, a1156; CHECK-O0-NEXT: li a1, 0157; CHECK-O0-NEXT: sub a1, a1, a2158; CHECK-O0-NEXT: cv.ror a0, a0, a1159; CHECK-O0-NEXT: ret160;161; CHECK-O3-LABEL: test.llvm.fshl.reg:162; CHECK-O3: # %bb.0:163; CHECK-O3-NEXT: neg a1, a1164; CHECK-O3-NEXT: cv.ror a0, a0, a1165; CHECK-O3-NEXT: ret166 %1 = call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 %b)167 ret i32 %1168}169 170define i32 @test.llvm.fshr.imm(i32 %a) {171; CHECK-LABEL: test.llvm.fshr.imm:172; CHECK: # %bb.0:173; CHECK-NEXT: li a1, 2174; CHECK-NEXT: cv.ror a0, a0, a1175; CHECK-NEXT: ret176 %1 = call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 2)177 ret i32 %1178}179 180define i32 @test.llvm.fshr.reg(i32 %a, i32 %b) {181; CHECK-LABEL: test.llvm.fshr.reg:182; CHECK: # %bb.0:183; CHECK-NEXT: cv.ror a0, a0, a1184; CHECK-NEXT: ret185 %1 = call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 %b)186 ret i32 %1187}188 189define i32 @test.cv.bitrev(i32 %a) {190; CHECK-LABEL: test.cv.bitrev:191; CHECK: # %bb.0:192; CHECK-NEXT: cv.bitrev a0, a0, 2, 1193; CHECK-NEXT: ret194 %1 = call i32 @llvm.riscv.cv.bitmanip.bitrev(i32 %a, i32 1, i32 2)195 ret i32 %1196}197 198define i32 @test.llvm.bitrev(i32 %a) {199; CHECK-LABEL: test.llvm.bitrev:200; CHECK: # %bb.0:201; CHECK-NEXT: cv.bitrev a0, a0, 0, 0202; CHECK-NEXT: ret203 %1 = call i32 @llvm.bitreverse(i32 %a)204 ret i32 %1205}206 207define i1 @ctpop_i32_ult_two(i32 signext %a) nounwind {208; CHECK-LABEL: ctpop_i32_ult_two:209; CHECK: # %bb.0:210; CHECK-NEXT: cv.cnt a0, a0211; CHECK-NEXT: sltiu a0, a0, 2212; CHECK-NEXT: ret213 %1 = call i32 @llvm.ctpop.i32(i32 %a)214 %2 = icmp ult i32 %1, 2215 ret i1 %2216}217 218define i1 @ctpop_i32_ugt_one(i32 signext %a) nounwind {219; CHECK-LABEL: ctpop_i32_ugt_one:220; CHECK: # %bb.0:221; CHECK-NEXT: cv.cnt a0, a0222; CHECK-NEXT: sltiu a0, a0, 2223; CHECK-NEXT: xori a0, a0, 1224; CHECK-NEXT: ret225 %1 = call i32 @llvm.ctpop.i32(i32 %a)226 %2 = icmp ugt i32 %1, 1227 ret i1 %2228}229 230define i1 @ctpop_i32_eq_one(i32 signext %a) nounwind {231; CHECK-LABEL: ctpop_i32_eq_one:232; CHECK: # %bb.0:233; CHECK-NEXT: cv.cnt a0, a0234; CHECK-NEXT: addi a0, a0, -1235; CHECK-NEXT: seqz a0, a0236; CHECK-NEXT: ret237 %1 = call i32 @llvm.ctpop.i32(i32 %a)238 %2 = icmp eq i32 %1, 1239 ret i1 %2240}241 242define i1 @ctpop_i32_ne_one(i32 signext %a) nounwind {243; CHECK-LABEL: ctpop_i32_ne_one:244; CHECK: # %bb.0:245; CHECK-NEXT: cv.cnt a0, a0246; CHECK-NEXT: addi a0, a0, -1247; CHECK-NEXT: snez a0, a0248; CHECK-NEXT: ret249 %1 = call i32 @llvm.ctpop.i32(i32 %a)250 %2 = icmp ne i32 %1, 1251 ret i1 %2252}253