diff options
author | Tanya Lattner <tonic@nondot.org> | 2005-05-11 21:45:03 +0000 |
---|---|---|
committer | Tanya Lattner <tonic@nondot.org> | 2005-05-11 21:45:03 +0000 |
commit | d9770958389e113a3713fde53d03a95b1d621565 (patch) | |
tree | 24b6280f2e13337ae82e9228295fe199d5d23c87 /lib | |
parent | 4548a0ed32949ab38310e103af5d85650ecd2a5d (diff) |
Fixed issue that broke ssa.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21878 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/SparcV9/SparcV9BurgISel.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/lib/Target/SparcV9/SparcV9BurgISel.cpp b/lib/Target/SparcV9/SparcV9BurgISel.cpp index a459a8689c..ef3f9e09e4 100644 --- a/lib/Target/SparcV9/SparcV9BurgISel.cpp +++ b/lib/Target/SparcV9/SparcV9BurgISel.cpp @@ -2226,6 +2226,12 @@ CreateIntNegInstruction(const TargetMachine& target, Value* vreg) { .addReg(vreg).addRegDef(vreg); } +static inline MachineInstr* +CreateIntNegInstruction(const TargetMachine& target, Value* vreg, Value *destreg) { + return BuildMI(V9::SUBr, 3).addMReg(target.getRegInfo()->getZeroRegNum()) + .addReg(vreg).addRegDef(destreg); +} + /// CreateShiftInstructions - Create instruction sequence for any shift /// operation. SLL or SLLX on an operand smaller than the integer reg. size /// (64bits) requires a second instruction for explicit sign-extension. Note @@ -2306,6 +2312,7 @@ CreateMulConstInstruction(const TargetMachine &target, Function* F, needNeg = true; C = -C; } + TmpInstruction *tmpNeg = 0; if (C == 0 || C == 1) { cost = target.getInstrInfo()->minLatency(V9::ADDr); @@ -2317,15 +2324,31 @@ CreateMulConstInstruction(const TargetMachine &target, Function* F, M = BuildMI(V9::ADDr,3).addReg(lval).addMReg(Zero).addRegDef(destVal); mvec.push_back(M); } else if (isPowerOf2(C, pow)) { + if(!needNeg) { unsigned opSize = target.getTargetData().getTypeSize(resultType); MachineOpCode opCode = (opSize <= 32)? V9::SLLr5 : V9::SLLXr6; CreateShiftInstructions(target, F, opCode, lval, NULL, pow, destVal, mvec, mcfi); + } + else { + //Create tmp instruction to hold intermeidate value, since we need + //to negate the result + tmpNeg = new TmpInstruction(mcfi, lval); + unsigned opSize = target.getTargetData().getTypeSize(resultType); + MachineOpCode opCode = (opSize <= 32)? V9::SLLr5 : V9::SLLXr6; + CreateShiftInstructions(target, F, opCode, lval, NULL, pow, + tmpNeg, mvec, mcfi); + } + } if (mvec.size() > 0 && needNeg) { + MachineInstr* M = 0; + if(tmpNeg) // insert <reg = SUB 0, reg> after the instr to flip the sign - MachineInstr* M = CreateIntNegInstruction(target, destVal); + M = CreateIntNegInstruction(target, tmpNeg, destVal); + else + M = CreateIntNegInstruction(target, destVal); mvec.push_back(M); } } |