Ignore:
Timestamp:
Jan 15, 2009, 7:20:35 PM (16 years ago)
Author:
[email protected]
Message:

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

Reviewed by Geoff Garen.

On x86-64 allow JSImmediate to encode 64-bit double precision values.
This patch only affects builds that set USE(ALTERNATE_JSIMMEDIATE).

Updates the implementation of JSValuePtr
and JSImmediate:: methods that operate on neumeric values to be be aware of the new representation. When this representation is in use, the class JSNumberCell is redundant and is compiled out.

The format of the new immediate representation is documented in JSImmediate.h.

  • JavaScriptCore.exp:
  • assembler/MacroAssembler.h: (JSC::MacroAssembler::subPtr):
  • assembler/X86Assembler.h: (JSC::X86Assembler::): (JSC::X86Assembler::subq_rr): (JSC::X86Assembler::movq_rr): (JSC::X86Assembler::ucomisd_rr): (JSC::X86Assembler::X86InstructionFormatter::twoByteOp64):
  • interpreter/Interpreter.cpp: (JSC::Interpreter::cti_op_stricteq): (JSC::Interpreter::cti_op_nstricteq):
  • jit/JIT.cpp: (JSC::JIT::compileOpStrictEq): (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases):
  • jit/JIT.h:
  • jit/JITArithmetic.cpp: (JSC::JIT::compileFastArith_op_lshift): (JSC::JIT::compileFastArith_op_rshift): (JSC::JIT::compileFastArith_op_bitand): (JSC::JIT::compileFastArith_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/JITInlineMethods.h: (JSC::JIT::emitJumpIfBothJSCells): (JSC::JIT::emitJumpIfEitherNumber): (JSC::JIT::emitJumpIfNotEitherNumber): (JSC::JIT::emitJumpIfImmediateIntegerNumber): (JSC::JIT::emitJumpIfNotImmediateIntegerNumber): (JSC::JIT::emitJumpIfNotImmediateIntegerNumbers): (JSC::JIT::emitJumpSlowCaseIfNotImmediateIntegerNumber): (JSC::JIT::emitJumpSlowCaseIfNotImmediateIntegerNumbers): (JSC::JIT::emitFastArithDeTagImmediate): (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): (JSC::JIT::emitFastArithReTagImmediate): (JSC::JIT::emitFastArithIntToImmNoCheck):
  • runtime/JSCell.h:
  • runtime/JSGlobalData.cpp: (JSC::JSGlobalData::JSGlobalData):
  • runtime/JSImmediate.cpp: (JSC::JSImmediate::toThisObject): (JSC::JSImmediate::toObject): (JSC::JSImmediate::toString):
  • runtime/JSImmediate.h: (JSC::wtf_reinterpret_cast): (JSC::JSImmediate::isNumber): (JSC::JSImmediate::isIntegerNumber): (JSC::JSImmediate::isDoubleNumber): (JSC::JSImmediate::isPositiveIntegerNumber): (JSC::JSImmediate::areBothImmediateIntegerNumbers): (JSC::JSImmediate::makeInt): (JSC::JSImmediate::makeDouble): (JSC::JSImmediate::doubleValue): (JSC::doubleToBoolean): (JSC::JSImmediate::toBoolean): (JSC::JSImmediate::getTruncatedUInt32): (JSC::JSImmediate::makeOutOfIntegerRange): (JSC::JSImmediate::from): (JSC::JSImmediate::getTruncatedInt32): (JSC::JSImmediate::toDouble): (JSC::JSImmediate::getUInt32): (JSC::JSValuePtr::isInt32Fast): (JSC::JSValuePtr::isUInt32Fast): (JSC::JSValuePtr::areBothInt32Fast): (JSC::JSFastMath::canDoFastBitwiseOperations): (JSC::JSFastMath::xorImmediateNumbers): (JSC::JSFastMath::canDoFastRshift): (JSC::JSFastMath::canDoFastUrshift): (JSC::JSFastMath::rightShiftImmediateNumbers): (JSC::JSFastMath::canDoFastAdditiveOperations): (JSC::JSFastMath::addImmediateNumbers): (JSC::JSFastMath::subImmediateNumbers):
  • runtime/JSNumberCell.cpp: (JSC::jsNumberCell):
  • runtime/JSNumberCell.h: (JSC::createNumberStructure): (JSC::isNumberCell): (JSC::asNumberCell): (JSC::jsNumber): (JSC::JSValuePtr::isDoubleNumber): (JSC::JSValuePtr::getDoubleNumber): (JSC::JSValuePtr::isNumber): (JSC::JSValuePtr::uncheckedGetNumber): (JSC::jsNaN): (JSC::JSValuePtr::getNumber): (JSC::JSValuePtr::numberToInt32): (JSC::JSValuePtr::numberToUInt32):
  • runtime/JSValue.h:
  • runtime/NumberConstructor.cpp: (JSC::numberConstructorNegInfinity): (JSC::numberConstructorPosInfinity): (JSC::numberConstructorMaxValue): (JSC::numberConstructorMinValue):
  • runtime/NumberObject.cpp: (JSC::constructNumber):
  • runtime/NumberObject.h:
  • runtime/Operations.h: (JSC::JSValuePtr::equal): (JSC::JSValuePtr::equalSlowCaseInline): (JSC::JSValuePtr::strictEqual): (JSC::JSValuePtr::strictEqualSlowCaseInline):
  • wtf/Platform.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/jit/JITArithmetic.cpp

    r39851 r39958  
    5050{
    5151    emitGetVirtualRegisters(op1, X86::eax, op2, X86::ecx);
    52     // FIXME: would we be better using 'emitJumpSlowCaseIfNotImmNums'? - we *probably* ought to be consistent.
    53     emitJumpSlowCaseIfNotImmNum(X86::eax);
    54     emitJumpSlowCaseIfNotImmNum(X86::ecx);
     52    // FIXME: would we be better using 'emitJumpSlowCaseIfNotImmediateIntegers'? - we *probably* ought to be consistent.
     53    emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
     54    emitJumpSlowCaseIfNotImmediateInteger(X86::ecx);
    5555    emitFastArithImmToInt(X86::eax);
    5656    emitFastArithImmToInt(X86::ecx);
     
    9494    if (isOperandConstantImmediateInt(op2)) {
    9595        emitGetVirtualRegister(op1, X86::eax);
    96         emitJumpSlowCaseIfNotImmNum(X86::eax);
     96        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    9797        // Mask with 0x1f as per ecma-262 11.7.2 step 7.
    9898#if USE(ALTERNATE_JSIMMEDIATE)
     
    103103    } else {
    104104        emitGetVirtualRegisters(op1, X86::eax, op2, X86::ecx);
    105         emitJumpSlowCaseIfNotImmNum(X86::eax);
    106         emitJumpSlowCaseIfNotImmNum(X86::ecx);
     105        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
     106        emitJumpSlowCaseIfNotImmediateInteger(X86::ecx);
    107107        emitFastArithImmToInt(X86::ecx);
    108108#if !PLATFORM(X86)
     
    120120    emitFastArithIntToImmNoCheck(X86::eax, X86::eax);
    121121#else
    122     orPtr(Imm32(JSImmediate::TagTypeInteger), X86::eax);
     122    orPtr(Imm32(JSImmediate::TagTypeNumber), X86::eax);
    123123#endif
    124124    emitPutVirtualRegister(result);
     
    143143    if (isOperandConstantImmediateInt(op1)) {
    144144        emitGetVirtualRegister(op2, X86::eax);
    145         emitJumpSlowCaseIfNotImmNum(X86::eax);
     145        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    146146#if USE(ALTERNATE_JSIMMEDIATE)
    147147        int32_t imm = getConstantOperandImmediateInt(op1);
     
    154154    } else if (isOperandConstantImmediateInt(op2)) {
    155155        emitGetVirtualRegister(op1, X86::eax);
    156         emitJumpSlowCaseIfNotImmNum(X86::eax);
     156        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    157157#if USE(ALTERNATE_JSIMMEDIATE)
    158158        int32_t imm = getConstantOperandImmediateInt(op2);
     
    166166        emitGetVirtualRegisters(op1, X86::eax, op2, X86::edx);
    167167        andPtr(X86::edx, X86::eax);
    168         emitJumpSlowCaseIfNotImmNum(X86::eax);
     168        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    169169    }
    170170    emitPutVirtualRegister(result);
     
    190190{
    191191    emitGetVirtualRegisters(op1, X86::eax, op2, X86::ecx);
    192     emitJumpSlowCaseIfNotImmNum(X86::eax);
    193     emitJumpSlowCaseIfNotImmNum(X86::ecx);
     192    emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
     193    emitJumpSlowCaseIfNotImmediateInteger(X86::ecx);
    194194#if USE(ALTERNATE_JSIMMEDIATE)
    195195    addSlowCase(jePtr(X86::ecx, ImmPtr(JSValuePtr::encode(js0()))));
     
    233233    if (isOperandConstantImmediateInt(op1)) {
    234234        emitGetVirtualRegister(op2, X86::eax);
    235         emitJumpSlowCaseIfNotImmNum(X86::eax);
     235        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    236236#if USE(ALTERNATE_JSIMMEDIATE)
    237237        // FIXME: investigate performing a 31-bit add here (can we preserve upper bit & detect overflow from low word to high?)
     
    246246    } else if (isOperandConstantImmediateInt(op2)) {
    247247        emitGetVirtualRegister(op1, X86::eax);
    248         emitJumpSlowCaseIfNotImmNum(X86::eax);
     248        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    249249#if USE(ALTERNATE_JSIMMEDIATE)
    250250        emitFastArithImmToInt(X86::eax);
     
    323323    if (isOperandConstantImmediateInt(op1) && ((value = getConstantOperandImmediateInt(op1)) > 0)) {
    324324        emitGetVirtualRegister(op2, X86::eax);
    325         emitJumpSlowCaseIfNotImmNum(X86::eax);
     325        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    326326#if USE(ALTERNATE_JSIMMEDIATE)
    327327        addSlowCase(joMul32(Imm32(value), X86::eax, X86::eax));
     
    335335    } else if (isOperandConstantImmediateInt(op2) && ((value = getConstantOperandImmediateInt(op2)) > 0)) {
    336336        emitGetVirtualRegister(op1, X86::eax);
    337         emitJumpSlowCaseIfNotImmNum(X86::eax);
     337        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    338338#if USE(ALTERNATE_JSIMMEDIATE)
    339339        addSlowCase(joMul32(Imm32(value), X86::eax, X86::eax));
     
    371371    emitGetVirtualRegister(srcDst, X86::eax);
    372372    move(X86::eax, X86::edx);
    373     emitJumpSlowCaseIfNotImmNum(X86::eax);
     373    emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    374374#if USE(ALTERNATE_JSIMMEDIATE)
    375375    addSlowCase(joAdd32(Imm32(1), X86::edx));
     
    396396    emitGetVirtualRegister(srcDst, X86::eax);
    397397    move(X86::eax, X86::edx);
    398     emitJumpSlowCaseIfNotImmNum(X86::eax);
     398    emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    399399#if USE(ALTERNATE_JSIMMEDIATE)
    400400    addSlowCase(joSub32(Imm32(1), X86::edx));
     
    420420{
    421421    emitGetVirtualRegister(srcDst, X86::eax);
    422     emitJumpSlowCaseIfNotImmNum(X86::eax);
     422    emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    423423#if USE(ALTERNATE_JSIMMEDIATE)
    424424    // FIXME: Could add ptr & specify int64; no need to re-sign-extend?
     
    445445{
    446446    emitGetVirtualRegister(srcDst, X86::eax);
    447     emitJumpSlowCaseIfNotImmNum(X86::eax);
     447    emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    448448#if USE(ALTERNATE_JSIMMEDIATE)
    449449    addSlowCase(joSub32(Imm32(1), X86::eax));
     
    548548    __ cvtsi2sd_rr(tempReg1, tempXmm);
    549549    // Compare & branch if immediate.
    550     __ ucomis_rr(tempXmm, xmmSource);
     550    __ ucomisd_rr(tempXmm, xmmSource);
    551551    JmpSrc resultIsImm = __ je();
    552552    JmpDst resultLookedLikeImmButActuallyIsnt = __ label();
     
    585585
    586586        // Check op2 is a number
    587         __ testl_i32r(JSImmediate::TagTypeInteger, X86::edx);
     587        __ testl_i32r(JSImmediate::TagTypeNumber, X86::edx);
    588588        JmpSrc op2imm = __ jne();
    589589        if (!types.second().definitelyIsNumber()) {
     
    595595        // (1) In this case src2 is a reusable number cell.
    596596        //     Slow case if src1 is not a number type.
    597         __ testl_i32r(JSImmediate::TagTypeInteger, X86::eax);
     597        __ testl_i32r(JSImmediate::TagTypeNumber, X86::eax);
    598598        JmpSrc op1imm = __ jne();
    599599        if (!types.first().definitelyIsNumber()) {
     
    627627        //     Two slow cases - either src1 isn't an immediate, or the subtract overflows.
    628628        __ link(op2imm, __ label());
    629         emitJumpSlowCaseIfNotImmNum(X86::eax);
     629        emitJumpSlowCaseIfNotImmediateInteger(X86::eax);
    630630    } else if (types.first().isReusable() && isSSE2Present()) {
    631631        ASSERT(types.first().mightBeNumber());
    632632
    633633        // Check op1 is a number
    634         __ testl_i32r(JSImmediate::TagTypeInteger, X86::eax);
     634        __ testl_i32r(JSImmediate::TagTypeNumber, X86::eax);
    635635        JmpSrc op1imm = __ jne();
    636636        if (!types.first().definitelyIsNumber()) {
     
    642642        // (1) In this case src1 is a reusable number cell.
    643643        //     Slow case if src2 is not a number type.
    644         __ testl_i32r(JSImmediate::TagTypeInteger, X86::edx);
     644        __ testl_i32r(JSImmediate::TagTypeNumber, X86::edx);
    645645        JmpSrc op2imm = __ jne();
    646646        if (!types.second().definitelyIsNumber()) {
     
    677677        //     Two slow cases - either src2 isn't an immediate, or the subtract overflows.
    678678        __ link(op1imm, __ label());
    679         emitJumpSlowCaseIfNotImmNum(X86::edx);
     679        emitJumpSlowCaseIfNotImmediateInteger(X86::edx);
    680680    } else
    681         emitJumpSlowCaseIfNotImmNums(X86::eax, X86::edx, X86::ecx);
     681        emitJumpSlowCaseIfNotImmediateIntegers(X86::eax, X86::edx, X86::ecx);
    682682
    683683    if (opcodeID == op_add) {
Note: See TracChangeset for help on using the changeset viewer.