+2009-05-18 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ - tighten up the code for the load_varargs stub
+
+ ~1-2% on v8-raytrace
+
+ * jit/JITStubs.cpp:
+ (JSC::JITStubs::cti_op_load_varargs): Hoist some loop invariants that
+ the compiler didn't feel like hoisting for us. Remove unneeded exception check.
+
2009-05-18 Maciej Stachowiak <mjs@apple.com>
Reviewed by Geoff Garen.
}
int32_t expectedParams = asFunction(callFrame[RegisterFile::Callee].jsValue())->body()->parameterCount();
int32_t inplaceArgs = min(providedParams, expectedParams);
- int32_t i = 0;
- Register* argStore = callFrame->registers() + argsOffset;
+ Register* inplaceArgsDst = callFrame->registers() + argsOffset;
+
+ Register* inplaceArgsEnd = inplaceArgsDst + inplaceArgs;
+ Register* inplaceArgsEnd2 = inplaceArgsDst + providedParams;
+
+ Register* inplaceArgsSrc = callFrame->registers() - RegisterFile::CallFrameHeaderSize - expectedParams;
+ Register* inplaceArgsSrc2 = inplaceArgsSrc - providedParams - 1 + inplaceArgs;
+
// First step is to copy the "expected" parameters from their normal location relative to the callframe
- for (; i < inplaceArgs; i++)
- argStore[i] = callFrame->registers()[i - RegisterFile::CallFrameHeaderSize - expectedParams];
+ while (inplaceArgsDst < inplaceArgsEnd)
+ *inplaceArgsDst++ = *inplaceArgsSrc++;
+
// Then we copy any additional arguments that may be further up the stack ('-1' to account for 'this')
- for (; i < providedParams; i++)
- argStore[i] = callFrame->registers()[i - RegisterFile::CallFrameHeaderSize - expectedParams - providedParams - 1];
+ while (inplaceArgsDst < inplaceArgsEnd2)
+ *inplaceArgsDst++ = *inplaceArgsSrc2++;
+
} else if (!arguments.isUndefinedOrNull()) {
if (!arguments.isObject()) {
CodeBlock* codeBlock = callFrame->codeBlock();
VM_THROW_EXCEPTION();
}
}
- CHECK_FOR_EXCEPTION_AT_END();
+
return argCount + 1;
}