For immediate encodings of icmp, zero or sign extend first. Then

determine if the value is negative and flip the sign accordingly.
rdar://10422026

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144258 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chad Rosier 2011-11-10 01:30:39 +00:00
parent 8333730259
commit 6cba97c555
2 changed files with 22 additions and 5 deletions

View File

@ -1216,7 +1216,6 @@ bool ARMFastISel::ARMEmitCmp(const Value *Src1Value, const Value *Src2Value,
// Check to see if the 2nd operand is a constant that we can encode directly
// in the compare.
uint64_t Imm;
int EncodedImm = 0;
bool EncodeImm = false;
bool isNegativeImm = false;
@ -1224,10 +1223,11 @@ bool ARMFastISel::ARMEmitCmp(const Value *Src1Value, const Value *Src2Value,
if (SrcVT == MVT::i32 || SrcVT == MVT::i16 || SrcVT == MVT::i8 ||
SrcVT == MVT::i1) {
const APInt &CIVal = ConstInt->getValue();
isNegativeImm = CIVal.isNegative();
Imm = (isNegativeImm) ? (-CIVal).getZExtValue() : CIVal.getZExtValue();
EncodedImm = (int)Imm;
EncodedImm = (isZExt) ? (int)CIVal.getZExtValue() : (int)CIVal.getSExtValue();
if (EncodedImm < 0) {
isNegativeImm = true;
EncodedImm = -EncodedImm;
}
EncodeImm = isThumb2 ? (ARM_AM::getT2SOImmVal(EncodedImm) != -1) :
(ARM_AM::getSOImmVal(EncodedImm) != -1);
}

View File

@ -212,3 +212,20 @@ if.then: ; preds = %entry
if.end: ; preds = %if.then, %entry
ret void
}
define void @t12(i8 %a) uwtable ssp {
entry:
; ARM: t12
; THUMB: t12
%cmp = icmp ugt i8 %a, -113
; ARM: cmp r{{[0-9]}}, #143
; THUMB: cmp r{{[0-9]}}, #143
br i1 %cmp, label %if.then, label %if.end
if.then: ; preds = %entry
tail call void @foo()
br label %if.end
if.end: ; preds = %if.then, %entry
ret void
}