Chromium Code Reviews| Index: src/IceTargetLoweringX86BaseImpl.h |
| diff --git a/src/IceTargetLoweringX86BaseImpl.h b/src/IceTargetLoweringX86BaseImpl.h |
| index 0b3a32f87c0b0c283d946e971b4f73fc0ebca0cc..e26a353a98a9e4316906b343b9cf7281d57827bf 100644 |
| --- a/src/IceTargetLoweringX86BaseImpl.h |
| +++ b/src/IceTargetLoweringX86BaseImpl.h |
| @@ -2787,10 +2787,63 @@ TargetX86Base<Machine>::lowerIcmp64(const InstIcmp *Inst) { |
| assert(Index < Traits::TableIcmp64Size); |
| Operand *Src0LoRM = legalize(loOperand(Src0), Legal_Reg | Legal_Mem); |
| Operand *Src0HiRM = legalize(hiOperand(Src0), Legal_Reg | Legal_Mem); |
| - Operand *Src1LoRI = legalize(loOperand(Src1), Legal_Reg | Legal_Imm); |
| - Operand *Src1HiRI = legalize(hiOperand(Src1), Legal_Reg | Legal_Imm); |
| Constant *Zero = Ctx->getConstantZero(IceType_i32); |
| Constant *One = Ctx->getConstantInt32(1); |
| + Constant *SignMask = Ctx->getConstantInt32(0x80000000); |
| + if (auto *Const64 = llvm::dyn_cast<ConstantInteger64>(Src1)) { |
| + if (Const64->getValue() == 0) { |
| + Variable *Temp = nullptr; |
| + switch (Condition) { |
| + default: |
| + llvm_unreachable("unexpected condition"); |
| + break; |
| + case InstIcmp::Eq: |
| + _mov(Temp, Src0LoRM); |
| + _or(Temp, Src0HiRM); |
| + Context.insert(InstFakeUse::create(Func, Temp)); |
| + _setcc(Dest, Traits::Cond::Br_e); |
| + return; |
| + case InstIcmp::Ne: |
| + _mov(Temp, Src0LoRM); |
| + _or(Temp, Src0HiRM); |
| + Context.insert(InstFakeUse::create(Func, Temp)); |
| + _setcc(Dest, Traits::Cond::Br_ne); |
| + return; |
| + case InstIcmp::Ugt: |
|
Jim Stichnoth
2015/10/14 18:04:49
I think you should combine Ugt with Ne, and Ule wi
sehr
2015/10/15 00:19:34
Good point. Done.
|
| + _mov(Temp, Src0LoRM); |
| + _or(Temp, Src0HiRM); |
| + Context.insert(InstFakeUse::create(Func, Temp)); |
| + _setcc(Dest, Traits::Cond::Br_ne); |
| + return; |
| + case InstIcmp::Uge: |
| + _mov(Dest, One); |
| + return; |
| + case InstIcmp::Ult: |
| + _mov(Dest, Zero); |
| + return; |
| + case InstIcmp::Ule: |
| + _mov(Temp, Src0LoRM); |
| + _or(Temp, Src0HiRM); |
| + Context.insert(InstFakeUse::create(Func, Temp)); |
| + _setcc(Dest, Traits::Cond::Br_e); |
| + return; |
| + case InstIcmp::Sgt: |
| + break; |
| + case InstIcmp::Sge: |
| + _test(Src0HiRM, SignMask); |
| + _setcc(Dest, Traits::Cond::Br_e); |
| + return; |
| + case InstIcmp::Slt: |
| + _test(Src0HiRM, SignMask); |
| + _setcc(Dest, Traits::Cond::Br_ne); |
| + return; |
| + case InstIcmp::Sle: |
| + break; |
| + } |
| + } |
| + } |
| + Operand *Src1LoRI = legalize(loOperand(Src1), Legal_Reg | Legal_Imm); |
| + Operand *Src1HiRI = legalize(hiOperand(Src1), Legal_Reg | Legal_Imm); |
| typename Traits::Insts::Label *LabelFalse = |
| Traits::Insts::Label::create(Func, this); |
| typename Traits::Insts::Label *LabelTrue = |