Changeset 66846 in webkit for trunk/JavaScriptCore/assembler


Ignore:
Timestamp:
Sep 6, 2010, 1:29:01 PM (15 years ago)
Author:
[email protected]
Message:

2010-09-06 Chao-ying Fu <[email protected]>

Reviewed by Oliver Hunt.

Support JSVALUE32_64 on MIPS
https://bugs.webkit.org/show_bug.cgi?id=43999

Add missing functions to support JSVALUE32_64 on MIPS.
Remove JSVALUE32 as the default for MIPS.

  • assembler/MIPSAssembler.h: (JSC::MIPSAssembler::divd): (JSC::MIPSAssembler::mthc1): (JSC::MIPSAssembler::cvtwd):
  • assembler/MacroAssemblerMIPS.h: (JSC::MacroAssemblerMIPS::neg32): (JSC::MacroAssemblerMIPS::branchOr32): (JSC::MacroAssemblerMIPS::set8): (JSC::MacroAssemblerMIPS::loadDouble): (JSC::MacroAssemblerMIPS::divDouble): (JSC::MacroAssemblerMIPS::convertInt32ToDouble): (JSC::MacroAssemblerMIPS::branchDouble): (JSC::MacroAssemblerMIPS::branchConvertDoubleToInt32): (JSC::MacroAssemblerMIPS::zeroDouble):
  • jit/JIT.h:
  • jit/JITOpcodes32_64.cpp: (JSC::JIT::privateCompileCTINativeCall):
  • jit/JITPropertyAccess32_64.cpp: (JSC::JIT::privateCompilePutByIdTransition):
  • jit/JITStubs.cpp: (JSC::JITThunks::JITThunks):
  • jit/JITStubs.h:
  • wtf/Platform.h:
