Changeset 44526 in webkit for trunk/JavaScriptCore/assembler


Ignore:
Timestamp:
Jun 9, 2009, 1:14:09 AM (16 years ago)
Author:
[email protected]
Message:

2009-06-09 Gavin Barraclough <[email protected]>

Reviewed by Geoff Garen.

Enable JIT_OPTIMIZE_ARITHMETIC on ARMv7 platforms.

Temporarily split support for 'branchTruncateDoubleToInt32' onto its own switch
('supportsFloatingPointTruncate'). See comment in MacroAssemblerARMv7, we need
to work out wherther we are going to be able to support the current interface on
all platforms, or whether this should be refactored.

  • assembler/MacroAssemblerARMv7.h: (JSC::MacroAssemblerARMv7::supportsFloatingPoint):

Add implementation of supportsFloatingPointTruncate (returns true).

(JSC::MacroAssemblerARMv7::supportsFloatingPointTruncate):

Add implementation of supportsFloatingPointTruncate (returns false).

(JSC::MacroAssemblerARMv7::loadDouble):
(JSC::MacroAssemblerARMv7::storeDouble):
(JSC::MacroAssemblerARMv7::addDouble):
(JSC::MacroAssemblerARMv7::subDouble):
(JSC::MacroAssemblerARMv7::mulDouble):
(JSC::MacroAssemblerARMv7::convertInt32ToDouble):
(JSC::MacroAssemblerARMv7::branchDouble):

Implement FP code genertion operations.

  • assembler/MacroAssemblerX86.h: (JSC::MacroAssemblerX86::supportsFloatingPointTruncate):

Add implementation of supportsFloatingPointTruncate (returns true).

  • assembler/MacroAssemblerX86_64.h: (JSC::MacroAssemblerX86_64::supportsFloatingPointTruncate):

Add implementation of supportsFloatingPointTruncate (returns true).

  • jit/JITArithmetic.cpp: (JSC::JIT::emit_op_rshift):

Changed to call supportsFloatingPointTruncate().

(JSC::JIT::emitSlow_op_rshift):

Changed to call supportsFloatingPointTruncate().

  • wtf/Platform.h:

Change to enable JIT_OPTIMIZE_ARITHMETIC.

Location:
trunk/JavaScriptCore/assembler
Files:
3 edited

