diff options
author | Chris Lattner <sabre@nondot.org> | 2003-10-20 03:42:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-10-20 03:42:58 +0000 |
commit | c01d1232fe5a25d807c7ab975437ef6c514d2cd6 (patch) | |
tree | b55790814d8235baddf5d61280ae855cf97d9325 /lib/Target/X86/InstSelectSimple.cpp | |
parent | 9fc2adc48781da63b2554d40960d0e63de238add (diff) |
* Rename X86::IMULr16 -> X86::IMULrr16
* Implement R1 = R2 * C where R1 and R2 are 32 or 16 bits. This avoids an
extra copy into a register, reducing register pressure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9278 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/InstSelectSimple.cpp')
-rw-r--r-- | lib/Target/X86/InstSelectSimple.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index 7394d8f2e1..1df8cb8ca1 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -1207,7 +1207,7 @@ void ISel::doMultiply(MachineBasicBlock *MBB, MachineBasicBlock::iterator &MBBI, return; case cInt: case cShort: - BMI(BB, MBBI, Class == cInt ? X86::IMULr32 : X86::IMULr16, 2, DestReg) + BMI(BB, MBBI, Class == cInt ? X86::IMULrr32 : X86::IMULrr16, 2, DestReg) .addReg(op0Reg).addReg(op1Reg); return; case cByte: @@ -1255,6 +1255,14 @@ void ISel::doMultiplyConst(MachineBasicBlock *MBB, return; } } + + if (Class == cShort) { + BMI(MBB, IP, X86::IMULri16, 2, DestReg).addReg(op0Reg).addZImm(ConstRHS); + return; + } else if (Class == cInt) { + BMI(MBB, IP, X86::IMULri32, 2, DestReg).addReg(op0Reg).addZImm(ConstRHS); + return; + } // Most general case, emit a normal multiply... static const unsigned MOVirTab[] = { @@ -1301,7 +1309,7 @@ void ISel::visitMul(BinaryOperator &I) { MachineBasicBlock::iterator MBBI = BB->end(); unsigned AHBLReg = makeAnotherReg(Type::UIntTy); // AH*BL - BMI(BB, MBBI, X86::IMULr32, 2, AHBLReg).addReg(Op0Reg+1).addReg(Op1Reg); + BMI(BB, MBBI, X86::IMULrr32, 2, AHBLReg).addReg(Op0Reg+1).addReg(Op1Reg); unsigned AHBLplusOverflowReg = makeAnotherReg(Type::UIntTy); BuildMI(BB, X86::ADDrr32, 2, // AH*BL+(AL*BL >> 32) @@ -1309,7 +1317,7 @@ void ISel::visitMul(BinaryOperator &I) { MBBI = BB->end(); unsigned ALBHReg = makeAnotherReg(Type::UIntTy); // AL*BH - BMI(BB, MBBI, X86::IMULr32, 2, ALBHReg).addReg(Op0Reg).addReg(Op1Reg+1); + BMI(BB, MBBI, X86::IMULrr32, 2, ALBHReg).addReg(Op0Reg).addReg(Op1Reg+1); BuildMI(BB, X86::ADDrr32, 2, // AL*BH + AH*BL + (AL*BL >> 32) DestReg+1).addReg(AHBLplusOverflowReg).addReg(ALBHReg); |