Tidy up the shift methods on the macro-assembler interface.
Patch by Gavin Barraclough <barraclough@apple.com> 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):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@50595 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.h b/JavaScriptCore/assembler/MacroAssemblerARM.h
index 6d309aa..4d13b0f 100644
--- a/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -118,16 +118,20 @@
m_assembler.ands_r(dest, dest, w);
}
+ void lshift32(RegisterID shift_amount, RegisterID dest)
+ {
+ ARMWord w = m_assembler.getImm(0x1f, ARMRegisters::S0, true);
+ ASSERT(!(w & ARMAssembler::OP2_INV_IMM));
+ m_assembler.ands_r(ARMRegisters::S0, shift_amount, w);
+
+ m_assembler.movs_r(dest, m_assembler.lsl_r(dest, ARMRegisters::S0));
+ }
+
void lshift32(Imm32 imm, RegisterID dest)
{
m_assembler.movs_r(dest, m_assembler.lsl(dest, imm.m_value & 0x1f));
}
- void lshift32(RegisterID shift_amount, RegisterID dest)
- {
- m_assembler.movs_r(dest, m_assembler.lsl_r(dest, shift_amount));
- }
-
void mul32(RegisterID src, RegisterID dest)
{
if (src == dest) {
@@ -160,7 +164,11 @@
void rshift32(RegisterID shift_amount, RegisterID dest)
{
- m_assembler.movs_r(dest, m_assembler.asr_r(dest, shift_amount));
+ ARMWord w = m_assembler.getImm(0x1f, ARMRegisters::S0, true);
+ ASSERT(!(w & ARMAssembler::OP2_INV_IMM));
+ m_assembler.ands_r(ARMRegisters::S0, shift_amount, w);
+
+ m_assembler.movs_r(dest, m_assembler.asr_r(dest, ARMRegisters::S0));
}
void rshift32(Imm32 imm, RegisterID dest)