Ignore:
Timestamp:
Jul 30, 2009, 1:57:44 PM (16 years ago)
Author:
[email protected]
Message:

Merged nitro-extreme branch into trunk.

File:
1 edited

Legend:

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

    r44461 r46598  
    5858    enum DoubleCondition {
    5959        DoubleEqual = X86Assembler::ConditionE,
     60        DoubleNotEqual = X86Assembler::ConditionNE,
    6061        DoubleGreaterThan = X86Assembler::ConditionA,
    6162        DoubleGreaterThanOrEqual = X86Assembler::ConditionAE,
     
    9293        m_assembler.addl_mr(src.offset, src.base, dest);
    9394    }
     95
     96    void add32(RegisterID src, Address dest)
     97    {
     98        m_assembler.addl_rm(src, dest.offset, dest.base);
     99    }
    94100   
    95101    void and32(RegisterID src, RegisterID dest)
     
    101107    {
    102108        m_assembler.andl_ir(imm.m_value, dest);
     109    }
     110
     111    void and32(RegisterID src, Address dest)
     112    {
     113        m_assembler.andl_rm(src, dest.offset, dest.base);
     114    }
     115
     116    void and32(Address src, RegisterID dest)
     117    {
     118        m_assembler.andl_mr(src.offset, src.base, dest);
    103119    }
    104120
     
    139155        m_assembler.imull_rr(src, dest);
    140156    }
     157
     158    void mul32(Address src, RegisterID dest)
     159    {
     160        m_assembler.imull_mr(src.offset, src.base, dest);
     161    }
    141162   
    142163    void mul32(Imm32 imm, RegisterID src, RegisterID dest)
     
    144165        m_assembler.imull_i32r(src, imm.m_value, dest);
    145166    }
    146    
     167
     168    void neg32(RegisterID srcDest)
     169    {
     170        m_assembler.negl_r(srcDest);
     171    }
     172
     173    void neg32(Address srcDest)
     174    {
     175        m_assembler.negl_m(srcDest.offset, srcDest.base);
     176    }
     177
    147178    void not32(RegisterID srcDest)
    148179    {
    149180        m_assembler.notl_r(srcDest);
    150181    }
     182
     183    void not32(Address srcDest)
     184    {
     185        m_assembler.notl_m(srcDest.offset, srcDest.base);
     186    }
    151187   
    152188    void or32(RegisterID src, RegisterID dest)
     
    158194    {
    159195        m_assembler.orl_ir(imm.m_value, dest);
     196    }
     197
     198    void or32(RegisterID src, Address dest)
     199    {
     200        m_assembler.orl_rm(src, dest.offset, dest.base);
     201    }
     202
     203    void or32(Address src, RegisterID dest)
     204    {
     205        m_assembler.orl_mr(src.offset, src.base, dest);
    160206    }
    161207
     
    212258    }
    213259
     260    void sub32(RegisterID src, Address dest)
     261    {
     262        m_assembler.subl_rm(src, dest.offset, dest.base);
     263    }
     264
     265
    214266    void xor32(RegisterID src, RegisterID dest)
    215267    {
     
    217269    }
    218270
    219     void xor32(Imm32 imm, RegisterID srcDest)
    220     {
    221         m_assembler.xorl_ir(imm.m_value, srcDest);
     271    void xor32(Imm32 imm, Address dest)
     272    {
     273        m_assembler.xorl_im(imm.m_value, dest.offset, dest.base);
     274    }
     275
     276    void xor32(Imm32 imm, RegisterID dest)
     277    {
     278        m_assembler.xorl_ir(imm.m_value, dest);
     279    }
     280
     281    void xor32(RegisterID src, Address dest)
     282    {
     283        m_assembler.xorl_rm(src, dest.offset, dest.base);
     284    }
     285
     286    void xor32(Address src, RegisterID dest)
     287    {
     288        m_assembler.xorl_mr(src.offset, src.base, dest);
    222289    }
    223290   
     
    301368    }
    302369
     370    void divDouble(FPRegisterID src, FPRegisterID dest)
     371    {
     372        ASSERT(isSSE2Present());
     373        m_assembler.divsd_rr(src, dest);
     374    }
     375
     376    void divDouble(Address src, FPRegisterID dest)
     377    {
     378        ASSERT(isSSE2Present());
     379        m_assembler.divsd_mr(src.offset, src.base, dest);
     380    }
     381
    303382    void subDouble(FPRegisterID src, FPRegisterID dest)
    304383    {
     
    331410    }
    332411
     412    void convertInt32ToDouble(Address src, FPRegisterID dest)
     413    {
     414        m_assembler.cvtsi2sd_mr(src.offset, src.base, dest);
     415    }
     416
    333417    Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right)
    334418    {
    335419        ASSERT(isSSE2Present());
    336420        m_assembler.ucomisd_rr(right, left);
     421        return Jump(m_assembler.jCC(x86Condition(cond)));
     422    }
     423
     424    Jump branchDouble(DoubleCondition cond, FPRegisterID left, Address right)
     425    {
     426        m_assembler.ucomisd_mr(right.offset, right.base, left);
    337427        return Jump(m_assembler.jCC(x86Condition(cond)));
    338428    }
     
    347437        m_assembler.cvttsd2si_rr(src, dest);
    348438        return branch32(Equal, dest, Imm32(0x80000000));
     439    }
     440
     441    void zeroDouble(FPRegisterID srcDest)
     442    {
     443        ASSERT(isSSE2Present());
     444        m_assembler.xorpd_rr(srcDest, srcDest);
    349445    }
    350446
     
    398494        // Note: on 64-bit this is is a full register move; perhaps it would be
    399495        // useful to have separate move32 & movePtr, with move32 zero extending?
    400         m_assembler.movq_rr(src, dest);
     496        if (src != dest)
     497            m_assembler.movq_rr(src, dest);
    401498    }
    402499
     
    606703    }
    607704   
     705    Jump branchAdd32(Condition cond, Imm32 src, Address dest)
     706    {
     707        ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero));
     708        add32(src, dest);
     709        return Jump(m_assembler.jCC(x86Condition(cond)));
     710    }
     711
     712    Jump branchAdd32(Condition cond, RegisterID src, Address dest)
     713    {
     714        ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero));
     715        add32(src, dest);
     716        return Jump(m_assembler.jCC(x86Condition(cond)));
     717    }
     718
     719    Jump branchAdd32(Condition cond, Address src, RegisterID dest)
     720    {
     721        ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero));
     722        add32(src, dest);
     723        return Jump(m_assembler.jCC(x86Condition(cond)));
     724    }
     725
    608726    Jump branchMul32(Condition cond, RegisterID src, RegisterID dest)
    609727    {
     
    612730        return Jump(m_assembler.jCC(x86Condition(cond)));
    613731    }
     732
     733    Jump branchMul32(Condition cond, Address src, RegisterID dest)
     734    {
     735        ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero));
     736        mul32(src, dest);
     737        return Jump(m_assembler.jCC(x86Condition(cond)));
     738    }
    614739   
    615740    Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest)
     
    633758        return Jump(m_assembler.jCC(x86Condition(cond)));
    634759    }
    635    
     760
     761    Jump branchSub32(Condition cond, Imm32 imm, Address dest)
     762    {
     763        ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero));
     764        sub32(imm, dest);
     765        return Jump(m_assembler.jCC(x86Condition(cond)));
     766    }
     767
     768    Jump branchSub32(Condition cond, RegisterID src, Address dest)
     769    {
     770        ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero));
     771        sub32(src, dest);
     772        return Jump(m_assembler.jCC(x86Condition(cond)));
     773    }
     774
     775    Jump branchSub32(Condition cond, Address src, RegisterID dest)
     776    {
     777        ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero));
     778        sub32(src, dest);
     779        return Jump(m_assembler.jCC(x86Condition(cond)));
     780    }
     781
     782    Jump branchOr32(Condition cond, RegisterID src, RegisterID dest)
     783    {
     784        ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero));
     785        or32(src, dest);
     786        return Jump(m_assembler.jCC(x86Condition(cond)));
     787    }
     788
    636789
    637790    // Miscellaneous operations:
     
    660813    {
    661814        m_assembler.ret();
     815    }
     816
     817    void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest)
     818    {
     819        m_assembler.cmpl_rr(right, left);
     820        m_assembler.setCC_r(x86Condition(cond), dest);
     821    }
     822
     823    void set8(Condition cond, Address left, RegisterID right, RegisterID dest)
     824    {
     825        m_assembler.cmpl_mr(left.offset, left.base, right);
     826        m_assembler.setCC_r(x86Condition(cond), dest);
     827    }
     828
     829    void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
     830    {
     831        if (((cond == Equal) || (cond == NotEqual)) && !right.m_value)
     832            m_assembler.testl_rr(left, left);
     833        else
     834            m_assembler.cmpl_ir(right.m_value, left);
     835        m_assembler.setCC_r(x86Condition(cond), dest);
    662836    }
    663837
     
    683857    // dest-src, operations always have a dest? ... possibly not true, considering
    684858    // asm ops like test, or pseudo ops like pop().
     859
     860    void setTest8(Condition cond, Address address, Imm32 mask, RegisterID dest)
     861    {
     862        if (mask.m_value == -1)
     863            m_assembler.cmpl_im(0, address.offset, address.base);
     864        else
     865            m_assembler.testl_i32m(mask.m_value, address.offset, address.base);
     866        m_assembler.setCC_r(x86Condition(cond), dest);
     867    }
     868
    685869    void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest)
    686870    {
Note: See TracChangeset for help on using the changeset viewer.