Ignore:
Timestamp:
May 6, 2013, 1:28:31 PM (12 years ago)
Author:
[email protected]
Message:

Misc bugfix and cleaning in sh4 base JIT.
https://bugs.webkit.org/show_bug.cgi?id=115627

Patch by Julien Brianceau <[email protected]> on 2013-05-06
Reviewed by Oliver Hunt.

Get rid of loadX(RegisterID r0, RegisterID src, RegisterID dest) functions.
Remove misplaced extuw() implementation from MacroAssemblerSH4.
Add movbRegMemr0 and movwRegMemr0 functions in SH4Assembler.

  • assembler/MacroAssemblerSH4.h:

(JSC::MacroAssemblerSH4::add32): Skip operation when first operand is a zero immediate.
(JSC::MacroAssemblerSH4::sub32): Skip operation when first operand is a zero immediate.
(JSC::MacroAssemblerSH4::load32): Fix wrong usage of r0 register.
(JSC::MacroAssemblerSH4::load8Signed): Handle "base == r0" case.
(MacroAssemblerSH4):
(JSC::MacroAssemblerSH4::load16): Handle "base == r0" case.
(JSC::MacroAssemblerSH4::load16Unaligned): Use extuw() implementation from SH4Assembler.
(JSC::MacroAssemblerSH4::load16Signed): Cosmetic change.
(JSC::MacroAssemblerSH4::store8): Fix unhandled BaseIndex offset and handle (base == r0) case.
(JSC::MacroAssemblerSH4::store16): Fix unhandled BaseIndex offset and handle (base == r0) case.
(JSC::MacroAssemblerSH4::store32):

  • assembler/SH4Assembler.h:

(JSC::SH4Assembler::movwRegMemr0):
(SH4Assembler):
(JSC::SH4Assembler::movbRegMemr0):
(JSC::SH4Assembler::placeConstantPoolBarrier): Cosmetic change.
(JSC::SH4Assembler::maxJumpReplacementSize):
(JSC::SH4Assembler::replaceWithJump): Correct branch range and save an opcode.
(JSC::SH4Assembler::printInstr):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/SH4Assembler.h

    r149403 r149634  
    116116    MOVL_READ_OFFRM_OPCODE = 0x5000,
    117117    MOVW_WRITE_RN_OPCODE = 0x2001,
     118    MOVW_WRITE_R0RN_OPCODE = 0x0005,
    118119    MOVW_READ_RM_OPCODE = 0x6001,
    119120    MOVW_READ_R0RM_OPCODE = 0x000d,
     
    10611062    }
    10621063
     1064    void movwRegMemr0(RegisterID src, RegisterID dst)
     1065    {
     1066        uint16_t opc = getOpcodeGroup1(MOVW_WRITE_R0RN_OPCODE, dst, src);
     1067        oneShortOp(opc);
     1068    }
     1069
    10631070    void movlRegMem(RegisterID src, int offset, RegisterID base)
    10641071    {
     
    11241131    {
    11251132        uint16_t opc = getOpcodeGroup1(MOVB_READ_RM_OPCODE, dst, src);
     1133        oneShortOp(opc);
     1134    }
     1135
     1136    void movbRegMemr0(RegisterID src, RegisterID dst)
     1137    {
     1138        uint16_t opc = getOpcodeGroup1(MOVB_WRITE_R0RN_OPCODE, dst, src);
    11261139        oneShortOp(opc);
    11271140    }
     
    13811394    static SH4Buffer::TwoShorts placeConstantPoolBarrier(int offset)
    13821395    {
    1383         ASSERT(((offset >> 1) <=2047) && ((offset >> 1) >= -2048));
     1396        ASSERT(((offset >> 1) <= 2047) && ((offset >> 1) >= -2048));
    13841397
    13851398        SH4Buffer::TwoShorts m_barrier;
     
    14751488    static ptrdiff_t maxJumpReplacementSize()
    14761489    {
    1477         return sizeof(SH4Word) * 7;
     1490        return sizeof(SH4Word) * 6;
    14781491    }
    14791492
     
    14841497        int nbinst = 0;
    14851498
    1486         if ((difference >= -2048) && (difference <= 2047)) {
     1499        if ((difference >= -4096) && (difference <= 4094)) {
    14871500            instruction[0] = getOpcodeGroup6(BRA_OPCODE, difference >> 1);
    14881501            instruction[1] = NOP_OPCODE;
     
    14911504        }
    14921505
    1493         if (reinterpret_cast<unsigned>(instruction) & 3)
    1494             instruction[nbinst++] = NOP_OPCODE;
    1495 
    14961506        instruction[nbinst++] = getOpcodeGroup3(MOVL_READ_OFFPC_OPCODE, scratchReg2, 1);
    14971507        instruction[nbinst++] = getOpcodeGroup2(JMP_OPCODE, scratchReg2);
    14981508        instruction[nbinst++] = NOP_OPCODE;
    1499         instruction[nbinst++] = NOP_OPCODE;
     1509
     1510        if (!(reinterpret_cast<unsigned>(instruction) & 3))
     1511            instruction[nbinst++] = NOP_OPCODE;
     1512
    15001513        instruction[nbinst++] = reinterpret_cast<unsigned>(to) & 0xffff;
    15011514        instruction[nbinst++] = reinterpret_cast<unsigned>(to) >> 16;
     
    19491962            format = "    MOV.W @(R0, R%d), R%d\n";
    19501963            break;
     1964        case MOVW_WRITE_R0RN_OPCODE:
     1965            format = "    MOV.W R%d, @(R0, R%d)\n";
     1966            break;
    19511967        case EXTUB_OPCODE:
    19521968            format = "    EXTU.B R%d, R%d\n";
Note: See TracChangeset for help on using the changeset viewer.