Legend:

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

    r44525 r44526  
    440440    // Floating-point operations:
    441441
    442     bool supportsFloatingPoint() const { return false; }
    443 
    444     void loadDouble(ImplicitAddress, FPRegisterID)
    445     {
    446         ASSERT_NOT_REACHED();
    447     }
    448 
    449     void storeDouble(FPRegisterID, ImplicitAddress)
    450     {
    451         ASSERT_NOT_REACHED();
    452     }
    453 
    454     void addDouble(FPRegisterID, FPRegisterID)
    455     {
    456         ASSERT_NOT_REACHED();
    457     }
    458 
    459     void addDouble(Address, FPRegisterID)
    460     {
    461         ASSERT_NOT_REACHED();
    462     }
    463 
    464     void subDouble(FPRegisterID, FPRegisterID)
    465     {
    466         ASSERT_NOT_REACHED();
    467     }
    468 
    469     void subDouble(Address, FPRegisterID)
    470     {
    471         ASSERT_NOT_REACHED();
    472     }
    473 
    474     void mulDouble(FPRegisterID, FPRegisterID)
    475     {
    476         ASSERT_NOT_REACHED();
    477     }
    478 
    479     void mulDouble(Address, FPRegisterID)
    480     {
    481         ASSERT_NOT_REACHED();
    482     }
    483 
    484     void convertInt32ToDouble(RegisterID, FPRegisterID)
    485     {
    486         ASSERT_NOT_REACHED();
    487     }
    488 
    489     Jump branchDouble(DoubleCondition, FPRegisterID, FPRegisterID)
    490     {
    491         ASSERT_NOT_REACHED();
     442    bool supportsFloatingPoint() const { return true; }
     443    // On x86(_64) the MacroAssembler provides an interface to truncate a double to an integer.
     444    // If a value is not representable as an integer, and possibly for some values that are,
     445    // (on x86 INT_MIN, since this is indistinguishable from results for out-of-range/NaN input)
     446    // a branch will  be taken.  It is not clear whether this interface will be well suited to
     447    // other platforms.  On ARMv7 the hardware truncation operation produces multiple possible
     448    // failure values (saturates to INT_MIN & INT_MAX, NaN reulsts in a value of 0).  This is a
     449    // temporary solution while we work out what this interface should be.  Either we need to
     450    // decide to make this interface work on all platforms, rework the interface to make it more
     451    // generic, or decide that the MacroAssembler cannot practically be used to abstracted these
     452    // operations, and make clients go directly to the m_assembler to plant truncation instructions.
     453    // In short, FIXME:.
     454    bool supportsFloatingPointTruncate() const { return false; }
     455
     456    void loadDouble(ImplicitAddress address, FPRegisterID dest)
     457    {
     458        RegisterID base = address.base;
     459        int32_t offset = address.offset;
     460
     461        // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2.
     462        if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) {
     463            add32(Imm32(offset), base, addressTempRegister);
     464            base = addressTempRegister;
     465            offset = 0;
     466        }
     467       
     468        m_assembler.vldr(dest, base, offset);
     469    }
     470
     471    void storeDouble(FPRegisterID src, ImplicitAddress address)
     472    {
     473        RegisterID base = address.base;
     474        int32_t offset = address.offset;
     475
     476        // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2.
     477        if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) {
     478            add32(Imm32(offset), base, addressTempRegister);
     479            base = addressTempRegister;
     480            offset = 0;
     481        }
     482       
     483        m_assembler.vstr(src, base, offset);
     484    }
     485
     486    void addDouble(FPRegisterID src, FPRegisterID dest)
     487    {
     488        m_assembler.vadd_F64(dest, dest, src);
     489    }
     490
     491    void addDouble(Address src, FPRegisterID dest)
     492    {
     493        loadDouble(src, fpTempRegister);
     494        addDouble(fpTempRegister, dest);
     495    }
     496
     497    void subDouble(FPRegisterID src, FPRegisterID dest)
     498    {
     499        m_assembler.vsub_F64(dest, dest, src);
     500    }
     501
     502    void subDouble(Address src, FPRegisterID dest)
     503    {
     504        loadDouble(src, fpTempRegister);
     505        subDouble(fpTempRegister, dest);
     506    }
     507
     508    void mulDouble(FPRegisterID src, FPRegisterID dest)
     509    {
     510        m_assembler.vmul_F64(dest, dest, src);
     511    }
     512
     513    void mulDouble(Address src, FPRegisterID dest)
     514    {
     515        loadDouble(src, fpTempRegister);
     516        mulDouble(fpTempRegister, dest);
     517    }
     518
     519    void convertInt32ToDouble(RegisterID src, FPRegisterID dest)
     520    {
     521        m_assembler.vmov(fpTempRegister, src);
     522        m_assembler.vcvt_F64_S32(dest, fpTempRegister);
     523    }
     524
     525    Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right)
     526    {
     527        m_assembler.vcmp_F64(left, right);
     528        m_assembler.vmrs_APSR_nzcv_FPSCR();
     529        return makeBranch(cond);
    492530    }
    493531
  • trunk/JavaScriptCore/assembler/MacroAssemblerX86.h

    r44525 r44526  
    160160
    161161    bool supportsFloatingPoint() const { return m_isSSE2Present; }
     162    // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate()
     163    bool supportsFloatingPointTruncate() const { return m_isSSE2Present; }
    162164
    163165private:
  • trunk/JavaScriptCore/assembler/MacroAssemblerX86_64.h

    r44525 r44526  
    445445
    446446    bool supportsFloatingPoint() const { return true; }
     447    // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate()
     448    bool supportsFloatingPointTruncate() const { return true; }
    447449};
    448450
Note: See TracChangeset for help on using the changeset viewer.