diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
commit | 41386e9cb918eed93b3f13648cbef387e371e451 (patch) | |
tree | a97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h | |
parent | e15dd966d523731101f70ccf768bba12435a0208 (diff) | |
download | WebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz |
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h')
-rw-r--r-- | Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h | 88 |
1 files changed, 39 insertions, 49 deletions
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h index b6ae6fc6f..ac09eaca4 100644 --- a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h +++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2014 Apple Inc. All rights reserved. + * Copyright (C) 2008 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -33,7 +33,7 @@ namespace JSC { -class MacroAssemblerX86Common : public AbstractMacroAssembler<X86Assembler, MacroAssemblerX86Common> { +class MacroAssemblerX86Common : public AbstractMacroAssembler<X86Assembler> { public: #if CPU(X86_64) static const X86Registers::RegisterID scratchRegister = X86Registers::r11; @@ -183,18 +183,6 @@ public: and32(imm, dest); } - void countLeadingZeros32(RegisterID src, RegisterID dst) - { - m_assembler.bsr_rr(src, dst); - Jump srcIsNonZero = m_assembler.jCC(x86Condition(NonZero)); - move(TrustedImm32(32), dst); - - Jump skipNonZeroCase = jump(); - srcIsNonZero.link(this); - xor32(TrustedImm32(0x1f), dst); - skipNonZeroCase.link(this); - } - void lshift32(RegisterID shift_amount, RegisterID dest) { ASSERT(shift_amount != dest); @@ -460,7 +448,7 @@ public: { ASSERT(src != dst); static const double negativeZeroConstant = -0.0; - loadDouble(TrustedImmPtr(&negativeZeroConstant), dst); + loadDouble(&negativeZeroConstant, dst); m_assembler.andnpd_rr(src, dst); } @@ -468,7 +456,7 @@ public: { ASSERT(src != dst); static const double negativeZeroConstant = -0.0; - loadDouble(TrustedImmPtr(&negativeZeroConstant), dst); + loadDouble(&negativeZeroConstant, dst); m_assembler.xorpd_rr(src, dst); } @@ -537,12 +525,12 @@ public: m_assembler.movzbl_mr(address.offset, address.base, dest); } - void load8SignedExtendTo32(BaseIndex address, RegisterID dest) + void load8Signed(BaseIndex address, RegisterID dest) { m_assembler.movsbl_mr(address.offset, address.base, address.index, address.scale, dest); } - void load8SignedExtendTo32(ImplicitAddress address, RegisterID dest) + void load8Signed(ImplicitAddress address, RegisterID dest) { m_assembler.movsbl_mr(address.offset, address.base, dest); } @@ -557,12 +545,12 @@ public: m_assembler.movzwl_mr(address.offset, address.base, dest); } - void load16SignedExtendTo32(BaseIndex address, RegisterID dest) + void load16Signed(BaseIndex address, RegisterID dest) { m_assembler.movswl_mr(address.offset, address.base, address.index, address.scale, dest); } - void load16SignedExtendTo32(Address address, RegisterID dest) + void load16Signed(Address address, RegisterID dest) { m_assembler.movswl_mr(address.offset, address.base, dest); } @@ -696,13 +684,13 @@ public: m_assembler.movsd_rr(src, dest); } - void loadDouble(TrustedImmPtr address, FPRegisterID dest) + void loadDouble(const void* address, FPRegisterID dest) { #if CPU(X86) ASSERT(isSSE2Present()); - m_assembler.movsd_mr(address.m_value, dest); + m_assembler.movsd_mr(address, dest); #else - move(address, scratchRegister); + move(TrustedImmPtr(address), scratchRegister); loadDouble(scratchRegister, dest); #endif } @@ -921,17 +909,8 @@ public: m_assembler.cvttsd2si_rr(src, dest); // If the result is zero, it might have been -0.0, and the double comparison won't catch this! -#if CPU(X86_64) - if (negZeroCheck) { - Jump valueIsNonZero = branchTest32(NonZero, dest); - m_assembler.movmskpd_rr(src, scratchRegister); - failureCases.append(branchTest32(NonZero, scratchRegister, TrustedImm32(1))); - valueIsNonZero.link(this); - } -#else if (negZeroCheck) failureCases.append(branchTest32(Zero, dest)); -#endif // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump. convertInt32ToDouble(dest, fpTemp); @@ -1166,16 +1145,13 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - void test32(ResultCondition, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) + void test32(RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { if (mask.m_value == -1) m_assembler.testl_rr(reg, reg); - else if (!(mask.m_value & ~0xff) && reg < X86Registers::esp) { // Using esp and greater as a byte register yields the upper half of the 16 bit registers ax, cx, dx and bx, e.g. esp, register 4, is actually ah. - if (mask.m_value == 0xff) - m_assembler.testb_rr(reg, reg); - else - m_assembler.testb_i8r(mask.m_value, reg); - } else + else if (!(mask.m_value & ~0xff) && reg < X86Registers::esp) // Using esp and greater as a byte register yields the upper half of the 16 bit registers ax, cx, dx and bx, e.g. esp, register 4, is actually ah. + m_assembler.testb_i8r(mask.m_value, reg); + else m_assembler.testl_i32r(mask.m_value, reg); } @@ -1186,7 +1162,7 @@ public: Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { - test32(cond, reg, mask); + test32(reg, mask); return branch(cond); } @@ -1490,14 +1466,28 @@ public: return X86Assembler::maxJumpReplacementSize(); } -#if ENABLE(MASM_PROBE) - // Methods required by the MASM_PROBE mechanism as defined in - // AbstractMacroAssembler.h. - static void printCPURegisters(CPUState&, int indentation = 0); - static void printRegister(CPUState&, RegisterID); - static void printRegister(CPUState&, FPRegisterID); - void probe(ProbeFunction, void* arg1 = 0, void* arg2 = 0); -#endif // ENABLE(MASM_PROBE) +#if USE(MASM_PROBE) + struct CPUState { + #define DECLARE_REGISTER(_type, _regName) \ + _type _regName; + FOR_EACH_CPU_REGISTER(DECLARE_REGISTER) + #undef DECLARE_REGISTER + }; + + struct ProbeContext; + typedef void (*ProbeFunction)(struct ProbeContext*); + + struct ProbeContext { + ProbeFunction probeFunction; + void* arg1; + void* arg2; + CPUState cpu; + + void dump(const char* indentation = 0); + private: + void dumpCPURegisters(const char* indentation); + }; +#endif // USE(MASM_PROBE) protected: X86Assembler::Condition x86Condition(RelationalCondition cond) @@ -1577,7 +1567,7 @@ private: cpuid; mov flags, edx; } -#elif COMPILER(GCC_OR_CLANG) +#elif COMPILER(GCC) asm ( "movl $0x1, %%eax;" "pushl %%ebx;" |