@@ -2998,48 +2998,37 @@ MachineInstr *RISCVInstrInfo::convertToThreeAddress(MachineInstr &MI,
2998
2998
#undef CASE_WIDEOP_OPCODE_LMULS
2999
2999
#undef CASE_WIDEOP_OPCODE_COMMON
3000
3000
3001
- void RISCVInstrInfo::getVLENFactoredAmount (MachineFunction &MF,
3002
- MachineBasicBlock &MBB,
3003
- MachineBasicBlock::iterator II,
3004
- const DebugLoc &DL, Register DestReg,
3005
- int64_t Amount,
3006
- MachineInstr::MIFlag Flag) const {
3007
- assert (Amount > 0 && " There is no need to get VLEN scaled value." );
3008
- assert (Amount % 8 == 0 &&
3009
- " Reserve the stack by the multiple of one vector size." );
3010
-
3001
+ void RISCVInstrInfo::mulImm (MachineFunction &MF, MachineBasicBlock &MBB,
3002
+ MachineBasicBlock::iterator II, const DebugLoc &DL,
3003
+ Register DestReg, uint32_t Amount,
3004
+ MachineInstr::MIFlag Flag) const {
3011
3005
MachineRegisterInfo &MRI = MF.getRegInfo ();
3012
- assert (isInt<32 >(Amount / 8 ) &&
3013
- " Expect the number of vector registers within 32-bits." );
3014
- uint32_t NumOfVReg = Amount / 8 ;
3015
-
3016
- BuildMI (MBB, II, DL, get (RISCV::PseudoReadVLENB), DestReg).setMIFlag (Flag);
3017
- if (llvm::has_single_bit<uint32_t >(NumOfVReg)) {
3018
- uint32_t ShiftAmount = Log2_32 (NumOfVReg);
3006
+ if (llvm::has_single_bit<uint32_t >(Amount)) {
3007
+ uint32_t ShiftAmount = Log2_32 (Amount);
3019
3008
if (ShiftAmount == 0 )
3020
3009
return ;
3021
3010
BuildMI (MBB, II, DL, get (RISCV::SLLI), DestReg)
3022
3011
.addReg (DestReg, RegState::Kill)
3023
3012
.addImm (ShiftAmount)
3024
3013
.setMIFlag (Flag);
3025
3014
} else if (STI.hasStdExtZba () &&
3026
- ((NumOfVReg % 3 == 0 && isPowerOf2_64 (NumOfVReg / 3 )) ||
3027
- (NumOfVReg % 5 == 0 && isPowerOf2_64 (NumOfVReg / 5 )) ||
3028
- (NumOfVReg % 9 == 0 && isPowerOf2_64 (NumOfVReg / 9 )))) {
3015
+ ((Amount % 3 == 0 && isPowerOf2_64 (Amount / 3 )) ||
3016
+ (Amount % 5 == 0 && isPowerOf2_64 (Amount / 5 )) ||
3017
+ (Amount % 9 == 0 && isPowerOf2_64 (Amount / 9 )))) {
3029
3018
// We can use Zba SHXADD+SLLI instructions for multiply in some cases.
3030
3019
unsigned Opc;
3031
3020
uint32_t ShiftAmount;
3032
- if (NumOfVReg % 9 == 0 ) {
3021
+ if (Amount % 9 == 0 ) {
3033
3022
Opc = RISCV::SH3ADD;
3034
- ShiftAmount = Log2_64 (NumOfVReg / 9 );
3035
- } else if (NumOfVReg % 5 == 0 ) {
3023
+ ShiftAmount = Log2_64 (Amount / 9 );
3024
+ } else if (Amount % 5 == 0 ) {
3036
3025
Opc = RISCV::SH2ADD;
3037
- ShiftAmount = Log2_64 (NumOfVReg / 5 );
3038
- } else if (NumOfVReg % 3 == 0 ) {
3026
+ ShiftAmount = Log2_64 (Amount / 5 );
3027
+ } else if (Amount % 3 == 0 ) {
3039
3028
Opc = RISCV::SH1ADD;
3040
- ShiftAmount = Log2_64 (NumOfVReg / 3 );
3029
+ ShiftAmount = Log2_64 (Amount / 3 );
3041
3030
} else {
3042
- llvm_unreachable (" Unexpected number of vregs " );
3031
+ llvm_unreachable (" implied by if-clause " );
3043
3032
}
3044
3033
if (ShiftAmount)
3045
3034
BuildMI (MBB, II, DL, get (RISCV::SLLI), DestReg)
@@ -3050,9 +3039,9 @@ void RISCVInstrInfo::getVLENFactoredAmount(MachineFunction &MF,
3050
3039
.addReg (DestReg, RegState::Kill)
3051
3040
.addReg (DestReg)
3052
3041
.setMIFlag (Flag);
3053
- } else if (llvm::has_single_bit<uint32_t >(NumOfVReg - 1 )) {
3042
+ } else if (llvm::has_single_bit<uint32_t >(Amount - 1 )) {
3054
3043
Register ScaledRegister = MRI.createVirtualRegister (&RISCV::GPRRegClass);
3055
- uint32_t ShiftAmount = Log2_32 (NumOfVReg - 1 );
3044
+ uint32_t ShiftAmount = Log2_32 (Amount - 1 );
3056
3045
BuildMI (MBB, II, DL, get (RISCV::SLLI), ScaledRegister)
3057
3046
.addReg (DestReg)
3058
3047
.addImm (ShiftAmount)
@@ -3061,9 +3050,9 @@ void RISCVInstrInfo::getVLENFactoredAmount(MachineFunction &MF,
3061
3050
.addReg (ScaledRegister, RegState::Kill)
3062
3051
.addReg (DestReg, RegState::Kill)
3063
3052
.setMIFlag (Flag);
3064
- } else if (llvm::has_single_bit<uint32_t >(NumOfVReg + 1 )) {
3053
+ } else if (llvm::has_single_bit<uint32_t >(Amount + 1 )) {
3065
3054
Register ScaledRegister = MRI.createVirtualRegister (&RISCV::GPRRegClass);
3066
- uint32_t ShiftAmount = Log2_32 (NumOfVReg + 1 );
3055
+ uint32_t ShiftAmount = Log2_32 (Amount + 1 );
3067
3056
BuildMI (MBB, II, DL, get (RISCV::SLLI), ScaledRegister)
3068
3057
.addReg (DestReg)
3069
3058
.addImm (ShiftAmount)
@@ -3074,22 +3063,22 @@ void RISCVInstrInfo::getVLENFactoredAmount(MachineFunction &MF,
3074
3063
.setMIFlag (Flag);
3075
3064
} else if (STI.hasStdExtM () || STI.hasStdExtZmmul ()) {
3076
3065
Register N = MRI.createVirtualRegister (&RISCV::GPRRegClass);
3077
- movImm (MBB, II, DL, N, NumOfVReg , Flag);
3066
+ movImm (MBB, II, DL, N, Amount , Flag);
3078
3067
BuildMI (MBB, II, DL, get (RISCV::MUL), DestReg)
3079
3068
.addReg (DestReg, RegState::Kill)
3080
3069
.addReg (N, RegState::Kill)
3081
3070
.setMIFlag (Flag);
3082
3071
} else {
3083
3072
Register Acc;
3084
3073
uint32_t PrevShiftAmount = 0 ;
3085
- for (uint32_t ShiftAmount = 0 ; NumOfVReg >> ShiftAmount; ShiftAmount++) {
3086
- if (NumOfVReg & (1U << ShiftAmount)) {
3074
+ for (uint32_t ShiftAmount = 0 ; Amount >> ShiftAmount; ShiftAmount++) {
3075
+ if (Amount & (1U << ShiftAmount)) {
3087
3076
if (ShiftAmount)
3088
3077
BuildMI (MBB, II, DL, get (RISCV::SLLI), DestReg)
3089
3078
.addReg (DestReg, RegState::Kill)
3090
3079
.addImm (ShiftAmount - PrevShiftAmount)
3091
3080
.setMIFlag (Flag);
3092
- if (NumOfVReg >> (ShiftAmount + 1 )) {
3081
+ if (Amount >> (ShiftAmount + 1 )) {
3093
3082
// If we don't have an accmulator yet, create it and copy DestReg.
3094
3083
if (!Acc) {
3095
3084
Acc = MRI.createVirtualRegister (&RISCV::GPRRegClass);
0 commit comments