| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 27d064d3b4bbbdf355b9d8ca667a7f13b4259429..4b2764b8904414886ade61f1107255a74f9a63e3 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -917,6 +917,34 @@ static const char* LabelType(LLabel* label) {
|
| }
|
|
|
|
|
| +inline Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) {
|
| + Condition cond = no_condition;
|
| + switch (op) {
|
| + case Token::EQ:
|
| + case Token::EQ_STRICT:
|
| + cond = equal;
|
| + break;
|
| + case Token::LT:
|
| + cond = is_unsigned ? below : less;
|
| + break;
|
| + case Token::GT:
|
| + cond = is_unsigned ? above : greater;
|
| + break;
|
| + case Token::LTE:
|
| + cond = is_unsigned ? below_equal : less_equal;
|
| + break;
|
| + case Token::GTE:
|
| + cond = is_unsigned ? above_equal : greater_equal;
|
| + break;
|
| + case Token::IN:
|
| + case Token::INSTANCEOF:
|
| + default:
|
| + UNREACHABLE();
|
| + }
|
| + return cond;
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoLabel(LLabel* label) {
|
| Comment(";;; <@%d,#%d> -------------------- B%d%s --------------------",
|
| current_instruction_,
|
| @@ -1944,6 +1972,13 @@ void LCodeGen::DoDebugBreak(LDebugBreak* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoAndBranch(LAndBranch* instr) {
|
| + Condition condition = TokenToCondition(instr->op(), false);
|
| + __ testq(ToRegister(instr->value()), ToRegister(instr->value()));
|
| + EmitBranch(instr, condition);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoBranch(LBranch* instr) {
|
| Representation r = instr->hydrogen()->value()->representation();
|
| if (r.IsInteger32()) {
|
| @@ -2093,34 +2128,6 @@ void LCodeGen::DoGoto(LGoto* instr) {
|
| }
|
|
|
|
|
| -inline Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) {
|
| - Condition cond = no_condition;
|
| - switch (op) {
|
| - case Token::EQ:
|
| - case Token::EQ_STRICT:
|
| - cond = equal;
|
| - break;
|
| - case Token::LT:
|
| - cond = is_unsigned ? below : less;
|
| - break;
|
| - case Token::GT:
|
| - cond = is_unsigned ? above : greater;
|
| - break;
|
| - case Token::LTE:
|
| - cond = is_unsigned ? below_equal : less_equal;
|
| - break;
|
| - case Token::GTE:
|
| - cond = is_unsigned ? above_equal : greater_equal;
|
| - break;
|
| - case Token::IN:
|
| - case Token::INSTANCEOF:
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| - return cond;
|
| -}
|
| -
|
| -
|
| void LCodeGen::DoCompareNumericAndBranch(LCompareNumericAndBranch* instr) {
|
| LOperand* left = instr->left();
|
| LOperand* right = instr->right();
|
| @@ -2604,16 +2611,10 @@ void LCodeGen::DoCmpT(LCmpT* instr) {
|
|
|
| Handle<Code> ic = CompareIC::GetUninitialized(isolate(), op);
|
| CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| + __ nop();
|
|
|
| - Condition condition = TokenToCondition(op, false);
|
| - Label true_value, done;
|
| - __ testq(rax, rax);
|
| - __ j(condition, &true_value, Label::kNear);
|
| - __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex);
|
| - __ jmp(&done, Label::kNear);
|
| - __ bind(&true_value);
|
| - __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex);
|
| - __ bind(&done);
|
| + Register res = ToRegister(instr->result());
|
| + if (!res.is(rax)) __ movq(res, rax);
|
| }
|
|
|
|
|
|
|