PPC: [ic] Introduce BOOLEAN state for CompareIC.
Port 10c5f2e85e
Original commit message:
Slow path for relational comparison of boolean primitive values
now goes through the runtime, which made the slow path even
slower than it already was. So in order to repair the regression,
we just track boolean feedback for comparisons and use that
to generate decent code in Crankshaft (not the best possible
code, but good enough for Crankshaft; TurboFan will be able
to do better on that).
R=bmeurer@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com, dstence@us.ibm.com
BUG=chromium:534200
LOG=n
Review URL: https://codereview.chromium.org/1362683002
Cr-Commit-Position: refs/heads/master@{#30871}
This commit is contained in:
parent
308ae26955
commit
3028534498
@ -3583,6 +3583,30 @@ void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
void CompareICStub::GenerateBooleans(MacroAssembler* masm) {
|
||||
DCHECK_EQ(CompareICState::BOOLEAN, state());
|
||||
Label miss;
|
||||
|
||||
__ CheckMap(r4, r5, Heap::kBooleanMapRootIndex, &miss, DO_SMI_CHECK);
|
||||
__ CheckMap(r3, r6, Heap::kBooleanMapRootIndex, &miss, DO_SMI_CHECK);
|
||||
if (op() != Token::EQ_STRICT && is_strong(strength())) {
|
||||
__ TailCallRuntime(Runtime::kThrowStrongModeImplicitConversion, 0, 1);
|
||||
} else {
|
||||
if (!Token::IsEqualityOp(op())) {
|
||||
__ LoadP(r4, FieldMemOperand(r4, Oddball::kToNumberOffset));
|
||||
__ AssertSmi(r4);
|
||||
__ LoadP(r3, FieldMemOperand(r3, Oddball::kToNumberOffset));
|
||||
__ AssertSmi(r3);
|
||||
}
|
||||
__ sub(r3, r4, r3);
|
||||
__ Ret();
|
||||
}
|
||||
|
||||
__ bind(&miss);
|
||||
GenerateMiss(masm);
|
||||
}
|
||||
|
||||
|
||||
void CompareICStub::GenerateSmis(MacroAssembler* masm) {
|
||||
DCHECK(state() == CompareICState::SMI);
|
||||
Label miss;
|
||||
|
Loading…
Reference in New Issue
Block a user