Location:
trunk/JavaScriptCore/assembler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/assembler/MIPSAssembler.h

    r66524 r66846  
    530530    }
    531531
     532    void divd(FPRegisterID fd, FPRegisterID fs, FPRegisterID ft)
     533    {
     534        emitInst(0x46200003 | (fd << OP_SH_FD) | (fs << OP_SH_FS)
     535                 | (ft << OP_SH_FT));
     536    }
     537
    532538    void lwc1(FPRegisterID ft, RegisterID rs, int offset)
    533539    {
     
    561567    }
    562568
     569    void mthc1(RegisterID rt, FPRegisterID fs)
     570    {
     571        emitInst(0x44e00000 | (fs << OP_SH_FS) | (rt << OP_SH_RT));
     572        copDelayNop();
     573    }
     574
    563575    void mfc1(RegisterID rt, FPRegisterID fs)
    564576    {
     
    580592    {
    581593        emitInst(0x46800021 | (fd << OP_SH_FD) | (fs << OP_SH_FS));
     594    }
     595
     596    void cvtwd(FPRegisterID fd, FPRegisterID fs)
     597    {
     598        emitInst(0x46200024 | (fd << OP_SH_FD) | (fs << OP_SH_FS));
    582599    }
    583600
  • trunk/JavaScriptCore/assembler/MacroAssemblerMIPS.h

    r62306 r66846  
    282282    }
    283283
     284    void neg32(RegisterID srcDest)
     285    {
     286        m_assembler.subu(srcDest, MIPSRegisters::zero, srcDest);
     287    }
     288
    284289    void not32(RegisterID srcDest)
    285290    {
     
    619624        m_fixedWidth = false;
    620625        return label;
    621     }
    622 
    623     Label loadPtrWithAddressOffsetPatch(Address address, RegisterID dest)
    624     {
    625         return loadPtrWithPatchToLEA(address, dest);
    626626    }
    627627
     
    13031303    }
    13041304
     1305    Jump branchOr32(Condition cond, RegisterID src, RegisterID dest)
     1306    {
     1307        ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero));
     1308        if (cond == Signed) {
     1309            or32(src, dest);
     1310            // Check if dest is negative.
     1311            m_assembler.slt(cmpTempRegister, dest, MIPSRegisters::zero);
     1312            return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
     1313        }
     1314        if (cond == Zero) {
     1315            or32(src, dest);
     1316            return branchEqual(dest, MIPSRegisters::zero);
     1317        }
     1318        if (cond == NonZero) {
     1319            or32(src, dest);
     1320            return branchNotEqual(dest, MIPSRegisters::zero);
     1321        }
     1322        ASSERT(0);
     1323        return Jump();
     1324    }
     1325
    13051326    // Miscellaneous operations:
    13061327
     
    13501371        m_assembler.jr(MIPSRegisters::ra);
    13511372        m_assembler.nop();
     1373    }
     1374
     1375    void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest)
     1376    {
     1377        set32(cond, left, right, dest);
     1378    }
     1379
     1380    void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
     1381    {
     1382        move(right, immTempRegister);
     1383        set32(cond, left, immTempRegister, dest);
    13521384    }
    13531385
     
    15471579    }
    15481580
     1581    void loadDouble(const void* address, FPRegisterID dest)
     1582    {
     1583#if WTF_MIPS_ISA(1)
     1584        /*
     1585            li          addrTemp, address
     1586            lwc1        dest, 0(addrTemp)
     1587            lwc1        dest+1, 4(addrTemp)
     1588         */
     1589        move(ImmPtr(address), addrTempRegister);
     1590        m_assembler.lwc1(dest, addrTempRegister, 0);
     1591        m_assembler.lwc1(FPRegisterID(dest + 1), addrTempRegister, 4);
     1592#else
     1593        /*
     1594            li          addrTemp, address
     1595            ldc1        dest, 0(addrTemp)
     1596        */
     1597        move(ImmPtr(address), addrTempRegister);
     1598        m_assembler.ldc1(dest, addrTempRegister, 0);
     1599#endif
     1600    }
     1601
     1602
    15491603    void storeDouble(FPRegisterID src, ImplicitAddress address)
    15501604    {
     
    16101664    }
    16111665
     1666    void divDouble(FPRegisterID src, FPRegisterID dest)
     1667    {
     1668        m_assembler.divd(dest, dest, src);
     1669    }
     1670
    16121671    void convertInt32ToDouble(RegisterID src, FPRegisterID dest)
    16131672    {
    16141673        m_assembler.mtc1(src, fpTempRegister);
     1674        m_assembler.cvtdw(dest, fpTempRegister);
     1675    }
     1676
     1677    void convertInt32ToDouble(Address src, FPRegisterID dest)
     1678    {
     1679        load32(src, dataTempRegister);
     1680        m_assembler.mtc1(dataTempRegister, fpTempRegister);
     1681        m_assembler.cvtdw(dest, fpTempRegister);
     1682    }
     1683
     1684    void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest)
     1685    {
     1686        load32(src.m_ptr, dataTempRegister);
     1687        m_assembler.mtc1(dataTempRegister, fpTempRegister);
    16151688        m_assembler.cvtdw(dest, fpTempRegister);
    16161689    }
     
    16681741        }
    16691742        if (cond == DoubleNotEqual) {
    1670             m_assembler.ceqd(left, right);
     1743            m_assembler.cueqd(left, right);
    16711744            return branchFalse(); // false
    16721745        }
     
    16901763            m_assembler.cueqd(left, right);
    16911764            return branchTrue();
     1765        }
     1766        if (cond == DoubleNotEqualOrUnordered) {
     1767            m_assembler.ceqd(left, right);
     1768            return branchFalse(); // false
    16921769        }
    16931770        if (cond == DoubleGreaterThanOrUnordered) {
     
    17231800    }
    17241801
     1802    // Convert 'src' to an integer, and places the resulting 'dest'.
     1803    // If the result is not representable as a 32 bit value, branch.
     1804    // May also branch for some values that are representable in 32 bits
     1805    // (specifically, in this case, 0).
     1806    void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID fpTemp)
     1807    {
     1808        m_assembler.cvtwd(fpTempRegister, src);
     1809        m_assembler.mfc1(dest, fpTempRegister);
     1810
     1811        // If the result is zero, it might have been -0.0, and the double comparison won't catch this!
     1812        failureCases.append(branch32(Equal, dest, MIPSRegisters::zero));
     1813
     1814        // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump.
     1815        convertInt32ToDouble(dest, fpTemp);
     1816        failureCases.append(branchDouble(DoubleNotEqualOrUnordered, fpTemp, src));
     1817    }
     1818
     1819    void zeroDouble(FPRegisterID dest)
     1820    {
     1821#if WTF_MIPS_ISA_REV(2) && WTF_MIPS_FP64
     1822        m_assembler.mtc1(MIPSRegisters::zero, dest);
     1823        m_assembler.mthc1(MIPSRegisters::zero, dest);
     1824#else
     1825        m_assembler.mtc1(MIPSRegisters::zero, dest);
     1826        m_assembler.mtc1(MIPSRegisters::zero, FPRegisterID(dest + 1));
     1827#endif
     1828    }
     1829
    17251830private:
    17261831    // If m_fixedWidth is true, we will generate a fixed number of instructions.
Note: See TracChangeset for help on using the changeset viewer.