aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/ARM/ARMMul.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2006-10-16 16:33:29 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2006-10-16 16:33:29 +0000
commitbec2e38a9156aa35a200914a700de1e8d0810d80 (patch)
treea79aa753d1de31bddd2481898fa5bae508c1ed38 /lib/Target/ARM/ARMMul.cpp
parentd9b8e40ab3b51fa49f0c35cccb2bd795a786162b (diff)
implement smull and umull
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30975 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMMul.cpp')
-rw-r--r--lib/Target/ARM/ARMMul.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/Target/ARM/ARMMul.cpp b/lib/Target/ARM/ARMMul.cpp
index 185fb96783..474039db27 100644
--- a/lib/Target/ARM/ARMMul.cpp
+++ b/lib/Target/ARM/ARMMul.cpp
@@ -8,7 +8,7 @@
//
//===----------------------------------------------------------------------===//
//
-// Modify the ARM multiplication instructions so that Rd and Rm are distinct
+// Modify the ARM multiplication instructions so that Rd{Hi,Lo} and Rm are distinct
//
//===----------------------------------------------------------------------===//
@@ -39,7 +39,10 @@ bool FixMul::runOnMachineFunction(MachineFunction &MF) {
I != E; ++I) {
MachineInstr *MI = I;
- if (MI->getOpcode() == ARM::MUL) {
+ int Op = MI->getOpcode();
+ if (Op == ARM::MUL ||
+ Op == ARM::SMULL ||
+ Op == ARM::UMULL) {
MachineOperand &RdOp = MI->getOperand(0);
MachineOperand &RmOp = MI->getOperand(1);
MachineOperand &RsOp = MI->getOperand(2);
@@ -48,7 +51,7 @@ bool FixMul::runOnMachineFunction(MachineFunction &MF) {
unsigned Rm = RmOp.getReg();
unsigned Rs = RsOp.getReg();
- if(Rd == Rm) {
+ if (Rd == Rm) {
Changed = true;
if (Rd != Rs) {
//Rd and Rm must be distinct, but Rd can be equal to Rs.
@@ -56,9 +59,10 @@ bool FixMul::runOnMachineFunction(MachineFunction &MF) {
RmOp.setReg(Rs);
RsOp.setReg(Rm);
} else {
- BuildMI(MBB, I, ARM::MOV, 3, ARM::R12).addReg(Rm).addImm(0)
+ unsigned scratch = Op == ARM::MUL ? ARM::R12 : ARM::R0;
+ BuildMI(MBB, I, ARM::MOV, 3, scratch).addReg(Rm).addImm(0)
.addImm(ARMShift::LSL);
- RmOp.setReg(ARM::R12);
+ RmOp.setReg(scratch);
}
}
}