Changeset 50981 in webkit for trunk/JavaScriptCore/assembler


Ignore:
Timestamp:
Nov 13, 2009, 4:44:42 PM (16 years ago)
Author:
[email protected]
Message:

https://bugs.webkit.org/show_bug.cgi?id=31050

Patch by Zoltan Herczeg <[email protected]> on 2009-11-14
Reviewed by Gavin Barraclough.

Adding JSVALUE32_64 support for ARM (but not turning it
on by default). All optimizations must be disabled, since
this patch is only the first of a series of patches.

During the work, a lot of x86 specific code revealed and
made platform independent.
See revisions: 50531 50541 50593 50594 50595

  • assembler/ARMAssembler.h:

(JSC::ARMAssembler::):
(JSC::ARMAssembler::fdivd_r):

  • assembler/MacroAssemblerARM.h:

(JSC::MacroAssemblerARM::lshift32):
(JSC::MacroAssemblerARM::neg32):
(JSC::MacroAssemblerARM::rshift32):
(JSC::MacroAssemblerARM::branchOr32):
(JSC::MacroAssemblerARM::set8):
(JSC::MacroAssemblerARM::setTest8):
(JSC::MacroAssemblerARM::loadDouble):
(JSC::MacroAssemblerARM::divDouble):
(JSC::MacroAssemblerARM::convertInt32ToDouble):
(JSC::MacroAssemblerARM::zeroDouble):

  • jit/JIT.cpp:
  • jit/JIT.h:
  • jit/JITOpcodes.cpp:

(JSC::JIT::privateCompileCTIMachineTrampolines):

  • jit/JITStubs.cpp:
  • wtf/StdLibExtras.h:
Location:
trunk/JavaScriptCore/assembler
Files:
2 edited

