diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2017-01-17 14:10:14 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-01-30 20:21:35 +0000 |
commit | 4d153329485084f9670e567658038b52fe163078 (patch) | |
tree | e6e5601a92604376725500ce7bf9a2c9034f0901 /src/qml | |
parent | 76171d60a495573d9214ae7240ea4bd105328eb8 (diff) |
Template-specialize the mangling/demangling Assembler::loadDouble/storeDouble
Change-Id: If8e566f31cf036459eba935fadb31359f436454a
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/jit/qv4assembler_p.h | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index 14d94d8ef7..fedbf4d9b9 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -114,6 +114,52 @@ struct AssemblerTargetConfiguration // More things coming here in the future, such as Target OS }; +template <typename MacroAssembler, typename TargetPlatform, int RegisterSize> +struct RegisterSizeDependentAssembler +{ +}; + +template <typename MacroAssembler, typename TargetPlatform> +struct RegisterSizeDependentAssembler<MacroAssembler, TargetPlatform, 4> +{ + using FPRegisterID = typename MacroAssembler::FPRegisterID; + using Address = typename MacroAssembler::Address; + + static void loadDouble(MacroAssembler *as, Address addr, FPRegisterID dest) + { + as->loadDouble(addr, dest); + } + + static void storeDouble(MacroAssembler *as, FPRegisterID source, Address addr) + { + as->storeDouble(source, addr); + } +}; + +template <typename MacroAssembler, typename TargetPlatform> +struct RegisterSizeDependentAssembler<MacroAssembler, TargetPlatform, 8> +{ + using FPRegisterID = typename MacroAssembler::FPRegisterID; + using Address = typename MacroAssembler::Address; + using TrustedImm64 = typename MacroAssembler::TrustedImm64; + + static void loadDouble(MacroAssembler *as, Address addr, FPRegisterID dest) + { + as->load64(addr, TargetPlatform::ReturnValueRegister); + as->move(TrustedImm64(QV4::Value::NaNEncodeMask), TargetPlatform::ScratchRegister); + as->xor64(TargetPlatform::ScratchRegister, TargetPlatform::ReturnValueRegister); + as->move64ToDouble(TargetPlatform::ReturnValueRegister, dest); + } + + static void storeDouble(MacroAssembler *as, FPRegisterID source, Address addr) + { + as->moveDoubleTo64(source, TargetPlatform::ReturnValueRegister); + as->move(TrustedImm64(QV4::Value::NaNEncodeMask), TargetPlatform::ScratchRegister); + as->xor64(TargetPlatform::ScratchRegister, TargetPlatform::ReturnValueRegister); + as->store64(TargetPlatform::ReturnValueRegister, addr); + } +}; + template <typename TargetConfiguration> class Assembler : public TargetConfiguration::MacroAssembler, public TargetConfiguration::Platform { @@ -185,6 +231,8 @@ public: using JITTargetPlatform::platformEnterStandardStackFrame; using JITTargetPlatform::platformLeaveStandardStackFrame; + using RegisterSizeDependentOps = RegisterSizeDependentAssembler<MacroAssembler, JITTargetPlatform, RegisterSize>; + struct LookupCall { Address addr; uint getterSetterOffset; @@ -748,27 +796,16 @@ public: storeDouble(source, ptr); #endif } -#ifdef QV4_USE_64_BIT_VALUE_ENCODING - // We need to (de)mangle the double + void loadDouble(Address addr, FPRegisterID dest) { - load64(addr, ReturnValueRegister); - move(TrustedImm64(QV4::Value::NaNEncodeMask), ScratchRegister); - xor64(ScratchRegister, ReturnValueRegister); - move64ToDouble(ReturnValueRegister, dest); + RegisterSizeDependentOps::loadDouble(this, addr, dest); } void storeDouble(FPRegisterID source, Address addr) { - moveDoubleTo64(source, ReturnValueRegister); - move(TrustedImm64(QV4::Value::NaNEncodeMask), ScratchRegister); - xor64(ScratchRegister, ReturnValueRegister); - store64(ReturnValueRegister, addr); + RegisterSizeDependentOps::storeDouble(this, source, addr); } -#else - using MacroAssembler::loadDouble; - using MacroAssembler::storeDouble; -#endif template <typename Result, typename Source> void copyValue(Result result, Source source); |