Changeset 230310 in webkit


Ignore:
Timestamp:
Apr 5, 2018 12:12:01 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

[MIPS] Optimize generated JIT code for branches
https://bugs.webkit.org/show_bug.cgi?id=183130

Patch by Stanislav Ocovaj <stanislav.ocovaj@rt-rk.com> on 2018-04-05
Reviewed by Yusuke Suzuki.

The patch https://bugs.webkit.org/show_bug.cgi?id=101328 added two nop instructions to
branchEqual() and branchNotEqual() in order to allow the code generated by branchPtrWithPatch()
to be reverted back to branchPtrWithPatch after replacing it with a 4-instruction jump.
However, this adds a significant overhead for all other types of branches. Since these nop's
protect the code that is generated by branchPtrWithPatch, this function seems like a better
place to add them.

  • assembler/MIPSAssembler.h:

(JSC::MIPSAssembler::repatchInt32):
(JSC::MIPSAssembler::revertJumpToMove):

  • assembler/MacroAssemblerMIPS.h:

(JSC::MacroAssemblerMIPS::branchAdd32):
(JSC::MacroAssemblerMIPS::branchMul32):
(JSC::MacroAssemblerMIPS::branchSub32):
(JSC::MacroAssemblerMIPS::branchNeg32):
(JSC::MacroAssemblerMIPS::branchPtrWithPatch):
(JSC::MacroAssemblerMIPS::branchEqual):
(JSC::MacroAssemblerMIPS::branchNotEqual):

