Ignore:
Timestamp:
Sep 30, 2015, 3:28:08 PM (10 years ago)
Author:
[email protected]
Message:

Source/JavaScriptCore:
Relanding r190289 with the following two fixes:

  1. REGRESSION(r190289): It made Speedometer/Full.html performance test fail https://bugs.webkit.org/show_bug.cgi?id=149621

Reviewed by Saam Barati.

We need to restore callee saves for both the fast and slow paths before making a
tail call in the FTL.

  • ftl/FTLJSCallBase.cpp: (JSC::FTL::JSCallBase::emit):
  1. [ARM] REGRESSION(r190289): It made 374 tests crash on 32 bit ARM Linux https://bugs.webkit.org/show_bug.cgi?id=149619

Reviewed by Filip Pizlo.

Need to check for ARMv7_TRADITIONAL and ARMv7 in addition to ARM in "if"
statement to handle platforms with a link register.


  • llint/LowLevelInterpreter.asm: (prepareForTailCall):

LayoutTests:
Relanding r190289 after fixes tracked in https://bugs.webkit.org/show_bug.cgi?id=149619
and https://bugs.webkit.org/show_bug.cgi?id=149621

Reviewed by Saam Barati.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/jit/CallFrameShuffler64.cpp

    r190329 r190370  
    8888                cachedRecovery.recovery().gpr(),
    8989                cachedRecovery.recovery().gpr());
    90             // We have to do this the hard way.
    91             m_jit.or64(MacroAssembler::TrustedImm64(TagTypeNumber),
    92                 cachedRecovery.recovery().gpr());
     90            m_lockedRegisters.set(cachedRecovery.recovery().gpr());
     91            if (tryAcquireTagTypeNumber())
     92                m_jit.or64(m_tagTypeNumber, cachedRecovery.recovery().gpr());
     93            else {
     94                // We have to do this the hard way
     95                m_jit.or64(MacroAssembler::TrustedImm64(TagTypeNumber),
     96                    cachedRecovery.recovery().gpr());
     97            }
     98            m_lockedRegisters.clear(cachedRecovery.recovery().gpr());
    9399            cachedRecovery.setRecovery(
    94100                ValueRecovery::inGPR(cachedRecovery.recovery().gpr(), DataFormatJS));
     
    142148            m_jit.purifyNaN(cachedRecovery.recovery().fpr());
    143149            m_jit.moveDoubleTo64(cachedRecovery.recovery().fpr(), resultGPR);
    144             m_jit.sub64(MacroAssembler::TrustedImm64(TagTypeNumber), resultGPR);
     150            m_lockedRegisters.set(resultGPR);
     151            if (tryAcquireTagTypeNumber())
     152                m_jit.sub64(m_tagTypeNumber, resultGPR);
     153            else
     154                m_jit.sub64(MacroAssembler::TrustedImm64(TagTypeNumber), resultGPR);
     155            m_lockedRegisters.clear(resultGPR);
    145156            updateRecovery(cachedRecovery, ValueRecovery::inGPR(resultGPR, DataFormatJS));
    146157            if (verbose)
     
    338349    ASSERT(m_registers[wantedReg] == &cachedRecovery);
    339350}
     351   
     352bool CallFrameShuffler::tryAcquireTagTypeNumber()
     353{
     354    if (m_tagTypeNumber != InvalidGPRReg)
     355        return true;
     356
     357    m_tagTypeNumber = getFreeGPR();
     358
     359    if (m_tagTypeNumber == InvalidGPRReg)
     360        return false;
     361
     362    m_lockedRegisters.set(m_tagTypeNumber);
     363    m_jit.move(MacroAssembler::TrustedImm64(TagTypeNumber), m_tagTypeNumber);
     364    return true;
     365}
    340366
    341367} // namespace JSC
Note: See TracChangeset for help on using the changeset viewer.