summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-08-04 20:55:37 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-08-04 20:55:37 +0000
commit482ab4417512edbe8b4899f243c206c69a64e01f (patch)
treee7aeac39e78bf43101fdab79885bb55d0052dee0 /llvm/lib/Target
parent89f992bf2c18549538cbc5c2ab8238f834d450d2 (diff)
downloadbcm5719-llvm-482ab4417512edbe8b4899f243c206c69a64e01f.tar.gz
bcm5719-llvm-482ab4417512edbe8b4899f243c206c69a64e01f.zip
Bug fix in CreateCodeToLoadConst(): use sign of dest, not operand,
in choosing how to create int-set instructions. llvm-svn: 3248
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/Sparc/SparcInstrInfo.cpp36
1 files changed, 7 insertions, 29 deletions
diff --git a/llvm/lib/Target/Sparc/SparcInstrInfo.cpp b/llvm/lib/Target/Sparc/SparcInstrInfo.cpp
index e1a7a3f78c5..b4460f0b537 100644
--- a/llvm/lib/Target/Sparc/SparcInstrInfo.cpp
+++ b/llvm/lib/Target/Sparc/SparcInstrInfo.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
OpenPOWER on IntegriCloud