X87: [compiler] Introduce StringEqualStub and StringNotEqualStub.

port 2689548e38 (r34459)

  original commit message:
  These new stubs perform exactly the same job as the string equality case
  for the CompareIC, but are platform independent and usable outside of
  fullcodegen and Crankshaft. We use them in the StrictEqualStub and the
  StrictNotEqualStub instead of falling back to the runtime immediately
  for String comparisons, and we also use them in TurboFan to perform
  String equality or inequality comparisons.

  These stubs currently handle only internalized and one byte strings w/o
  going to C++, but it should be easy to add support for more string cases
  later, i.e. utilizing already flattened cons strings or comparing two
  byte strings as well.

BUG=

Review URL: https://codereview.chromium.org/1760343002

Cr-Commit-Position: refs/heads/master@{#34479}
This commit is contained in:
zhengxing.li 2016-03-03 23:24:53 -08:00 committed by Commit bot
parent 1736ad786f
commit 1a73d99e92

View File

@ -2452,9 +2452,15 @@ void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) {
DCHECK(ToRegister(instr->left()).is(edx));
DCHECK(ToRegister(instr->right()).is(eax));
Handle<Code> code = CodeFactory::StringCompare(isolate()).code();
CallCode(code, RelocInfo::CODE_TARGET, instr);
__ test(eax, eax);
if (Token::IsOrderedRelationalCompareOp(instr->op())) {
Handle<Code> code = CodeFactory::StringCompare(isolate()).code();
CallCode(code, RelocInfo::CODE_TARGET, instr);
__ test(eax, eax);
} else {
Handle<Code> code = CodeFactory::StringEqual(isolate()).code();
CallCode(code, RelocInfo::CODE_TARGET, instr);
__ CompareRoot(eax, Heap::kTrueValueRootIndex);
}
EmitBranch(instr, ComputeCompareCondition(instr->op()));
}