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/assembler/MacroAssembler.h

    r39540 r39738  
    580580    }
    581581   
     582    void not32(RegisterID srcDest)
     583    {
     584        m_assembler.notl_r(srcDest);
     585    }
     586   
    582587    void orPtr(RegisterID src, RegisterID dest)
    583588    {
     
    586591#else
    587592        or32(src, dest);
     593#endif
     594    }
     595
     596    void orPtr(ImmPtr imm, RegisterID dest)
     597    {
     598#if PLATFORM(X86_64)
     599        move(imm, scratchRegister);
     600        m_assembler.orq_rr(scratchRegister, dest);
     601#else
     602        or32(Imm32(imm), dest);
    588603#endif
    589604    }
     
    10031018    }
    10041019
     1020    void zeroExtend32ToPtr(RegisterID src, RegisterID dest)
     1021    {
     1022#if PLATFORM(X86_64)
     1023        m_assembler.movl_rr(src, dest);
     1024#else
     1025        if (src != dest)
     1026            move(src, dest);
     1027#endif
     1028    }
    10051029
    10061030
     
    11181142    }
    11191143   
     1144    Jump jaePtr(RegisterID left, RegisterID right)
     1145    {
     1146#if PLATFORM(X86_64)
     1147        m_assembler.cmpq_rr(right, left);
     1148        return Jump(m_assembler.jae());
     1149#else
     1150        return jae32(left, right);
     1151#endif
     1152    }
     1153
     1154    Jump jaePtr(RegisterID reg, ImmPtr ptr)
     1155    {
     1156#if PLATFORM(X86_64)
     1157        intptr_t imm = ptr.asIntptr();
     1158        if (CAN_SIGN_EXTEND_32_64(imm)) {
     1159            compareImm64ForBranch(reg, imm);
     1160            return Jump(m_assembler.jae());
     1161        } else {
     1162            move(ptr, scratchRegister);
     1163            return jaePtr(reg, scratchRegister);
     1164        }
     1165#else
     1166        return jae32(reg, Imm32(ptr));
     1167#endif
     1168    }
     1169
     1170    Jump jae32(RegisterID left, RegisterID right)
     1171    {
     1172        m_assembler.cmpl_rr(right, left);
     1173        return Jump(m_assembler.jae());
     1174    }
     1175
    11201176    Jump jae32(RegisterID left, Imm32 right)
    11211177    {
     
    11341190        m_assembler.cmpl_rm(right, left.offset, left.base);
    11351191        return Jump(m_assembler.jae());
     1192    }
     1193   
     1194    Jump jbPtr(RegisterID left, RegisterID right)
     1195    {
     1196#if PLATFORM(X86_64)
     1197        m_assembler.cmpq_rr(right, left);
     1198        return Jump(m_assembler.jb());
     1199#else
     1200        return jb32(left, right);
     1201#endif
     1202    }
     1203
     1204    Jump jbPtr(RegisterID reg, ImmPtr ptr)
     1205    {
     1206#if PLATFORM(X86_64)
     1207        intptr_t imm = ptr.asIntptr();
     1208        if (CAN_SIGN_EXTEND_32_64(imm)) {
     1209            compareImm64ForBranch(reg, imm);
     1210            return Jump(m_assembler.jb());
     1211        } else {
     1212            move(ptr, scratchRegister);
     1213            return jbPtr(reg, scratchRegister);
     1214        }
     1215#else
     1216        return jb32(reg, Imm32(ptr));
     1217#endif
     1218    }
     1219
     1220    Jump jb32(RegisterID left, RegisterID right)
     1221    {
     1222        m_assembler.cmpl_rr(right, left);
     1223        return Jump(m_assembler.jb());
     1224    }
     1225
     1226    Jump jb32(RegisterID left, Imm32 right)
     1227    {
     1228        compareImm32ForBranch(left, right.m_value);
     1229        return Jump(m_assembler.jb());
    11361230    }
    11371231   
     
    14691563    }
    14701564
     1565    Jump jnzPtr(RegisterID reg, ImmPtr mask)
     1566    {
     1567#if PLATFORM(X86_64)
     1568        move(mask, scratchRegister);
     1569        m_assembler.testq_rr(scratchRegister, reg);
     1570        return Jump(m_assembler.jne());
     1571#else
     1572        return jnz32(reg, Imm32(mask));
     1573#endif
     1574    }
     1575
    14711576    Jump jnzPtr(Address address, Imm32 mask = Imm32(-1))
    14721577    {
     
    14981603#else
    14991604        return jz32(reg, mask);
     1605#endif
     1606    }
     1607
     1608    Jump jzPtr(RegisterID reg, ImmPtr mask)
     1609    {
     1610#if PLATFORM(X86_64)
     1611        move(mask, scratchRegister);
     1612        m_assembler.testq_rr(scratchRegister, reg);
     1613        return Jump(m_assembler.je());
     1614#else
     1615        return jz32(reg, Imm32(mask));
    15001616#endif
    15011617    }
Note: See TracChangeset for help on using the changeset viewer.