Legend:

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

    r50593 r50981  
    122122            MULL = 0x00c00090,
    123123            FADDD = 0x0e300b00,
     124            FDIVD = 0x0e800b00,
    124125            FSUBD = 0x0e300b40,
    125126            FMULD = 0x0e200b00,
     
    401402        }
    402403
     404        void fdivd_r(int dd, int dn, int dm, Condition cc = AL)
     405        {
     406            emitInst(static_cast<ARMWord>(cc) | FDIVD, dd, dn, dm);
     407        }
     408
    403409        void fsubd_r(int dd, int dn, int dm, Condition cc = AL)
    404410        {
  • trunk/JavaScriptCore/assembler/MacroAssemblerARM.h

    r50595 r50981  
    121121    void lshift32(RegisterID shift_amount, RegisterID dest)
    122122    {
    123         ARMWord w = m_assembler.getImm(0x1f, ARMRegisters::S0, true);
    124         ASSERT(!(w & ARMAssembler::OP2_INV_IMM));
    125         m_assembler.ands_r(ARMRegisters::S0, shift_amount, w);
     123        ARMWord w = ARMAssembler::getOp2(0x1f);
     124        ASSERT(w != ARMAssembler::INVALID_IMM);
     125        m_assembler.and_r(ARMRegisters::S0, shift_amount, w);
    126126
    127127        m_assembler.movs_r(dest, m_assembler.lsl_r(dest, ARMRegisters::S0));
     
    148148    }
    149149
     150    void neg32(RegisterID srcDest)
     151    {
     152        m_assembler.rsbs_r(srcDest, srcDest, ARMAssembler::getOp2(0));
     153    }
     154
    150155    void not32(RegisterID dest)
    151156    {
     
    165170    void rshift32(RegisterID shift_amount, RegisterID dest)
    166171    {
    167         ARMWord w = m_assembler.getImm(0x1f, ARMRegisters::S0, true);
    168         ASSERT(!(w & ARMAssembler::OP2_INV_IMM));
    169         m_assembler.ands_r(ARMRegisters::S0, shift_amount, w);
     172        ARMWord w = ARMAssembler::getOp2(0x1f);
     173        ASSERT(w != ARMAssembler::INVALID_IMM);
     174        m_assembler.and_r(ARMRegisters::S0, shift_amount, w);
    170175
    171176        m_assembler.movs_r(dest, m_assembler.asr_r(dest, ARMRegisters::S0));
     
    526531    }
    527532
     533    Jump branchOr32(Condition cond, RegisterID src, RegisterID dest)
     534    {
     535        ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero));
     536        or32(src, dest);
     537        return Jump(m_assembler.jmp(ARMCondition(cond)));
     538    }
     539
    528540    void breakpoint()
    529541    {
     
    567579        m_assembler.mov_r(dest, ARMAssembler::getOp2(0));
    568580        m_assembler.mov_r(dest, ARMAssembler::getOp2(1), ARMCondition(cond));
     581    }
     582
     583    void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest)
     584    {
     585        // ARM doesn't have byte registers
     586        set32(cond, left, right, dest);
     587    }
     588
     589    void set8(Condition cond, Address left, RegisterID right, RegisterID dest)
     590    {
     591        // ARM doesn't have byte registers
     592        load32(left, ARMRegisters::S1);
     593        set32(cond, ARMRegisters::S1, right, dest);
     594    }
     595
     596    void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
     597    {
     598        // ARM doesn't have byte registers
     599        set32(cond, left, right, dest);
    569600    }
    570601
     
    580611    }
    581612
     613    void setTest8(Condition cond, Address address, Imm32 mask, RegisterID dest)
     614    {
     615        // ARM doesn't have byte registers
     616        setTest32(cond, address, mask, dest);
     617    }
     618
    582619    void add32(Imm32 imm, RegisterID src, RegisterID dest)
    583620    {
     
    687724    }
    688725
     726    void loadDouble(void* address, FPRegisterID dest)
     727    {
     728        m_assembler.ldr_un_imm(ARMRegisters::S0, (ARMWord)address);
     729        m_assembler.fdtr_u(true, dest, ARMRegisters::S0, 0);
     730    }
     731
    689732    void storeDouble(FPRegisterID src, ImplicitAddress address)
    690733    {
     
    703746    }
    704747
     748    void divDouble(FPRegisterID src, FPRegisterID dest)
     749    {
     750        m_assembler.fdivd_r(dest, dest, src);
     751    }
     752
     753    void divDouble(Address src, FPRegisterID dest)
     754    {
     755        ASSERT_NOT_REACHED(); // Untested
     756        loadDouble(src, ARMRegisters::SD0);
     757        divDouble(ARMRegisters::SD0, dest);
     758    }
     759
    705760    void subDouble(FPRegisterID src, FPRegisterID dest)
    706761    {
     
    729784        m_assembler.fmsr_r(dest, src);
    730785        m_assembler.fsitod_r(dest, dest);
     786    }
     787
     788    void convertInt32ToDouble(Address src, FPRegisterID dest)
     789    {
     790        ASSERT_NOT_REACHED(); // Untested
     791        // flds does not worth the effort here
     792        load32(src, ARMRegisters::S1);
     793        convertInt32ToDouble(ARMRegisters::S1, dest);
     794    }
     795
     796    void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest)
     797    {
     798        ASSERT_NOT_REACHED(); // Untested
     799        // flds does not worth the effort here
     800        m_assembler.ldr_un_imm(ARMRegisters::S1, (ARMWord)src.m_ptr);
     801        m_assembler.dtr_u(true, ARMRegisters::S1, ARMRegisters::S1, 0);
     802        convertInt32ToDouble(ARMRegisters::S1, dest);
    731803    }
    732804
     
    767839        // If the result is zero, it might have been -0.0, and 0.0 equals to -0.0
    768840        failureCases.append(branchTest32(Zero, dest));
     841    }
     842
     843    void zeroDouble(FPRegisterID srcDest)
     844    {
     845        m_assembler.mov_r(ARMRegisters::S0, ARMAssembler::getOp2(0));
     846        convertInt32ToDouble(ARMRegisters::S0, srcDest);
    769847    }
    770848
Note: See TracChangeset for help on using the changeset viewer.