Location:
trunk/Source/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r230303 r230310  
     12018-04-05  Stanislav Ocovaj  <stanislav.ocovaj@rt-rk.com>
     2
     3        [MIPS] Optimize generated JIT code for branches
     4        https://bugs.webkit.org/show_bug.cgi?id=183130
     5
     6        Reviewed by Yusuke Suzuki.
     7
     8        The patch https://bugs.webkit.org/show_bug.cgi?id=101328 added two nop instructions to
     9        branchEqual() and branchNotEqual() in order to allow the code generated by branchPtrWithPatch()
     10        to be reverted back to branchPtrWithPatch after replacing it with a 4-instruction jump.
     11        However, this adds a significant overhead for all other types of branches. Since these nop's
     12        protect the code that is generated by branchPtrWithPatch, this function seems like a better
     13        place to add them.
     14
     15        * assembler/MIPSAssembler.h:
     16        (JSC::MIPSAssembler::repatchInt32):
     17        (JSC::MIPSAssembler::revertJumpToMove):
     18        * assembler/MacroAssemblerMIPS.h:
     19        (JSC::MacroAssemblerMIPS::branchAdd32):
     20        (JSC::MacroAssemblerMIPS::branchMul32):
     21        (JSC::MacroAssemblerMIPS::branchSub32):
     22        (JSC::MacroAssemblerMIPS::branchNeg32):
     23        (JSC::MacroAssemblerMIPS::branchPtrWithPatch):
     24        (JSC::MacroAssemblerMIPS::branchEqual):
     25        (JSC::MacroAssemblerMIPS::branchNotEqual):
     26
    1272018-04-05  Yusuke Suzuki  <utatane.tea@gmail.com>
    228
  • trunk/Source/JavaScriptCore/assembler/MIPSAssembler.h

    r230164 r230310  
    945945        ASSERT((*insn & 0xfc000000) == 0x34000000); // ori
    946946        *insn = (*insn & 0xffff0000) | (to & 0xffff);
    947         insn--;
    948         cacheFlush(insn, 2 * sizeof(MIPSWord));
     947        cacheFlush(from, 2 * sizeof(MIPSWord));
    949948    }
    950949
     
    10191018            codeSize += sizeof(MIPSWord);
    10201019        }
    1021         cacheFlush(insn, codeSize);
     1020        cacheFlush(instructionStart, codeSize);
    10221021    }
    10231022
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h

    r230164 r230310  
    20032003                b       Overflow
    20042004                nop
    2005                 nop
     2005                b       No_overflow
    20062006                nop
    20072007                nop
     
    20112011            move(dest, dataTempRegister);
    20122012            m_assembler.xorInsn(cmpTempRegister, dataTempRegister, src);
    2013             m_assembler.bltz(cmpTempRegister, 12);
     2013            m_assembler.bltz(cmpTempRegister, 10);
    20142014            m_assembler.addu(dest, dataTempRegister, src);
    20152015            m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
    2016             m_assembler.bgez(cmpTempRegister, 9);
     2016            m_assembler.bgez(cmpTempRegister, 7);
    20172017            m_assembler.nop();
    20182018            return jump();
     
    20562056                b       Overflow
    20572057                nop
    2058                 nop
     2058                b       No_overflow
    20592059                nop
    20602060                nop
     
    20642064            move(op1, dataTempRegister);
    20652065            m_assembler.xorInsn(cmpTempRegister, dataTempRegister, op2);
    2066             m_assembler.bltz(cmpTempRegister, 12);
     2066            m_assembler.bltz(cmpTempRegister, 10);
    20672067            m_assembler.addu(dest, dataTempRegister, op2);
    20682068            m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
    2069             m_assembler.bgez(cmpTempRegister, 9);
     2069            m_assembler.bgez(cmpTempRegister, 7);
    20702070            m_assembler.nop();
    20712071            return jump();
     
    21122112            if (cond == Overflow) {
    21132113                if (imm.m_value >= 0) {
    2114                     m_assembler.bltz(src, 11);
     2114                    m_assembler.bltz(src, 9);
    21152115                    m_assembler.addiu(dest, src, imm.m_value);
    2116                     m_assembler.bgez(dest, 9);
     2116                    m_assembler.bgez(dest, 7);
    21172117                    m_assembler.nop();
    21182118                } else {
    2119                     m_assembler.bgez(src, 11);
     2119                    m_assembler.bgez(src, 9);
    21202120                    m_assembler.addiu(dest, src, imm.m_value);
    2121                     m_assembler.bltz(dest, 9);
     2121                    m_assembler.bltz(dest, 7);
    21222122                    m_assembler.nop();
    21232123                }
     
    21632163                    b       Overflow
    21642164                    nop
    2165                     nop
     2165                    b       No_overflow
    21662166                    nop
    21672167                    nop
     
    21742174                m_assembler.addu(dataTempRegister, dataTempRegister, immTempRegister);
    21752175                store32(dataTempRegister, dest.m_ptr);
    2176                 m_assembler.bltz(cmpTempRegister, 11);
     2176                m_assembler.bltz(cmpTempRegister, 9);
    21772177                m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister);
    2178                 m_assembler.bgez(cmpTempRegister, 9);
     2178                m_assembler.bgez(cmpTempRegister, 7);
    21792179                m_assembler.nop();
    21802180            } else {
     
    21852185                    move(dataTempRegister, cmpTempRegister);
    21862186                    m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value);
    2187                     m_assembler.bltz(cmpTempRegister, 11);
     2187                    m_assembler.bltz(cmpTempRegister, 9);
    21882188                    m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff);
    2189                     m_assembler.bgez(dataTempRegister, 9);
     2189                    m_assembler.bgez(dataTempRegister, 7);
    21902190                    m_assembler.nop();
    21912191                } else if (imm.m_value >= -32768 && imm.m_value < 0) {
    21922192                    move(dataTempRegister, cmpTempRegister);
    21932193                    m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value);
    2194                     m_assembler.bgez(cmpTempRegister, 11);
     2194                    m_assembler.bgez(cmpTempRegister, 9);
    21952195                    m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff);
    2196                     m_assembler.bltz(cmpTempRegister, 9);
     2196                    m_assembler.bltz(cmpTempRegister, 7);
    21972197                    m_assembler.nop();
    21982198                } else {
     
    22002200                    m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister);
    22012201                    m_assembler.addu(dataTempRegister, dataTempRegister, immTempRegister);
    2202                     m_assembler.bltz(cmpTempRegister, 12);
     2202                    m_assembler.bltz(cmpTempRegister, 10);
    22032203                    m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff);
    22042204                    m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister);
    2205                     m_assembler.bgez(cmpTempRegister, 9);
     2205                    m_assembler.bgez(cmpTempRegister, 7);
    22062206                    m_assembler.nop();
    22072207                }
     
    22522252                b       Overflow
    22532253                nop
    2254                 nop
     2254                b       No_overflow
    22552255                nop
    22562256                nop
     
    22622262            m_assembler.mflo(dest);
    22632263            m_assembler.sra(addrTempRegister, dest, 31);
    2264             m_assembler.beq(dataTempRegister, addrTempRegister, 9);
     2264            m_assembler.beq(dataTempRegister, addrTempRegister, 7);
    22652265            m_assembler.nop();
    22662266            return jump();
     
    22972297                b       Overflow
    22982298                nop
    2299                 nop
     2299                b       No_overflow
    23002300                nop
    23012301                nop
     
    23072307            m_assembler.mflo(dest);
    23082308            m_assembler.sra(addrTempRegister, dest, 31);
    2309             m_assembler.beq(dataTempRegister, addrTempRegister, 9);
     2309            m_assembler.beq(dataTempRegister, addrTempRegister, 7);
    23102310            m_assembler.nop();
    23112311            return jump();
     
    23492349                b       Overflow
    23502350                nop
    2351                 nop
     2351                b       No_overflow
    23522352                nop
    23532353                nop
     
    23572357            move(dest, dataTempRegister);
    23582358            m_assembler.xorInsn(cmpTempRegister, dataTempRegister, src);
    2359             m_assembler.bgez(cmpTempRegister, 12);
     2359            m_assembler.bgez(cmpTempRegister, 10);
    23602360            m_assembler.subu(dest, dataTempRegister, src);
    23612361            m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
    2362             m_assembler.bgez(cmpTempRegister, 9);
     2362            m_assembler.bgez(cmpTempRegister, 7);
    23632363            m_assembler.nop();
    23642364            return jump();
     
    24082408                b       Overflow
    24092409                nop
    2410                 nop
     2410                b       No_overflow
    24112411                nop
    24122412                nop
     
    24162416            move(op1, dataTempRegister);
    24172417            m_assembler.xorInsn(cmpTempRegister, dataTempRegister, op2);
    2418             m_assembler.bgez(cmpTempRegister, 12);
     2418            m_assembler.bgez(cmpTempRegister, 10);
    24192419            m_assembler.subu(dest, dataTempRegister, op2);
    24202420            m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
    2421             m_assembler.bgez(cmpTempRegister, 9);
     2421            m_assembler.bgez(cmpTempRegister, 7);
    24222422            m_assembler.nop();
    24232423            return jump();
     
    24522452                b       Overflow
    24532453                nop
    2454                 nop
     2454                b       No_overflow
    24552455                nop
    24562456                nop
     
    26792679        m_fixedWidth = true;
    26802680        dataLabel = moveWithPatch(initialRightValue, immTempRegister);
     2681        m_assembler.nop();
     2682        m_assembler.nop();
    26812683        Jump temp = branch32(cond, left, immTempRegister);
    26822684        m_fixedWidth = false;
     
    26892691        load32(left, dataTempRegister);
    26902692        dataLabel = moveWithPatch(initialRightValue, immTempRegister);
     2693        m_assembler.nop();
     2694        m_assembler.nop();
    26912695        Jump temp = branch32(cond, dataTempRegister, immTempRegister);
    26922696        m_fixedWidth = false;
     
    32043208    Jump branchEqual(RegisterID rs, RegisterID rt)
    32053209    {
    3206         m_assembler.nop();
    3207         m_assembler.nop();
    32083210        m_assembler.appendJump();
    32093211        m_assembler.beq(rs, rt, 0);
     
    32153217    Jump branchNotEqual(RegisterID rs, RegisterID rt)
    32163218    {
    3217         m_assembler.nop();
    3218         m_assembler.nop();
    32193219        m_assembler.appendJump();
    32203220        m_assembler.bne(rs, rt, 0);
Note: See TracChangeset for help on using the changeset viewer.