diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-11-27 15:05:23 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-01-02 14:25:33 +0000 |
commit | dfd43d0e84e0bf4eedf7f479af82c36594d754b5 (patch) | |
tree | f9cac6583d1a48e64cbc2eea118f6791f1d48ebd /src/qml/jit/qv4assembler.cpp | |
parent | de73a1f9b4ad42e4b67d4d6045ff8ca9994e9a7d (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.cpp | 28 |
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) |