Ignore:
Timestamp:
Jan 9, 2009, 12:11:00 AM (16 years ago)
Author:
[email protected]
Message:

2009-01-08 Gavin Barraclough <[email protected]>

Reviewed by Oliver Hunt.

Encode immediates in the low word of JSValuePtrs, on x86-64.

On 32-bit platforms a JSValuePtr may represent a 31-bit signed integer.
On 64-bit platforms, if USE(ALTERNATE_JSIMMEDIATE) is defined, a full
32-bit integer may be stored in an immediate.


Presently USE(ALTERNATE_JSIMMEDIATE) uses the same encoding as the default
immediate format - the value is left shifted by one, so a one bit tag can
be added to indicate the value is an immediate. However this means that
values must be commonly be detagged (by right shifting by one) before
arithmetic operations can be performed on immediates. This patch modifies
the formattting so the the high bits of the immediate mark values as being
integer.

  • assembler/MacroAssembler.h: (JSC::MacroAssembler::not32): (JSC::MacroAssembler::orPtr): (JSC::MacroAssembler::zeroExtend32ToPtr): (JSC::MacroAssembler::jaePtr): (JSC::MacroAssembler::jbPtr): (JSC::MacroAssembler::jnzPtr): (JSC::MacroAssembler::jzPtr):
  • assembler/X86Assembler.h: (JSC::X86Assembler::): (JSC::X86Assembler::notl_r): (JSC::X86Assembler::testq_i32r):
  • jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases): (JSC::JIT::privateCompileCTIMachineTrampolines):
  • jit/JIT.h:
  • jit/JITArithmetic.cpp: (JSC::JIT::compileFastArith_op_lshift): (JSC::JIT::compileFastArith_op_rshift): (JSC::JIT::compileFastArith_op_bitand): (JSC::JIT::compileFastArithSlow_op_bitand): (JSC::JIT::compileFastArith_op_mod): (JSC::JIT::compileFastArithSlow_op_mod): (JSC::JIT::compileFastArith_op_add): (JSC::JIT::compileFastArith_op_mul): (JSC::JIT::compileFastArith_op_post_inc): (JSC::JIT::compileFastArith_op_post_dec): (JSC::JIT::compileFastArith_op_pre_inc): (JSC::JIT::compileFastArith_op_pre_dec): (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): (JSC::JIT::compileBinaryArithOp):
  • jit/JITCall.cpp: (JSC::JIT::compileOpCallSlowCase):
  • jit/JITInlineMethods.h: (JSC::JIT::emitJumpIfJSCell): (JSC::JIT::emitJumpIfNotJSCell): (JSC::JIT::emitJumpIfImmNum): (JSC::JIT::emitJumpSlowCaseIfNotImmNum): (JSC::JIT::emitJumpSlowCaseIfNotImmNums): (JSC::JIT::emitFastArithDeTagImmediate): (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): (JSC::JIT::emitFastArithReTagImmediate): (JSC::JIT::emitFastArithImmToInt): (JSC::JIT::emitFastArithIntToImmNoCheck): (JSC::JIT::emitTagAsBoolImmediate):
  • jit/JITPropertyAccess.cpp: (JSC::resizePropertyStorage): (JSC::JIT::privateCompilePutByIdTransition): (JSC::JIT::privateCompilePatchGetArrayLength): (JSC::JIT::privateCompileGetByIdSelf): (JSC::JIT::privateCompileGetByIdProto): (JSC::JIT::privateCompileGetByIdChain): (JSC::JIT::privateCompilePutByIdReplace):
  • runtime/JSImmediate.h: (JSC::JSImmediate::isNumber): (JSC::JSImmediate::isPositiveNumber): (JSC::JSImmediate::areBothImmediateNumbers): (JSC::JSImmediate::xorImmediateNumbers): (JSC::JSImmediate::rightShiftImmediateNumbers): (JSC::JSImmediate::canDoFastAdditiveOperations): (JSC::JSImmediate::addImmediateNumbers): (JSC::JSImmediate::subImmediateNumbers): (JSC::JSImmediate::makeInt): (JSC::JSImmediate::toBoolean):
  • wtf/Platform.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/jit/JITInlineMethods.h

    r39670 r39738  
    129129}
    130130
    131 ALWAYS_INLINE bool JIT::isOperandConstant31BitImmediateInt(unsigned src)
    132 {
    133     if (!m_codeBlock->isConstantRegisterIndex(src))
    134         return false;
    135 
    136     JSValuePtr value = getConstantOperand(src);
    137 
    138 #if USE(ALTERNATE_JSIMMEDIATE)
    139     if (!JSImmediate::isNumber(value))
    140         return false;
    141 
    142     int32_t imm = JSImmediate::intValue(value);
    143     return (imm == ((imm << 1) >> 1));
    144 #else
    145     return JSImmediate::isNumber(value);
    146 #endif
    147 }
    148 
    149131// get arg puts an arg from the SF register array onto the stack, as an arg to a context threaded function.
    150132ALWAYS_INLINE void JIT::emitPutJITStubArgFromVirtualRegister(unsigned src, unsigned argumentNumber, RegisterID scratch)
     
    282264ALWAYS_INLINE JIT::Jump JIT::emitJumpIfJSCell(RegisterID reg)
    283265{
     266#if USE(ALTERNATE_JSIMMEDIATE)
     267    return jzPtr(reg, ImmPtr(reinterpret_cast<void*>(JSImmediate::TagMask)));
     268#else
    284269    return jz32(reg, Imm32(JSImmediate::TagMask));
     270#endif
    285271}
    286272
     
    292278ALWAYS_INLINE JIT::Jump JIT::emitJumpIfNotJSCell(RegisterID reg)
    293279{
     280#if USE(ALTERNATE_JSIMMEDIATE)
     281    return jnzPtr(reg, ImmPtr(reinterpret_cast<void*>(JSImmediate::TagMask)));
     282#else
    294283    return jnz32(reg, Imm32(JSImmediate::TagMask));
     284#endif
    295285}
    296286
     
    312302}
    313303
     304ALWAYS_INLINE JIT::Jump JIT::emitJumpIfImmNum(RegisterID reg)
     305{
     306#if USE(ALTERNATE_JSIMMEDIATE)
     307    return jaePtr(reg, ImmPtr(reinterpret_cast<void*>(JSImmediate::TagTypeInteger)));
     308#else
     309    return jnz32(reg, Imm32(JSImmediate::TagTypeInteger));
     310#endif
     311}
     312
    314313ALWAYS_INLINE void JIT::emitJumpSlowCaseIfNotImmNum(RegisterID reg)
    315314{
    316     addSlowCase(jz32(reg, Imm32(JSImmediate::TagBitTypeInteger)));
     315#if USE(ALTERNATE_JSIMMEDIATE)
     316    addSlowCase(jbPtr(reg, ImmPtr(reinterpret_cast<void*>(JSImmediate::TagTypeInteger))));
     317#else
     318    addSlowCase(jz32(reg, Imm32(JSImmediate::TagTypeInteger)));
     319#endif
    317320}
    318321
     
    320323{
    321324    move(reg1, scratch);
    322     and32(reg2, scratch);
     325    andPtr(reg2, scratch);
    323326    emitJumpSlowCaseIfNotImmNum(scratch);
    324327}
    325328
     329#if !USE(ALTERNATE_JSIMMEDIATE)
    326330ALWAYS_INLINE void JIT::emitFastArithDeTagImmediate(RegisterID reg)
    327331{
    328     subPtr(Imm32(JSImmediate::TagBitTypeInteger), reg);
     332    subPtr(Imm32(JSImmediate::TagTypeInteger), reg);
    329333}
    330334
    331335ALWAYS_INLINE JIT::Jump JIT::emitFastArithDeTagImmediateJumpIfZero(RegisterID reg)
    332336{
    333     return jzSubPtr(Imm32(JSImmediate::TagBitTypeInteger), reg);
    334 }
    335 
    336 ALWAYS_INLINE void JIT::emitFastArithReTagImmediate(RegisterID reg)
    337 {
    338     addPtr(Imm32(JSImmediate::TagBitTypeInteger), reg);
     337    return jzSubPtr(Imm32(JSImmediate::TagTypeInteger), reg);
     338}
     339#endif
     340
     341ALWAYS_INLINE void JIT::emitFastArithReTagImmediate(RegisterID src, RegisterID dest)
     342{
     343#if USE(ALTERNATE_JSIMMEDIATE)
     344    emitFastArithIntToImmNoCheck(src, dest);
     345#else
     346    if (src != dest)
     347        move(src, dest);
     348    addPtr(Imm32(JSImmediate::TagTypeInteger), dest);
     349#endif
    339350}
    340351
    341352ALWAYS_INLINE void JIT::emitFastArithImmToInt(RegisterID reg)
    342353{
     354#if USE(ALTERNATE_JSIMMEDIATE)
     355    UNUSED_PARAM(reg);
     356#else
    343357    rshiftPtr(Imm32(JSImmediate::IntegerPayloadShift), reg);
    344 }
    345 
    346 ALWAYS_INLINE void JIT::emitFastArithIntToImmNoCheck(RegisterID reg)
    347 {
    348     signExtend32ToPtr(reg, reg);
    349     addPtr(reg, reg);
    350     emitFastArithReTagImmediate(reg);
     358#endif
     359}
     360
     361// operand is int32_t, must have been zero-extended if register is 64-bit.
     362ALWAYS_INLINE void JIT::emitFastArithIntToImmNoCheck(RegisterID src, RegisterID dest)
     363{
     364#if USE(ALTERNATE_JSIMMEDIATE)
     365    if (src != dest)
     366        move(src, dest);
     367    orPtr(ImmPtr(reinterpret_cast<void*>(JSImmediate::TagTypeInteger)), dest);
     368#else
     369    signExtend32ToPtr(src, dest);
     370    addPtr(dest, dest);
     371    emitFastArithReTagImmediate(dest, dest);
     372#endif
    351373}
    352374
     
    354376{
    355377    lshift32(Imm32(JSImmediate::ExtendedPayloadShift), reg);
    356     or32(Imm32(JSImmediate::FullTagTypeBool), reg);
     378    or32(Imm32(static_cast<int32_t>(JSImmediate::FullTagTypeBool)), reg);
    357379}
    358380
Note: See TracChangeset for help on using the changeset viewer.