Ignore:
Timestamp:
Sep 29, 2009, 9:46:57 PM (16 years ago)
Author:
[email protected]
Message:

Inlined a few math operations.

Patch by Geoffrey Garen <[email protected]> on 2009-09-29
Reviewed by Gavin Barraclough.

~1% SunSpider speedup.

  • jit/JIT.h:
  • jit/JITArithmetic.cpp:

(JSC::JIT::compileBinaryArithOpSlowCase):
(JSC::JIT::emitSlow_op_add):
(JSC::JIT::emitSlow_op_mul):
(JSC::JIT::emit_op_sub):
(JSC::JIT::emitSlow_op_sub): Don't take a stub call when operating on
a constant int and a double.

File:
1 edited

Legend:

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

    r48895 r48920  
    19431943}
    19441944
    1945 void JIT::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>::iterator& iter, unsigned result, unsigned op1, unsigned, OperandTypes types)
     1945void JIT::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>::iterator& iter, unsigned result, unsigned op1, unsigned op2, OperandTypes types, bool op1HasImmediateIntFastCase, bool op2HasImmediateIntFastCase)
    19461946{
    19471947    // We assume that subtracting TagTypeNumber is equivalent to adding DoubleEncodeOffset.
    19481948    COMPILE_ASSERT(((JSImmediate::TagTypeNumber + JSImmediate::DoubleEncodeOffset) == 0), TagTypeNumber_PLUS_DoubleEncodeOffset_EQUALS_0);
    1949 
    1950     Jump notImm1 = getSlowCase(iter);
    1951     Jump notImm2 = getSlowCase(iter);
     1949   
     1950    Jump notImm1;
     1951    Jump notImm2;
     1952    if (op1HasImmediateIntFastCase) {
     1953        notImm2 = getSlowCase(iter);
     1954    } else if (op2HasImmediateIntFastCase) {
     1955        notImm1 = getSlowCase(iter);
     1956    } else {
     1957        notImm1 = getSlowCase(iter);
     1958        notImm2 = getSlowCase(iter);
     1959    }
    19521960
    19531961    linkSlowCase(iter); // Integer overflow case - we could handle this in JIT code, but this is likely rare.
    1954     if (opcodeID == op_mul) // op_mul has an extra slow case to handle 0 * negative number.
     1962    if (opcodeID == op_mul && !op1HasImmediateIntFastCase && !op2HasImmediateIntFastCase) // op_mul has an extra slow case to handle 0 * negative number.
    19551963        linkSlowCase(iter);
    19561964    emitGetVirtualRegister(op1, regT0);
     
    19581966    Label stubFunctionCall(this);
    19591967    JITStubCall stubCall(this, opcodeID == op_add ? cti_op_add : opcodeID == op_sub ? cti_op_sub : cti_op_mul);
     1968    if (op1HasImmediateIntFastCase || op2HasImmediateIntFastCase) {
     1969        emitGetVirtualRegister(op1, regT0);
     1970        emitGetVirtualRegister(op2, regT1);
     1971    }
    19601972    stubCall.addArgument(regT0);
    19611973    stubCall.addArgument(regT1);
     
    19631975    Jump end = jump();
    19641976
    1965     // if we get here, eax is not an int32, edx not yet checked.
    1966     notImm1.link(this);
    1967     if (!types.first().definitelyIsNumber())
    1968         emitJumpIfNotImmediateNumber(regT0).linkTo(stubFunctionCall, this);
    1969     if (!types.second().definitelyIsNumber())
    1970         emitJumpIfNotImmediateNumber(regT1).linkTo(stubFunctionCall, this);
    1971     addPtr(tagTypeNumberRegister, regT0);
    1972     movePtrToDouble(regT0, fpRegT1);
    1973     Jump op2isDouble = emitJumpIfNotImmediateInteger(regT1);
    1974     convertInt32ToDouble(regT1, fpRegT2);
    1975     Jump op2wasInteger = jump();
    1976 
    1977     // if we get here, eax IS an int32, edx is not.
    1978     notImm2.link(this);
    1979     if (!types.second().definitelyIsNumber())
    1980         emitJumpIfNotImmediateNumber(regT1).linkTo(stubFunctionCall, this);
    1981     convertInt32ToDouble(regT0, fpRegT1);
    1982     op2isDouble.link(this);
    1983     addPtr(tagTypeNumberRegister, regT1);
    1984     movePtrToDouble(regT1, fpRegT2);
    1985     op2wasInteger.link(this);
     1977    if (op1HasImmediateIntFastCase) {
     1978        notImm2.link(this);
     1979        if (!types.second().definitelyIsNumber())
     1980            emitJumpIfNotImmediateNumber(regT0).linkTo(stubFunctionCall, this);
     1981        emitGetVirtualRegister(op1, regT1);
     1982        convertInt32ToDouble(regT1, fpRegT1);
     1983        addPtr(tagTypeNumberRegister, regT0);
     1984        movePtrToDouble(regT0, fpRegT2);
     1985    } else if (op2HasImmediateIntFastCase) {
     1986        notImm1.link(this);
     1987        if (!types.first().definitelyIsNumber())
     1988            emitJumpIfNotImmediateNumber(regT0).linkTo(stubFunctionCall, this);
     1989        emitGetVirtualRegister(op2, regT1);
     1990        convertInt32ToDouble(regT1, fpRegT1);
     1991        addPtr(tagTypeNumberRegister, regT0);
     1992        movePtrToDouble(regT0, fpRegT2);
     1993    } else {
     1994        // if we get here, eax is not an int32, edx not yet checked.
     1995        notImm1.link(this);
     1996        if (!types.first().definitelyIsNumber())
     1997            emitJumpIfNotImmediateNumber(regT0).linkTo(stubFunctionCall, this);
     1998        if (!types.second().definitelyIsNumber())
     1999            emitJumpIfNotImmediateNumber(regT1).linkTo(stubFunctionCall, this);
     2000        addPtr(tagTypeNumberRegister, regT0);
     2001        movePtrToDouble(regT0, fpRegT1);
     2002        Jump op2isDouble = emitJumpIfNotImmediateInteger(regT1);
     2003        convertInt32ToDouble(regT1, fpRegT2);
     2004        Jump op2wasInteger = jump();
     2005
     2006        // if we get here, eax IS an int32, edx is not.
     2007        notImm2.link(this);
     2008        if (!types.second().definitelyIsNumber())
     2009            emitJumpIfNotImmediateNumber(regT1).linkTo(stubFunctionCall, this);
     2010        convertInt32ToDouble(regT0, fpRegT1);
     2011        op2isDouble.link(this);
     2012        addPtr(tagTypeNumberRegister, regT1);
     2013        movePtrToDouble(regT1, fpRegT2);
     2014        op2wasInteger.link(this);
     2015    }
    19862016
    19872017    if (opcodeID == op_add)
     
    20432073        return;
    20442074
    2045     if (isOperandConstantImmediateInt(op1) || isOperandConstantImmediateInt(op2)) {
    2046         linkSlowCase(iter);
    2047         linkSlowCase(iter);
    2048         JITStubCall stubCall(this, cti_op_add);
    2049         stubCall.addArgument(op1, regT2);
    2050         stubCall.addArgument(op2, regT2);
    2051         stubCall.call(result);
    2052     } else
    2053         compileBinaryArithOpSlowCase(op_add, iter, result, op1, op2, OperandTypes::fromInt(currentInstruction[4].u.operand));
     2075    bool op1HasImmediateIntFastCase = isOperandConstantImmediateInt(op1);
     2076    bool op2HasImmediateIntFastCase = !op1HasImmediateIntFastCase && isOperandConstantImmediateInt(op2);
     2077    compileBinaryArithOpSlowCase(op_add, iter, result, op1, op2, OperandTypes::fromInt(currentInstruction[4].u.operand), op1HasImmediateIntFastCase, op2HasImmediateIntFastCase);
    20542078}
    20552079
     
    20862110    OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand);
    20872111
    2088     if ((isOperandConstantImmediateInt(op1) && (getConstantOperandImmediateInt(op1) > 0))
    2089         || (isOperandConstantImmediateInt(op2) && (getConstantOperandImmediateInt(op2) > 0))) {
    2090         linkSlowCase(iter);
    2091         linkSlowCase(iter);
    2092         // There is an extra slow case for (op1 * -N) or (-N * op2), to check for 0 since this should produce a result of -0.
    2093         JITStubCall stubCall(this, cti_op_mul);
    2094         stubCall.addArgument(op1, regT2);
    2095         stubCall.addArgument(op2, regT2);
    2096         stubCall.call(result);
    2097     } else
    2098         compileBinaryArithOpSlowCase(op_mul, iter, result, op1, op2, types);
     2112    bool op1HasImmediateIntFastCase = isOperandConstantImmediateInt(op1) && getConstantOperandImmediateInt(op1) > 0;
     2113    bool op2HasImmediateIntFastCase = !op1HasImmediateIntFastCase && isOperandConstantImmediateInt(op2) && getConstantOperandImmediateInt(op2) > 0;
     2114    compileBinaryArithOpSlowCase(op_mul, iter, result, op1, op2, OperandTypes::fromInt(currentInstruction[4].u.operand), op1HasImmediateIntFastCase, op2HasImmediateIntFastCase);
    20992115}
    21002116
     
    22042220
    22052221    compileBinaryArithOp(op_sub, result, op1, op2, types);
    2206 
    22072222    emitPutVirtualRegister(result);
    22082223}
     
    22152230    OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand);
    22162231
    2217     compileBinaryArithOpSlowCase(op_sub, iter, result, op1, op2, types);
     2232    compileBinaryArithOpSlowCase(op_sub, iter, result, op1, op2, types, false, false);
    22182233}
    22192234
Note: See TracChangeset for help on using the changeset viewer.