| Rafael Espindola | f7d4a99 | 2006-09-19 15:49:25 +0000 | [diff] [blame^] | 1 | //===-- ARMTargetMachine.cpp - Define TargetMachine for ARM ---------------===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file was developed by the "Instituto Nokia de Tecnologia" and | 
|  | 6 | // is distributed under the University of Illinois Open Source | 
|  | 7 | // License. See LICENSE.TXT for details. | 
|  | 8 | // | 
|  | 9 | //===----------------------------------------------------------------------===// | 
|  | 10 | // | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
|  | 14 |  | 
|  | 15 | #include "ARM.h" | 
|  | 16 | #include "llvm/CodeGen/MachineInstrBuilder.h" | 
|  | 17 | #include "llvm/CodeGen/MachineFunctionPass.h" | 
|  | 18 | #include "llvm/Support/Compiler.h" | 
|  | 19 |  | 
|  | 20 | using namespace llvm; | 
|  | 21 |  | 
|  | 22 | namespace { | 
|  | 23 | class VISIBILITY_HIDDEN FixMul : public MachineFunctionPass { | 
|  | 24 | virtual bool runOnMachineFunction(MachineFunction &MF); | 
|  | 25 | }; | 
|  | 26 | } | 
|  | 27 |  | 
|  | 28 | FunctionPass *llvm::createARMFixMulPass() { return new FixMul(); } | 
|  | 29 |  | 
|  | 30 | bool FixMul::runOnMachineFunction(MachineFunction &MF) { | 
|  | 31 | bool Changed = false; | 
|  | 32 |  | 
|  | 33 | for (MachineFunction::iterator BB = MF.begin(), E = MF.end(); | 
|  | 34 | BB != E; ++BB) { | 
|  | 35 | MachineBasicBlock &MBB = *BB; | 
|  | 36 |  | 
|  | 37 | for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); | 
|  | 38 | I != E; ++I) { | 
|  | 39 | MachineInstr *MI = I; | 
|  | 40 |  | 
|  | 41 | if (MI->getOpcode() == ARM::MUL) { | 
|  | 42 | MachineOperand &RdOp = MI->getOperand(0); | 
|  | 43 | MachineOperand &RmOp = MI->getOperand(1); | 
|  | 44 | MachineOperand &RsOp = MI->getOperand(2); | 
|  | 45 |  | 
|  | 46 | unsigned Rd = RdOp.getReg(); | 
|  | 47 | unsigned Rm = RmOp.getReg(); | 
|  | 48 | unsigned Rs = RsOp.getReg(); | 
|  | 49 |  | 
|  | 50 | if(Rd == Rm) { | 
|  | 51 | Changed = true; | 
|  | 52 | if (Rd != Rs) { | 
|  | 53 | RmOp.setReg(Rs); | 
|  | 54 | RsOp.setReg(Rm); | 
|  | 55 | } else { | 
|  | 56 | BuildMI(MBB, I, ARM::MOV, 3, ARM::R12).addReg(Rm).addImm(0) | 
|  | 57 | .addImm(ARMShift::LSL); | 
|  | 58 | RmOp.setReg(ARM::R12); | 
|  | 59 | } | 
|  | 60 | } | 
|  | 61 | } | 
|  | 62 | } | 
|  | 63 | } | 
|  | 64 |  | 
|  | 65 | return Changed; | 
|  | 66 | } |