diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-08-04 20:55:37 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-08-04 20:55:37 +0000 |
commit | a40cbb3b7e737466df3e97d97e16f6b22ffffeef (patch) | |
tree | 799a21b5bbf90a858dd46a8ab1372054a1d24227 /lib | |
parent | 7894d56023028dffb68212214b27d5f4d6c5bc91 (diff) | |
download | external_llvm-a40cbb3b7e737466df3e97d97e16f6b22ffffeef.zip external_llvm-a40cbb3b7e737466df3e97d97e16f6b22ffffeef.tar.gz external_llvm-a40cbb3b7e737466df3e97d97e16f6b22ffffeef.tar.bz2 |
Bug fix in CreateCodeToLoadConst(): use sign of dest, not operand,
in choosing how to create int-set instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3248 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/SparcV9/SparcV9InstrInfo.cpp | 36 |
1 files changed, 7 insertions, 29 deletions
diff --git a/lib/Target/SparcV9/SparcV9InstrInfo.cpp b/lib/Target/SparcV9/SparcV9InstrInfo.cpp index e1a7a3f..b4460f0 100644 --- a/lib/Target/SparcV9/SparcV9InstrInfo.cpp +++ b/lib/Target/SparcV9/SparcV9InstrInfo.cpp @@ -187,7 +187,7 @@ CreateIntSetInstruction(const TargetMachine& target, assert(dest->getType()->isSigned() && "Use CreateUIntSetInstruction()"); uint64_t absC = (C >= 0)? C : -C; - if (absC > (unsigned int) ~0) + if (absC > (uint32_t) ~0) { // C does not fit in 32 bits TmpInstruction* tmpReg = new TmpInstruction(Type::IntTy); mcfi.addTemp(tmpReg); @@ -207,7 +207,7 @@ CreateUIntSetInstruction(const TargetMachine& target, assert(! dest->getType()->isSigned() && "Use CreateIntSetInstruction()"); MachineInstr* M; - if (C > (unsigned int) ~0) + if (C > (uint32_t) ~0) { // C does not fit in 32 bits assert(dest->getType() == Type::ULongTy && "Sign extension problems"); TmpInstruction *tmpReg = new TmpInstruction(Type::IntTy); @@ -215,31 +215,7 @@ CreateUIntSetInstruction(const TargetMachine& target, CreateSETXConst(target, C, tmpReg, dest, mvec); } else - { -#undef SIGN_EXTEND_FOR_UNSIGNED_DEST -#ifdef SIGN_EXTEND_FOR_UNSIGNED_DEST - // If dest is smaller than the standard integer reg. size - // and the high-order bit of dest will be 1, then we have to - // extend the sign-bit into upper bits of the dest register. - // - unsigned destSize = target.DataLayout.getTypeSize(dest->getType()); - if (destSize < target.DataLayout.getIntegerRegize()) - { - assert(destSize <= 4 && "Unexpected type size of 5-7 bytes"); - uint32_t signBit = C & (1 << (8*destSize-1)); - if (signBit) - { // Sign-bit is 1 so convert C to a sign-extended 64-bit value - // and use CreateSETSWConst. CreateSETSWConst will correctly - // generate efficient code for small signed values. - int32_t simmC = C | ~(signBit-1); - CreateSETSWConst(target, simmC, dest, mvec); - return; - } - } -#endif /*SIGN_EXTEND_FOR_UNSIGNED_DEST*/ - - CreateSETUWConst(target, C, dest, mvec); - } + CreateSETUWConst(target, C, dest, mvec); } @@ -298,9 +274,11 @@ UltraSparcInstrInfo::CreateCodeToLoadConst(const TargetMachine& target, mcfi.addTemp(tmpReg); CreateSETXLabel(target, val, tmpReg, dest, mvec); } - else if (! val->getType()->isSigned()) + else if (! dest->getType()->isSigned()) { - uint64_t C = cast<ConstantUInt>(val)->getValue(); + bool isValidConstant; + uint64_t C = GetConstantValueAsUnsignedInt(val, isValidConstant); + assert(isValidConstant && "Unrecognized constant"); CreateUIntSetInstruction(target, C, dest, mvec, mcfi); } else |