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/MacroAssemblerX86Common.h

    r58469 r58562  
    249249    {
    250250        m_assembler.sarl_i8r(imm.m_value, dest);
     251    }
     252   
     253    void urshift32(RegisterID shift_amount, RegisterID dest)
     254    {
     255        // On x86 we can only shift by ecx; if asked to shift by another register we'll
     256        // need rejig the shift amount into ecx first, and restore the registers afterwards.
     257        if (shift_amount != X86Registers::ecx) {
     258            swap(shift_amount, X86Registers::ecx);
     259           
     260            // E.g. transform "shrl %eax, %eax" -> "xchgl %eax, %ecx; shrl %ecx, %ecx; xchgl %eax, %ecx"
     261            if (dest == shift_amount)
     262                m_assembler.shrl_CLr(X86Registers::ecx);
     263            // E.g. transform "shrl %eax, %ecx" -> "xchgl %eax, %ecx; shrl %ecx, %eax; xchgl %eax, %ecx"
     264            else if (dest == X86Registers::ecx)
     265                m_assembler.shrl_CLr(shift_amount);
     266            // E.g. transform "shrl %eax, %ebx" -> "xchgl %eax, %ecx; shrl %ecx, %ebx; xchgl %eax, %ecx"
     267            else
     268                m_assembler.shrl_CLr(dest);
     269           
     270            swap(shift_amount, X86Registers::ecx);
     271        } else
     272            m_assembler.shrl_CLr(dest);
     273    }
     274   
     275    void urshift32(Imm32 imm, RegisterID dest)
     276    {
     277        m_assembler.shrl_i8r(imm.m_value, dest);
    251278    }
    252279
Note: See TracChangeset for help on using the changeset viewer.