diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-11-27 21:51:45 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-01-02 16:53:14 +0000 |
commit | 6cc333db9f96b96b8721a0112841595a3ff88917 (patch) | |
tree | 448790dcd9cbf74ba9f1b5a5180b179af34267b6 /src/qml/jit/qv4assembler.cpp | |
parent | 142151cfef47420c08fb28f66d8f1d9810ad35d5 (diff) |
Optimize shift operations
Change-Id: I32a4382e915217ad36fb4e2a545769586c38b203
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml/jit/qv4assembler.cpp')
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index d12553b423..9583f6513e 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -1578,13 +1578,10 @@ void Assembler::bitXor(int lhs) void Assembler::ushr(int lhs) { PlatformAssembler::Address lhsAddr = regAddr(lhs); - pasm()->regToInt32(lhsAddr, PlatformAssembler::ScratchRegister); - pasm()->pushAligned(PlatformAssembler::ScratchRegister); - pasm()->toInt32(); - pasm()->and32(TrustedImm32(0x1f), PlatformAssembler::AccumulatorRegisterValue, - PlatformAssembler::ScratchRegister); - pasm()->popAligned(PlatformAssembler::AccumulatorRegisterValue); - pasm()->urshift32(PlatformAssembler::ScratchRegister, PlatformAssembler::AccumulatorRegisterValue); + pasm()->toInt32LhsAcc(lhsAddr, PlatformAssembler::ScratchRegister); + pasm()->and32(TrustedImm32(0x1f), PlatformAssembler::AccumulatorRegisterValue); + pasm()->urshift32(PlatformAssembler::AccumulatorRegisterValue, PlatformAssembler::ScratchRegister); + pasm()->move(PlatformAssembler::ScratchRegister, PlatformAssembler::AccumulatorRegisterValue); auto doubleEncode = pasm()->branch32(PlatformAssembler::LessThan, PlatformAssembler::AccumulatorRegisterValue, TrustedImm32(0)); @@ -1602,26 +1599,20 @@ void Assembler::ushr(int lhs) void Assembler::shr(int lhs) { PlatformAssembler::Address lhsAddr = regAddr(lhs); - pasm()->regToInt32(lhsAddr, PlatformAssembler::ScratchRegister); - pasm()->pushAligned(PlatformAssembler::ScratchRegister); - pasm()->toInt32(); - pasm()->and32(TrustedImm32(0x1f), PlatformAssembler::AccumulatorRegisterValue, - PlatformAssembler::ScratchRegister); - pasm()->popAligned(PlatformAssembler::AccumulatorRegisterValue); - pasm()->rshift32(PlatformAssembler::ScratchRegister, PlatformAssembler::AccumulatorRegisterValue); + pasm()->toInt32LhsAcc(lhsAddr, PlatformAssembler::ScratchRegister); + pasm()->and32(TrustedImm32(0x1f), PlatformAssembler::AccumulatorRegisterValue); + pasm()->rshift32(PlatformAssembler::AccumulatorRegisterValue, PlatformAssembler::ScratchRegister); + pasm()->move(PlatformAssembler::ScratchRegister, PlatformAssembler::AccumulatorRegisterValue); pasm()->setAccumulatorTag(IntegerTag); } void Assembler::shl(int lhs) { PlatformAssembler::Address lhsAddr = regAddr(lhs); - pasm()->regToInt32(lhsAddr, PlatformAssembler::ScratchRegister); - pasm()->pushAligned(PlatformAssembler::ScratchRegister); - pasm()->toInt32(); - pasm()->and32(TrustedImm32(0x1f), PlatformAssembler::AccumulatorRegisterValue, - PlatformAssembler::ScratchRegister); - pasm()->popAligned(PlatformAssembler::AccumulatorRegisterValue); - pasm()->lshift32(PlatformAssembler::ScratchRegister, PlatformAssembler::AccumulatorRegisterValue); + pasm()->toInt32LhsAcc(lhsAddr, PlatformAssembler::ScratchRegister); + pasm()->and32(TrustedImm32(0x1f), PlatformAssembler::AccumulatorRegisterValue); + pasm()->lshift32(PlatformAssembler::AccumulatorRegisterValue, PlatformAssembler::ScratchRegister); + pasm()->move(PlatformAssembler::ScratchRegister, PlatformAssembler::AccumulatorRegisterValue); pasm()->setAccumulatorTag(IntegerTag); } |