Ignore:
Timestamp:
Jul 1, 2010, 3:56:58 PM (15 years ago)
Author:
[email protected]
Message:

Bug 41490 - Add missing operations to MacroAssemblerARMv7
Also, make single, double, quad register numbers in ARMv7Assembler distinct & strongly typed.

Reviewed by Oliver Hunt.

  • assembler/ARMv7Assembler.h:

(JSC::ARMRegisters::):
(JSC::ARMRegisters::asSingle):
(JSC::ARMRegisters::asDouble):
(JSC::VFPImmediate::VFPImmediate):
(JSC::VFPImmediate::isValid):
(JSC::VFPImmediate::value):
(JSC::ARMv7Assembler::singleRegisterMask):
(JSC::ARMv7Assembler::doubleRegisterMask):
(JSC::ARMv7Assembler::):
(JSC::ARMv7Assembler::add_S):
(JSC::ARMv7Assembler::neg):
(JSC::ARMv7Assembler::orr_S):
(JSC::ARMv7Assembler::sub):
(JSC::ARMv7Assembler::sub_S):
(JSC::ARMv7Assembler::vadd_F64):
(JSC::ARMv7Assembler::vcmp_F64):
(JSC::ARMv7Assembler::vcvt_F64_S32):
(JSC::ARMv7Assembler::vcvtr_S32_F64):
(JSC::ARMv7Assembler::vdiv_F64):
(JSC::ARMv7Assembler::vldr):
(JSC::ARMv7Assembler::vmov_F64_0):
(JSC::ARMv7Assembler::vmov):
(JSC::ARMv7Assembler::vmul_F64):
(JSC::ARMv7Assembler::vstr):
(JSC::ARMv7Assembler::vsub_F64):
(JSC::ARMv7Assembler::vcvt):
(JSC::ARMv7Assembler::vmem):

  • assembler/AbstractMacroAssembler.h:
  • assembler/MacroAssemblerARM.h:
  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::fpTempRegisterAsSingle):
(JSC::MacroAssemblerARMv7::neg32):
(JSC::MacroAssemblerARMv7::loadDouble):
(JSC::MacroAssemblerARMv7::divDouble):
(JSC::MacroAssemblerARMv7::convertInt32ToDouble):
(JSC::MacroAssemblerARMv7::branchConvertDoubleToInt32):
(JSC::MacroAssemblerARMv7::zeroDouble):
(JSC::MacroAssemblerARMv7::branchOr32):
(JSC::MacroAssemblerARMv7::set32):
(JSC::MacroAssemblerARMv7::set8):

  • assembler/MacroAssemblerMIPS.h:
  • assembler/MacroAssemblerX86Common.h:
File:
1 edited

