Ignore:
Timestamp:
Nov 6, 2009, 1:35:03 AM (16 years ago)
Author:
[email protected]
Message:

Tidy up the shift methods on the macro-assembler interface.

Patch by Gavin Barraclough <[email protected]> on 2009-11-06
Reviewed by Oliver Hunt.

Currently behaviour of shifts of a magnitude > 0x1f is undefined.
Instead defined that all shifts are masked to this range. This makes a lot of
practical sense, both since having undefined behaviour is not particularly
desirable, and because this behaviour is commonly required (particularly since
it is required bt ECMA-262 for shifts).

Update the ARM assemblers to provide this behaviour. Remove (now) redundant
masks from JITArithmetic, and remove rshiftPtr (this was used in case that
could be rewritten in a simpler form using rshift32, only optimized JSVALUE32
on x86-64, which uses JSVALUE64!)

  • assembler/MacroAssembler.h:
  • assembler/MacroAssemblerARM.h:

(JSC::MacroAssemblerARM::lshift32):
(JSC::MacroAssemblerARM::rshift32):

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::lshift32):
(JSC::MacroAssemblerARMv7::rshift32):

  • assembler/MacroAssemblerX86_64.h:
  • jit/JITArithmetic.cpp:

(JSC::JIT::emit_op_lshift):
(JSC::JIT::emit_op_rshift):

File:
1 edited

Legend:

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

    r50593 r50595  
    119119    }
    120120
     121    void lshift32(RegisterID shift_amount, RegisterID dest)
     122    {
     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);
     126
     127        m_assembler.movs_r(dest, m_assembler.lsl_r(dest, ARMRegisters::S0));
     128    }
     129
    121130    void lshift32(Imm32 imm, RegisterID dest)
    122131    {
    123132        m_assembler.movs_r(dest, m_assembler.lsl(dest, imm.m_value & 0x1f));
    124     }
    125 
    126     void lshift32(RegisterID shift_amount, RegisterID dest)
    127     {
    128         m_assembler.movs_r(dest, m_assembler.lsl_r(dest, shift_amount));
    129133    }
    130134
     
    161165    void rshift32(RegisterID shift_amount, RegisterID dest)
    162166    {
    163         m_assembler.movs_r(dest, m_assembler.asr_r(dest, shift_amount));
     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);
     170
     171        m_assembler.movs_r(dest, m_assembler.asr_r(dest, ARMRegisters::S0));
    164172    }
    165173
Note: See TracChangeset for help on using the changeset viewer.