aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit/qv4assembler.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-11-27 15:05:23 +0100
committerLars Knoll <lars.knoll@qt.io>2018-01-02 14:25:33 +0000
commitdfd43d0e84e0bf4eedf7f479af82c36594d754b5 (patch)
treef9cac6583d1a48e64cbc2eea118f6791f1d48ebd /src/qml/jit/qv4assembler.cpp
parentde73a1f9b4ad42e4b67d4d6045ff8ca9994e9a7d (diff)
Optimize generated code for toInt32 and toNumber
Gives some significant speedup for crypto.js Change-Id: Ie5e4922ceae43cc62e1d7fc98de4322d637bddc8 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml/jit/qv4assembler.cpp')
-rw-r--r--src/qml/jit/qv4assembler.cpp28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp
index 5cdfbcee93..80eec61673 100644
--- a/src/qml/jit/qv4assembler.cpp
+++ b/src/qml/jit/qv4assembler.cpp
@@ -723,25 +723,41 @@ struct PlatformAssembler64 : PlatformAssemblerCommon
void toNumber()
{
+ urshift64(AccumulatorRegister, TrustedImm32(Value::QuickType_Shift), ScratchRegister);
+ auto isNumber = branch32(GreaterThanOrEqual, ScratchRegister, TrustedImm32(Value::QT_Int));
+
move(AccumulatorRegister, registerForArg(0));
callHelper(toNumberHelper);
move(ReturnValueRegister, AccumulatorRegister);
+
+ isNumber.link(this);
}
void toInt32()
{
+ urshift64(AccumulatorRegister, TrustedImm32(Value::QuickType_Shift), ScratchRegister);
+ auto isInt = branch32(Equal, TrustedImm32(Value::QT_Int), ScratchRegister);
+
move(AccumulatorRegister, registerForArg(0));
callRuntime("toInt32Helper", reinterpret_cast<void *>(&toInt32Helper),
Assembler::ResultInAccumulator);
+
+ isInt.link(this);
}
void regToInt32(Address srcReg, RegisterID targetReg)
{
+ load64(srcReg, targetReg);
+ urshift64(targetReg, TrustedImm32(Value::QuickType_Shift), ScratchRegister2);
+ auto isInt = branch32(Equal, TrustedImm32(Value::QT_Int), ScratchRegister2);
+
pushAligned(AccumulatorRegister);
- load64(srcReg, registerForArg(0));
+ move(targetReg, registerForArg(0));
callHelper(toInt32Helper);
move(ReturnValueRegister, targetReg);
popAligned(AccumulatorRegister);
+
+ isInt.link(this);
}
void isNullOrUndefined()
@@ -932,6 +948,9 @@ struct PlatformAssembler32 : PlatformAssemblerCommon
void toNumber()
{
+ urshift32(AccumulatorRegisterTag, TrustedImm32(Value::QuickType_Shift - 32), ScratchRegister);
+ auto isNumber = branch32(GreaterThanOrEqual, ScratchRegister, TrustedImm32(Value::QT_Int));
+
if (ArgInRegCount < 2) {
push(AccumulatorRegisterTag);
push(AccumulatorRegisterValue);
@@ -945,10 +964,15 @@ struct PlatformAssembler32 : PlatformAssemblerCommon
move(ReturnValueRegisterTag, AccumulatorRegisterTag);
if (ArgInRegCount < 2)
addPtr(TrustedImm32(2 * PointerSize), StackPointerRegister);
+
+ isNumber.link(this);
}
void toInt32()
{
+ urshift32(AccumulatorRegisterTag, TrustedImm32(Value::QuickType_Shift - 32), ScratchRegister);
+ auto isInt = branch32(Equal, TrustedImm32(Value::QT_Int), ScratchRegister);
+
if (ArgInRegCount < 2) {
push(AccumulatorRegisterTag);
push(AccumulatorRegisterValue);
@@ -960,6 +984,8 @@ struct PlatformAssembler32 : PlatformAssemblerCommon
Assembler::ResultInAccumulator);
if (ArgInRegCount < 2)
addPtr(TrustedImm32(2 * PointerSize), StackPointerRegister);
+
+ isInt.link(this);
}
void regToInt32(Address srcReg, RegisterID targetReg)