From: chunyang.dai Date: Mon, 21 Sep 2015 09:18:11 +0000 (-0700) Subject: X87: [stubs] Refactor StringCompareStub and use it for HStringCompareAndBranch. X-Git-Tag: upstream/4.7.83~195 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=be04dd5c9e6023cc4114bd41f80fde3201e784e9;p=platform%2Fupstream%2Fv8.git X87: [stubs] Refactor StringCompareStub and use it for HStringCompareAndBranch. port 8016547c8e6fde00fff0a1791f3c83b444d8af25 (r30818). original commit message: The StringCompareStub used to take its parameters on the (JavaScript) stack, which made it impossible to use in TurboFan. Actually StringCompareStub was currently completely unused. This changes the calling convention to something TurboFan compatible and introduces a CallInterfaceDescriptor for StringCompareStub. It also changes HStringCompareAndBranch to use the StringCompareStub instead of using the full blown CompareICStub for a stupid string comparison. BUG= Review URL: https://codereview.chromium.org/1355983003 Cr-Commit-Position: refs/heads/master@{#30845} --- diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc index 9617342e6..d48341910 100644 --- a/src/x87/code-stubs-x87.cc +++ b/src/x87/code-stubs-x87.cc @@ -3072,41 +3072,39 @@ void StringHelper::GenerateOneByteCharsCompareLoop( void StringCompareStub::Generate(MacroAssembler* masm) { - Label runtime; - - // Stack frame on entry. - // esp[0]: return address - // esp[4]: right string - // esp[8]: left string - - __ mov(edx, Operand(esp, 2 * kPointerSize)); // left - __ mov(eax, Operand(esp, 1 * kPointerSize)); // right + // ----------- S t a t e ------------- + // -- edx : left string + // -- eax : right string + // -- esp[0] : return address + // ----------------------------------- + __ AssertString(edx); + __ AssertString(eax); Label not_same; __ cmp(edx, eax); __ j(not_equal, ¬_same, Label::kNear); - STATIC_ASSERT(EQUAL == 0); - STATIC_ASSERT(kSmiTag == 0); __ Move(eax, Immediate(Smi::FromInt(EQUAL))); __ IncrementCounter(isolate()->counters()->string_compare_native(), 1); - __ ret(2 * kPointerSize); + __ Ret(); __ bind(¬_same); // Check that both objects are sequential one-byte strings. + Label runtime; __ JumpIfNotBothSequentialOneByteStrings(edx, eax, ecx, ebx, &runtime); // Compare flat one-byte strings. - // Drop arguments from the stack. - __ pop(ecx); - __ add(esp, Immediate(2 * kPointerSize)); - __ push(ecx); + __ IncrementCounter(isolate()->counters()->string_compare_native(), 1); StringHelper::GenerateCompareFlatOneByteStrings(masm, edx, eax, ecx, ebx, edi); // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) // tagged as a small integer. __ bind(&runtime); + __ PopReturnAddressTo(ecx); + __ Push(edx); + __ Push(eax); + __ PushReturnAddressFrom(ecx); __ TailCallRuntime(Runtime::kStringCompare, 2, 1); } diff --git a/src/x87/interface-descriptors-x87.cc b/src/x87/interface-descriptors-x87.cc index fc5b4be2f..c6e04dce8 100644 --- a/src/x87/interface-descriptors-x87.cc +++ b/src/x87/interface-descriptors-x87.cc @@ -57,6 +57,10 @@ const Register InstanceOfDescriptor::LeftRegister() { return edx; } const Register InstanceOfDescriptor::RightRegister() { return eax; } +const Register StringCompareDescriptor::LeftRegister() { return edx; } +const Register StringCompareDescriptor::RightRegister() { return eax; } + + const Register ArgumentsAccessReadDescriptor::index() { return edx; } const Register ArgumentsAccessReadDescriptor::parameter_count() { return eax; } diff --git a/src/x87/lithium-codegen-x87.cc b/src/x87/lithium-codegen-x87.cc index 111a28127..24f62fb14 100644 --- a/src/x87/lithium-codegen-x87.cc +++ b/src/x87/lithium-codegen-x87.cc @@ -1372,11 +1372,6 @@ void LCodeGen::DoCallStub(LCallStub* instr) { CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); break; } - case CodeStub::StringCompare: { - StringCompareStub stub(isolate()); - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); - break; - } default: UNREACHABLE(); } @@ -2724,16 +2719,15 @@ static Condition ComputeCompareCondition(Token::Value op) { void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { - Token::Value op = instr->op(); - - Handle ic = - CodeFactory::CompareIC(isolate(), op, Strength::WEAK).code(); - CallCode(ic, RelocInfo::CODE_TARGET, instr); + DCHECK(ToRegister(instr->context()).is(esi)); + DCHECK(ToRegister(instr->left()).is(edx)); + DCHECK(ToRegister(instr->right()).is(eax)); - Condition condition = ComputeCompareCondition(op); - __ test(eax, Operand(eax)); + Handle code = CodeFactory::StringCompare(isolate()).code(); + CallCode(code, RelocInfo::CODE_TARGET, instr); + __ test(eax, eax); - EmitBranch(instr, condition); + EmitBranch(instr, ComputeCompareCondition(instr->op())); } diff --git a/src/x87/lithium-x87.h b/src/x87/lithium-x87.h index b2ceadb84..cc1a43fba 100644 --- a/src/x87/lithium-x87.h +++ b/src/x87/lithium-x87.h @@ -1067,7 +1067,7 @@ class LStringCompareAndBranch final : public LControlInstruction<3, 0> { inputs_[2] = right; } - LOperand* context() { return inputs_[1]; } + LOperand* context() { return inputs_[0]; } LOperand* left() { return inputs_[1]; } LOperand* right() { return inputs_[2]; }