Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Unified Diff: src/IceTargetLoweringX86BaseImpl.h

Issue 1406593003: Optimize 64-bit compares with zero (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Simplify header file Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 =

Powered by Google App Engine
This is Rietveld 408576698