diff --git a/llvm/test/CodeGen/RISCV/rv32Zbp.ll b/llvm/test/CodeGen/RISCV/rv32Zbp.ll index 8769ce77337c1..ff2e903bb541b 100644 --- a/llvm/test/CodeGen/RISCV/rv32Zbp.ll +++ b/llvm/test/CodeGen/RISCV/rv32Zbp.ll @@ -659,6 +659,53 @@ define i32 @grev16_i32(i32 %a) nounwind { ret i32 %or } +declare i32 @llvm.fshl.i32(i32, i32, i32) +declare i32 @llvm.fshr.i32(i32, i32, i32) + +define signext i32 @grev16_i32_fshl(i32 signext %a) nounwind { +; RV32I-LABEL: grev16_i32_fshl: +; RV32I: # %bb.0: +; RV32I-NEXT: srli a1, a0, 16 +; RV32I-NEXT: slli a0, a0, 16 +; RV32I-NEXT: or a0, a0, a1 +; RV32I-NEXT: ret +; +; RV32IB-LABEL: grev16_i32_fshl: +; RV32IB: # %bb.0: +; RV32IB-NEXT: rori a0, a0, 16 +; RV32IB-NEXT: ret +; +; RV32IBP-LABEL: grev16_i32_fshl: +; RV32IBP: # %bb.0: +; RV32IBP-NEXT: rori a0, a0, 16 +; RV32IBP-NEXT: ret + %or = tail call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 16) + ret i32 %or +} + +define signext i32 @grev16_i32_fshr(i32 signext %a) nounwind { +; RV32I-LABEL: grev16_i32_fshr: +; RV32I: # %bb.0: +; RV32I-NEXT: slli a1, a0, 16 +; RV32I-NEXT: srli a0, a0, 16 +; RV32I-NEXT: or a0, a0, a1 +; RV32I-NEXT: ret +; +; RV32IB-LABEL: grev16_i32_fshr: +; RV32IB: # %bb.0: +; RV32IB-NEXT: addi a1, zero, 16 +; RV32IB-NEXT: ror a0, a0, a1 +; RV32IB-NEXT: ret +; +; RV32IBP-LABEL: grev16_i32_fshr: +; RV32IBP: # %bb.0: +; RV32IBP-NEXT: addi a1, zero, 16 +; RV32IBP-NEXT: ror a0, a0, a1 +; RV32IBP-NEXT: ret + %or = tail call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 16) + ret i32 %or +} + define i64 @grev16_i64(i64 %a) nounwind { ; RV32I-LABEL: grev16_i64: ; RV32I: # %bb.0: diff --git a/llvm/test/CodeGen/RISCV/rv64Zbp.ll b/llvm/test/CodeGen/RISCV/rv64Zbp.ll index ae467efaab832..17c399ddcecde 100644 --- a/llvm/test/CodeGen/RISCV/rv64Zbp.ll +++ b/llvm/test/CodeGen/RISCV/rv64Zbp.ll @@ -745,6 +745,53 @@ define signext i32 @grev16_i32(i32 signext %a) nounwind { ret i32 %or } +declare i32 @llvm.fshl.i32(i32, i32, i32) +declare i32 @llvm.fshr.i32(i32, i32, i32) + +define signext i32 @grev16_i32_fshl(i32 signext %a) nounwind { +; RV64I-LABEL: grev16_i32_fshl: +; RV64I: # %bb.0: +; RV64I-NEXT: srliw a1, a0, 16 +; RV64I-NEXT: slli a0, a0, 16 +; RV64I-NEXT: or a0, a0, a1 +; RV64I-NEXT: sext.w a0, a0 +; RV64I-NEXT: ret +; +; RV64IB-LABEL: grev16_i32_fshl: +; RV64IB: # %bb.0: +; RV64IB-NEXT: greviw a0, a0, 16 +; RV64IB-NEXT: ret +; +; RV64IBP-LABEL: grev16_i32_fshl: +; RV64IBP: # %bb.0: +; RV64IBP-NEXT: greviw a0, a0, 16 +; RV64IBP-NEXT: ret + %or = tail call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 16) + ret i32 %or +} + +define signext i32 @grev16_i32_fshr(i32 signext %a) nounwind { +; RV64I-LABEL: grev16_i32_fshr: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a0, 16 +; RV64I-NEXT: srliw a0, a0, 16 +; RV64I-NEXT: or a0, a0, a1 +; RV64I-NEXT: sext.w a0, a0 +; RV64I-NEXT: ret +; +; RV64IB-LABEL: grev16_i32_fshr: +; RV64IB: # %bb.0: +; RV64IB-NEXT: greviw a0, a0, 16 +; RV64IB-NEXT: ret +; +; RV64IBP-LABEL: grev16_i32_fshr: +; RV64IBP: # %bb.0: +; RV64IBP-NEXT: greviw a0, a0, 16 +; RV64IBP-NEXT: ret + %or = tail call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 16) + ret i32 %or +} + define i64 @grev16_i64(i64 %a) nounwind { ; RV64I-LABEL: grev16_i64: ; RV64I: # %bb.0: @@ -806,6 +853,53 @@ define i64 @grev32(i64 %a) nounwind { ret i64 %or } +declare i64 @llvm.fshl.i64(i64, i64, i64) +declare i64 @llvm.fshr.i64(i64, i64, i64) + +define i64 @grev32_fshl(i64 %a) nounwind { +; RV64I-LABEL: grev32_fshl: +; RV64I: # %bb.0: +; RV64I-NEXT: srli a1, a0, 32 +; RV64I-NEXT: slli a0, a0, 32 +; RV64I-NEXT: or a0, a0, a1 +; RV64I-NEXT: ret +; +; RV64IB-LABEL: grev32_fshl: +; RV64IB: # %bb.0: +; RV64IB-NEXT: rori a0, a0, 32 +; RV64IB-NEXT: ret +; +; RV64IBP-LABEL: grev32_fshl: +; RV64IBP: # %bb.0: +; RV64IBP-NEXT: rori a0, a0, 32 +; RV64IBP-NEXT: ret + %or = tail call i64 @llvm.fshl.i64(i64 %a, i64 %a, i64 32) + ret i64 %or +} + +define i64 @grev32_fshr(i64 %a) nounwind { +; RV64I-LABEL: grev32_fshr: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a0, 32 +; RV64I-NEXT: srli a0, a0, 32 +; RV64I-NEXT: or a0, a0, a1 +; RV64I-NEXT: ret +; +; RV64IB-LABEL: grev32_fshr: +; RV64IB: # %bb.0: +; RV64IB-NEXT: addi a1, zero, 32 +; RV64IB-NEXT: ror a0, a0, a1 +; RV64IB-NEXT: ret +; +; RV64IBP-LABEL: grev32_fshr: +; RV64IBP: # %bb.0: +; RV64IBP-NEXT: addi a1, zero, 32 +; RV64IBP-NEXT: ror a0, a0, a1 +; RV64IBP-NEXT: ret + %or = tail call i64 @llvm.fshr.i64(i64 %a, i64 %a, i64 32) + ret i64 %or +} + declare i32 @llvm.bswap.i32(i32) define signext i32 @bswap_i32(i32 signext %a) nounwind {