Ignore:
Timestamp:
Apr 30, 2010, 12:56:38 AM (15 years ago)
Author:
[email protected]
Message:

2010-04-29 Oliver Hunt <[email protected]>

Reviewed by Gavin Barraclough.

Add codegen support for unsigned right shift
https://bugs.webkit.org/show_bug.cgi?id=38375

Expose unsigned right shift in the macro assembler, and make use of it
from the jit. Currently if the result is outside the range 0..231-1
we simply fall back to the slow case, even in JSVALUE64 and JSVALUE32_64
where technically we could still return an immediate value.

  • assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::urshift32):
  • assembler/MacroAssemblerARMv7.h: (JSC::MacroAssemblerARMv7::urshift32):
  • assembler/MacroAssemblerX86Common.h: (JSC::MacroAssemblerX86Common::urshift32):
  • assembler/X86Assembler.h: (JSC::X86Assembler::): (JSC::X86Assembler::shrl_i8r): (JSC::X86Assembler::shrl_CLr):

Add unsigned right shift to the x86 assembler

  • jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases):

op_rshift no longer simply get thrown to a stub function

  • jit/JIT.h:
  • jit/JITArithmetic.cpp: (JSC::JIT::emit_op_urshift): (JSC::JIT::emitSlow_op_urshift): JSVALUE32 and JSVALUE64 implementation. Only supports double lhs in JSVALUE64.
  • jit/JITArithmetic32_64.cpp: (JSC::JIT::emit_op_rshift): (JSC::JIT::emitSlow_op_rshift): (JSC::JIT::emit_op_urshift): (JSC::JIT::emitSlow_op_urshift): Refactor right shift code to have shared implementation between signed and unsigned versions.
File:
1 edited

Legend:

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

    r58515 r58562  
    178178    {
    179179        m_assembler.movs_r(dest, m_assembler.asr(dest, imm.m_value & 0x1f));
     180    }
     181   
     182    void urshift32(RegisterID shift_amount, RegisterID dest)
     183    {
     184        ARMWord w = ARMAssembler::getOp2(0x1f);
     185        ASSERT(w != ARMAssembler::INVALID_IMM);
     186        m_assembler.and_r(ARMRegisters::S0, shift_amount, w);
     187       
     188        m_assembler.movs_r(dest, m_assembler.lsr_r(dest, ARMRegisters::S0));
     189    }
     190   
     191    void urshift32(Imm32 imm, RegisterID dest)
     192    {
     193        m_assembler.movs_r(dest, m_assembler.lsr(dest, imm.m_value & 0x1f));
    180194    }
    181195
Note: See TracChangeset for help on using the changeset viewer.