diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-03-31 00:13:12 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-03-31 00:13:12 +0000 |
commit | bd4e68c28001ed932b866d5ed76d2fe3ddc0dab4 (patch) | |
tree | ca9a9ede8590740e222691a4d080954ace8b8943 /llvm/lib | |
parent | 847b6e2ee779232484a667109013cb784a702b99 (diff) | |
download | bcm5719-llvm-bd4e68c28001ed932b866d5ed76d2fe3ddc0dab4.tar.gz bcm5719-llvm-bd4e68c28001ed932b866d5ed76d2fe3ddc0dab4.zip |
Fix CreateUIntSetInstruction() to handle sign extensions correctly.
llvm-svn: 2059
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/Sparc/SparcInstrInfo.cpp | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/llvm/lib/Target/Sparc/SparcInstrInfo.cpp b/llvm/lib/Target/Sparc/SparcInstrInfo.cpp index 1317dc37eea..a44dc7fbaf5 100644 --- a/llvm/lib/Target/Sparc/SparcInstrInfo.cpp +++ b/llvm/lib/Target/Sparc/SparcInstrInfo.cpp @@ -45,8 +45,8 @@ CreateIntSetInstruction(int64_t C, Value* dest, else { minstr = new MachineInstr(SETSW); - minstr->SetMachineOperandConst(0, MachineOperand::MO_SignExtendedImmed, C); - minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, dest); + minstr->SetMachineOperandConst(0,MachineOperand::MO_SignExtendedImmed,C); + minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,dest); } return minstr; @@ -59,20 +59,50 @@ CreateUIntSetInstruction(uint64_t C, Value* dest, MachineInstr* minstr; if (C > (unsigned int) ~0) { // C does not fit in 32 bits + assert(dest->getType() == Type::ULongTy && "Sign extension problems"); TmpInstruction *tmpReg = new TmpInstruction(Type::IntTy); tempVec.push_back(tmpReg); minstr = new MachineInstr(SETX); - minstr->SetMachineOperandConst(0, MachineOperand::MO_SignExtendedImmed, C); - minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, tmpReg, - /*isdef*/ true); + minstr->SetMachineOperandConst(0,MachineOperand::MO_SignExtendedImmed,C); + minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, + tmpReg, /*isdef*/ true); minstr->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,dest); } - else + else if (dest->getType() == Type::ULongTy) { minstr = new MachineInstr(SETUW); minstr->SetMachineOperandConst(0, MachineOperand::MO_UnextendedImmed, C); - minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, dest); + minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,dest); + } + else + { // cast to signed type of the right length and use signed op (SETSW) + // to get correct sign extension + // + minstr = new MachineInstr(SETSW); + minstr->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister,dest); + + switch (dest->getType()->getPrimitiveID()) + { + case Type::UIntTyID: + minstr->SetMachineOperandConst(0, + MachineOperand::MO_SignExtendedImmed, + (int) C); + break; + case Type::UShortTyID: + minstr->SetMachineOperandConst(0, + MachineOperand::MO_SignExtendedImmed, + (short) C); + break; + case Type::UByteTyID: + minstr->SetMachineOperandConst(0, + MachineOperand::MO_SignExtendedImmed, + (char) C); + break; + default: + assert(0 && "Unexpected unsigned type"); + break; + } } return minstr; |