From 862bb562cc0e3378c410a295ce8f7dadef0027d5 Mon Sep 17 00:00:00 2001 From: Misha Brukman Date: Wed, 28 Jul 2004 19:13:49 +0000 Subject: [PATCH] Simplify loading (un)signed constants to registers, patch by Nate Begeman. llvm-svn: 15306 --- llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp | 104 +++++++++--------- llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp | 104 +++++++++--------- 2 files changed, 106 insertions(+), 102 deletions(-) diff --git a/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp b/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp index 790aab42c55f..8da6b9d705e0 100644 --- a/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp +++ b/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp @@ -542,61 +542,63 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, unsigned Class = getClassB(C->getType()); if (Class == cLong) { - // Copy the value into the register pair. - uint64_t Val = cast(C)->getRawValue(); - - if (Val < (1ULL << 16)) { - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(0); - BuildMI(*MBB, IP, PPC32::LI, 1, R+1).addSImm(Val & 0xFFFF); - } else if (Val < (1ULL << 32)) { - unsigned Temp = makeAnotherReg(Type::IntTy); - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(0); - BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm((Val >> 16) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(Temp).addImm(Val & 0xFFFF); - } else if (Val < (1ULL << 48)) { - unsigned Temp = makeAnotherReg(Type::IntTy); - int HiBits = (Val >> 32) & 0xFFFF; - if (HiBits > 32767) { - BuildMI(*MBB, IP, PPC32::LI, 1, PPC32::R0).addImm(0); - BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(PPC32::R0).addSImm(HiBits); - } else { - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(HiBits); - } - BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm((Val >> 16) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(Temp).addImm(Val & 0xFFFF); + if (ConstantUInt *CUI = dyn_cast(C)) { + uint64_t uval = CUI->getValue(); + unsigned hiUVal = uval >> 32; + unsigned loUVal = uval; + ConstantUInt *CUHi = ConstantUInt::get(Type::UIntTy, hiUVal); + ConstantUInt *CULo = ConstantUInt::get(Type::UIntTy, loUVal); + copyConstantToRegister(MBB, IP, CUHi, R); + copyConstantToRegister(MBB, IP, CULo, R+1); + return; + } else if (ConstantSInt *CSI = dyn_cast(C)) { + int64_t sval = CSI->getValue(); + int hiSVal = sval >> 32; + int loSVal = sval; + ConstantSInt *CSHi = ConstantSInt::get(Type::IntTy, hiSVal); + ConstantSInt *CSLo = ConstantSInt::get(Type::IntTy, loSVal); + copyConstantToRegister(MBB, IP, CSHi, R); + copyConstantToRegister(MBB, IP, CSLo, R+1); + return; } else { - unsigned TempLo = makeAnotherReg(Type::IntTy); - unsigned TempHi = makeAnotherReg(Type::IntTy); - BuildMI(*MBB, IP, PPC32::LIS, 1, TempHi).addSImm((Val >> 48) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(TempHi) - .addImm((Val >> 32) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::LIS, 1, TempLo).addSImm((Val >> 16) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(TempLo) - .addImm(Val & 0xFFFF); + std::cerr << "Unhandled long constant type!\n"; + abort(); + } + } + + assert(Class <= cInt && "Type not handled yet!"); + + // Handle bool + if (C->getType() == Type::BoolTy) { + BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(C == ConstantBool::True); + return; + } + + // Handle int + if (ConstantUInt *CUI = dyn_cast(C)) { + unsigned uval = CUI->getValue(); + if (uval < 32768) { + BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(uval); + } else { + unsigned Temp = makeAnotherReg(Type::IntTy); + BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm(uval >> 16); + BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(Temp).addImm(uval); + } + return; + } else if (ConstantSInt *CSI = dyn_cast(C)) { + int sval = CSI->getValue(); + if (sval < 32768 && sval >= -32768) { + BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(sval); + } else { + unsigned Temp = makeAnotherReg(Type::IntTy); + BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm(sval >> 16); + BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(Temp).addImm(sval); } return; } - - assert(Class <= cInt && "Type not handled yet!"); - - if (C->getType() == Type::BoolTy) { - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(C == ConstantBool::True); - } else if (Class == cByte || Class == cShort) { - ConstantInt *CI = cast(C); - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(CI->getRawValue()); - } else { - ConstantInt *CI = cast(C); - int TheVal = CI->getRawValue() & 0xFFFFFFFF; - if (TheVal < 32768 && TheVal >= -32768) { - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(CI->getRawValue()); - } else { - unsigned TmpReg = makeAnotherReg(Type::IntTy); - BuildMI(*MBB, IP, PPC32::LIS, 1, TmpReg) - .addSImm(CI->getRawValue() >> 16); - BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(TmpReg) - .addImm(CI->getRawValue() & 0xFFFF); - } - } + + std::cerr << "Unhandled integer constant!\n"; + abort(); } else if (ConstantFP *CFP = dyn_cast(C)) { // We need to spill the constant to memory... MachineConstantPool *CP = F->getConstantPool(); diff --git a/llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp b/llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp index 790aab42c55f..8da6b9d705e0 100644 --- a/llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp +++ b/llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp @@ -542,61 +542,63 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, unsigned Class = getClassB(C->getType()); if (Class == cLong) { - // Copy the value into the register pair. - uint64_t Val = cast(C)->getRawValue(); - - if (Val < (1ULL << 16)) { - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(0); - BuildMI(*MBB, IP, PPC32::LI, 1, R+1).addSImm(Val & 0xFFFF); - } else if (Val < (1ULL << 32)) { - unsigned Temp = makeAnotherReg(Type::IntTy); - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(0); - BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm((Val >> 16) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(Temp).addImm(Val & 0xFFFF); - } else if (Val < (1ULL << 48)) { - unsigned Temp = makeAnotherReg(Type::IntTy); - int HiBits = (Val >> 32) & 0xFFFF; - if (HiBits > 32767) { - BuildMI(*MBB, IP, PPC32::LI, 1, PPC32::R0).addImm(0); - BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(PPC32::R0).addSImm(HiBits); - } else { - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(HiBits); - } - BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm((Val >> 16) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(Temp).addImm(Val & 0xFFFF); + if (ConstantUInt *CUI = dyn_cast(C)) { + uint64_t uval = CUI->getValue(); + unsigned hiUVal = uval >> 32; + unsigned loUVal = uval; + ConstantUInt *CUHi = ConstantUInt::get(Type::UIntTy, hiUVal); + ConstantUInt *CULo = ConstantUInt::get(Type::UIntTy, loUVal); + copyConstantToRegister(MBB, IP, CUHi, R); + copyConstantToRegister(MBB, IP, CULo, R+1); + return; + } else if (ConstantSInt *CSI = dyn_cast(C)) { + int64_t sval = CSI->getValue(); + int hiSVal = sval >> 32; + int loSVal = sval; + ConstantSInt *CSHi = ConstantSInt::get(Type::IntTy, hiSVal); + ConstantSInt *CSLo = ConstantSInt::get(Type::IntTy, loSVal); + copyConstantToRegister(MBB, IP, CSHi, R); + copyConstantToRegister(MBB, IP, CSLo, R+1); + return; } else { - unsigned TempLo = makeAnotherReg(Type::IntTy); - unsigned TempHi = makeAnotherReg(Type::IntTy); - BuildMI(*MBB, IP, PPC32::LIS, 1, TempHi).addSImm((Val >> 48) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(TempHi) - .addImm((Val >> 32) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::LIS, 1, TempLo).addSImm((Val >> 16) & 0xFFFF); - BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(TempLo) - .addImm(Val & 0xFFFF); + std::cerr << "Unhandled long constant type!\n"; + abort(); + } + } + + assert(Class <= cInt && "Type not handled yet!"); + + // Handle bool + if (C->getType() == Type::BoolTy) { + BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(C == ConstantBool::True); + return; + } + + // Handle int + if (ConstantUInt *CUI = dyn_cast(C)) { + unsigned uval = CUI->getValue(); + if (uval < 32768) { + BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(uval); + } else { + unsigned Temp = makeAnotherReg(Type::IntTy); + BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm(uval >> 16); + BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(Temp).addImm(uval); + } + return; + } else if (ConstantSInt *CSI = dyn_cast(C)) { + int sval = CSI->getValue(); + if (sval < 32768 && sval >= -32768) { + BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(sval); + } else { + unsigned Temp = makeAnotherReg(Type::IntTy); + BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm(sval >> 16); + BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(Temp).addImm(sval); } return; } - - assert(Class <= cInt && "Type not handled yet!"); - - if (C->getType() == Type::BoolTy) { - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(C == ConstantBool::True); - } else if (Class == cByte || Class == cShort) { - ConstantInt *CI = cast(C); - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(CI->getRawValue()); - } else { - ConstantInt *CI = cast(C); - int TheVal = CI->getRawValue() & 0xFFFFFFFF; - if (TheVal < 32768 && TheVal >= -32768) { - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(CI->getRawValue()); - } else { - unsigned TmpReg = makeAnotherReg(Type::IntTy); - BuildMI(*MBB, IP, PPC32::LIS, 1, TmpReg) - .addSImm(CI->getRawValue() >> 16); - BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(TmpReg) - .addImm(CI->getRawValue() & 0xFFFF); - } - } + + std::cerr << "Unhandled integer constant!\n"; + abort(); } else if (ConstantFP *CFP = dyn_cast(C)) { // We need to spill the constant to memory... MachineConstantPool *CP = F->getConstantPool();