Changeset 48920 in webkit for trunk/JavaScriptCore/jit/JITArithmetic.cpp
- Timestamp:
- Sep 29, 2009, 9:46:57 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/jit/JITArithmetic.cpp
r48895 r48920 1943 1943 } 1944 1944 1945 void JIT::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>::iterator& iter, unsigned result, unsigned op1, unsigned , OperandTypes types)1945 void JIT::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>::iterator& iter, unsigned result, unsigned op1, unsigned op2, OperandTypes types, bool op1HasImmediateIntFastCase, bool op2HasImmediateIntFastCase) 1946 1946 { 1947 1947 // We assume that subtracting TagTypeNumber is equivalent to adding DoubleEncodeOffset. 1948 1948 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 } 1952 1960 1953 1961 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. 1955 1963 linkSlowCase(iter); 1956 1964 emitGetVirtualRegister(op1, regT0); … … 1958 1966 Label stubFunctionCall(this); 1959 1967 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 } 1960 1972 stubCall.addArgument(regT0); 1961 1973 stubCall.addArgument(regT1); … … 1963 1975 Jump end = jump(); 1964 1976 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 } 1986 2016 1987 2017 if (opcodeID == op_add) … … 2043 2073 return; 2044 2074 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); 2054 2078 } 2055 2079 … … 2086 2110 OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); 2087 2111 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); 2099 2115 } 2100 2116 … … 2204 2220 2205 2221 compileBinaryArithOp(op_sub, result, op1, op2, types); 2206 2207 2222 emitPutVirtualRegister(result); 2208 2223 } … … 2215 2230 OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); 2216 2231 2217 compileBinaryArithOpSlowCase(op_sub, iter, result, op1, op2, types );2232 compileBinaryArithOpSlowCase(op_sub, iter, result, op1, op2, types, false, false); 2218 2233 } 2219 2234
Note:
See TracChangeset
for help on using the changeset viewer.