Legend:

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

    r60577 r62306  
    3939    //        - dTR is likely used more than aTR, and we'll get better instruction
    4040    //        encoding if it's in the low 8 registers.
    41     static const ARMRegisters::RegisterID dataTempRegister = ARMRegisters::ip;
     41    static const RegisterID dataTempRegister = ARMRegisters::ip;
    4242    static const RegisterID addressTempRegister = ARMRegisters::r3;
    43     static const FPRegisterID fpTempRegister = ARMRegisters::d7;
    44 
     43
     44    static const ARMRegisters::FPDoubleRegisterID fpTempRegister = ARMRegisters::d7;
     45    inline ARMRegisters::FPSingleRegisterID fpTempRegisterAsSingle() { return ARMRegisters::asSingle(fpTempRegister); }
     46
     47public:
    4548    struct ArmAddress {
    4649        enum AddressType {
     
    7477   
    7578public:
     79    typedef ARMRegisters::FPDoubleRegisterID FPRegisterID;
    7680
    7781    static const Scale ScalePtr = TimesFour;
     
    223227    }
    224228
     229    void neg32(RegisterID srcDest)
     230    {
     231        m_assembler.neg(srcDest, srcDest);
     232    }
     233
    225234    void not32(RegisterID srcDest)
    226235    {
     
    541550    }
    542551
     552    void loadDouble(const void* address, FPRegisterID dest)
     553    {
     554        move(ImmPtr(address), addressTempRegister);
     555        m_assembler.vldr(dest, addressTempRegister, 0);
     556    }
     557
    543558    void storeDouble(FPRegisterID src, ImplicitAddress address)
    544559    {
     
    567582    }
    568583
     584    void divDouble(FPRegisterID src, FPRegisterID dest)
     585    {
     586        m_assembler.vdiv_F64(dest, dest, src);
     587    }
     588
    569589    void subDouble(FPRegisterID src, FPRegisterID dest)
    570590    {
     
    596616    void convertInt32ToDouble(RegisterID src, FPRegisterID dest)
    597617    {
    598         m_assembler.vmov(fpTempRegister, src);
    599         m_assembler.vcvt_F64_S32(dest, fpTempRegister);
     618        m_assembler.vmov(fpTempRegisterAsSingle(), src);
     619        m_assembler.vcvt_F64_S32(dest, fpTempRegisterAsSingle());
     620    }
     621
     622    void convertInt32ToDouble(Address address, FPRegisterID dest)
     623    {
     624        // Fixme: load directly into the fpr!
     625        load32(address, dataTempRegister);
     626        m_assembler.vmov(fpTempRegisterAsSingle(), dataTempRegister);
     627        m_assembler.vcvt_F64_S32(dest, fpTempRegisterAsSingle());
     628    }
     629
     630    void convertInt32ToDouble(AbsoluteAddress address, FPRegisterID dest)
     631    {
     632        // Fixme: load directly into the fpr!
     633        load32(address.m_ptr, dataTempRegister);
     634        m_assembler.vmov(fpTempRegisterAsSingle(), dataTempRegister);
     635        m_assembler.vcvt_F64_S32(dest, fpTempRegisterAsSingle());
    600636    }
    601637
     
    630666    }
    631667
     668    // Convert 'src' to an integer, and places the resulting 'dest'.
     669    // If the result is not representable as a 32 bit value, branch.
     670    // May also branch for some values that are representable in 32 bits
     671    // (specifically, in this case, 0).
     672    void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID)
     673    {
     674        m_assembler.vcvtr_S32_F64(fpTempRegisterAsSingle(), src);
     675        m_assembler.vmov(dest, fpTempRegisterAsSingle());
     676
     677        // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump.
     678        m_assembler.vcvt_F64_S32(fpTempRegister, fpTempRegisterAsSingle());
     679        failureCases.append(branchDouble(DoubleNotEqualOrUnordered, src, fpTempRegister));
     680
     681        // If the result is zero, it might have been -0.0, and the double comparison won't catch this!
     682        failureCases.append(branchTest32(Zero, dest));
     683    }
     684
     685    void zeroDouble(FPRegisterID dest)
     686    {
     687        m_assembler.vmov_F64_0(dest);
     688    }
    632689
    633690    // Stack manipulation operations:
     
    9711028    }
    9721029
     1030    Jump branchOr32(Condition cond, RegisterID src, RegisterID dest)
     1031    {
     1032        ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero));
     1033        m_assembler.orr_S(dest, dest, src);
     1034        return Jump(makeBranch(cond));
     1035    }
     1036
    9731037    Jump branchSub32(Condition cond, RegisterID src, RegisterID dest)
    9741038    {
     
    10351099    }
    10361100
     1101    void set32(Condition cond, Address left, RegisterID right, RegisterID dest)
     1102    {
     1103        load32(left, dataTempRegister);
     1104        set32(cond, dataTempRegister, right, dest);
     1105    }
     1106
    10371107    void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
    10381108    {
     
    10411111        m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1));
    10421112        m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0));
     1113    }
     1114
     1115    void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest)
     1116    {
     1117        set32(cond, left, right, dest);
     1118    }
     1119
     1120    void set8(Condition cond, Address left, RegisterID right, RegisterID dest)
     1121    {
     1122        set32(cond, left, right, dest);
     1123    }
     1124
     1125    void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
     1126    {
     1127        set32(cond, left, right, dest);
    10431128    }
    10441129
Note: See TracChangeset for help on using the changeset viewer.