Ignore:
Timestamp:
Apr 26, 2012, 2:21:56 PM (13 years ago)
Author:
[email protected]
Message:

DFG ARMv7 backend should optimize Float32 arrays
https://bugs.webkit.org/show_bug.cgi?id=85000
<rdar://problem/10652827>

Reviewed by Gavin Barraclough.

  • assembler/ARMv7Assembler.h:

(ARMv7Assembler):
(JSC::ARMv7Assembler::flds):
(JSC::ARMv7Assembler::fsts):
(JSC::ARMv7Assembler::vcvtds):
(JSC::ARMv7Assembler::vcvtsd):

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::loadFloat):
(MacroAssemblerARMv7):
(JSC::MacroAssemblerARMv7::storeFloat):
(JSC::MacroAssemblerARMv7::convertFloatToDouble):
(JSC::MacroAssemblerARMv7::convertDoubleToFloat):

  • bytecode/PredictedType.h:

(JSC::isActionableFloatMutableArrayPrediction):

  • dfg/DFGNode.h:

(JSC::DFG::Node::shouldSpeculateFloat32Array):

File:
1 edited

Legend:

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

    r115141 r115363  
    771771    }
    772772
    773     void loadDouble(BaseIndex address, FPRegisterID dest)
    774     {
    775         move(address.index, addressTempRegister);
    776         lshift32(TrustedImm32(address.scale), addressTempRegister);
    777         add32(address.base, addressTempRegister);
    778         loadDouble(Address(addressTempRegister, address.offset), dest);
    779     }
    780    
    781     void loadFloat(BaseIndex address, FPRegisterID dest)
    782     {
    783         UNUSED_PARAM(address);
    784         UNUSED_PARAM(dest);
    785         unreachableForPlatform();
    786     }
    787 
    788     void moveDouble(FPRegisterID src, FPRegisterID dest)
    789     {
    790         if (src != dest)
    791             m_assembler.vmov(dest, src);
    792     }
    793 
    794     void loadDouble(const void* address, FPRegisterID dest)
    795     {
    796         move(TrustedImmPtr(address), addressTempRegister);
    797         m_assembler.vldr(dest, addressTempRegister, 0);
    798     }
    799 
    800     void storeDouble(FPRegisterID src, ImplicitAddress address)
     773    void loadFloat(ImplicitAddress address, FPRegisterID dest)
    801774    {
    802775        RegisterID base = address.base;
     
    810783        }
    811784       
     785        m_assembler.flds(ARMRegisters::asSingle(dest), base, offset);
     786    }
     787
     788    void loadDouble(BaseIndex address, FPRegisterID dest)
     789    {
     790        move(address.index, addressTempRegister);
     791        lshift32(TrustedImm32(address.scale), addressTempRegister);
     792        add32(address.base, addressTempRegister);
     793        loadDouble(Address(addressTempRegister, address.offset), dest);
     794    }
     795   
     796    void loadFloat(BaseIndex address, FPRegisterID dest)
     797    {
     798        move(address.index, addressTempRegister);
     799        lshift32(TrustedImm32(address.scale), addressTempRegister);
     800        add32(address.base, addressTempRegister);
     801        loadFloat(Address(addressTempRegister, address.offset), dest);
     802    }
     803
     804    void moveDouble(FPRegisterID src, FPRegisterID dest)
     805    {
     806        if (src != dest)
     807            m_assembler.vmov(dest, src);
     808    }
     809
     810    void loadDouble(const void* address, FPRegisterID dest)
     811    {
     812        move(TrustedImmPtr(address), addressTempRegister);
     813        m_assembler.vldr(dest, addressTempRegister, 0);
     814    }
     815
     816    void storeDouble(FPRegisterID src, ImplicitAddress address)
     817    {
     818        RegisterID base = address.base;
     819        int32_t offset = address.offset;
     820
     821        // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2.
     822        if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) {
     823            add32(TrustedImm32(offset), base, addressTempRegister);
     824            base = addressTempRegister;
     825            offset = 0;
     826        }
     827       
    812828        m_assembler.vstr(src, base, offset);
     829    }
     830
     831    void storeFloat(FPRegisterID src, ImplicitAddress address)
     832    {
     833        RegisterID base = address.base;
     834        int32_t offset = address.offset;
     835
     836        // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2.
     837        if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) {
     838            add32(TrustedImm32(offset), base, addressTempRegister);
     839            base = addressTempRegister;
     840            offset = 0;
     841        }
     842       
     843        m_assembler.fsts(ARMRegisters::asSingle(src), base, offset);
    813844    }
    814845
     
    830861    {
    831862        move(address.index, addressTempRegister);
    832         mul32(TrustedImm32(1 << address.scale), addressTempRegister, addressTempRegister);
     863        lshift32(TrustedImm32(address.scale), addressTempRegister);
    833864        add32(address.base, addressTempRegister);
    834         storeDouble(src, Address(addressTempRegister, address.offset));
    835     }
    836 
     865        storeFloat(src, Address(addressTempRegister, address.offset));
     866    }
     867   
    837868    void addDouble(FPRegisterID src, FPRegisterID dest)
    838869    {
     
    938969    void convertFloatToDouble(FPRegisterID src, FPRegisterID dst)
    939970    {
    940         UNUSED_PARAM(src);
    941         UNUSED_PARAM(dst);
    942         unreachableForPlatform();
     971        m_assembler.vcvtds(dst, ARMRegisters::asSingle(src));
    943972    }
    944973   
    945974    void convertDoubleToFloat(FPRegisterID src, FPRegisterID dst)
    946975    {
    947         UNUSED_PARAM(src);
    948         UNUSED_PARAM(dst);
    949         unreachableForPlatform();
     976        m_assembler.vcvtsd(ARMRegisters::asSingle(dst), src);
    950977    }
    951978
Note: See TracChangeset for help on using the changeset viewer.