# HG changeset patch # Parent 3700c42a8e822845725a670f9163b63eef9ff929 [JAEGER] Add support for PUSHA/POPA/emulation for X86/X86_64 to masm. diff --git a/js/src/assembler/assembler/MacroAssemblerX86.h b/js/src/assembler/assembler/MacroAssemblerX86.h --- a/js/src/assembler/assembler/MacroAssemblerX86.h +++ b/js/src/assembler/assembler/MacroAssemblerX86.h @@ -183,6 +183,16 @@ public: return label; } + void pushAllRegs() + { + m_assembler.pusha(); + } + + void popAllRegs() + { + m_assembler.popa(); + } + bool supportsFloatingPoint() const { return m_isSSE2Present; } // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() bool supportsFloatingPointTruncate() const { return m_isSSE2Present; } diff --git a/js/src/assembler/assembler/MacroAssemblerX86_64.h b/js/src/assembler/assembler/MacroAssemblerX86_64.h --- a/js/src/assembler/assembler/MacroAssemblerX86_64.h +++ b/js/src/assembler/assembler/MacroAssemblerX86_64.h @@ -509,6 +509,18 @@ public: return label; } + void pushAllRegs() + { + for (int i = X86Registers::eax; i <= X86Registers::r15; i++) + m_assembler.push_r((RegisterID)i); + } + + void popAllRegs() + { + for (int i = X86Registers::r15; i >= X86Registers::eax; i--) + m_assembler.pop_r((RegisterID)i); + } + bool supportsFloatingPoint() const { return true; } // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() bool supportsFloatingPointTruncate() const { return true; } diff --git a/js/src/assembler/assembler/X86Assembler.h b/js/src/assembler/assembler/X86Assembler.h --- a/js/src/assembler/assembler/X86Assembler.h +++ b/js/src/assembler/assembler/X86Assembler.h @@ -195,6 +195,10 @@ private: #endif OP_PUSH_EAX = 0x50, OP_POP_EAX = 0x58, +#if WTF_CPU_X86 + OP_PUSHA = 0x60, + OP_POPA = 0x61, +#endif #if WTF_CPU_X86_64 OP_MOVSXD_GvEv = 0x63, #endif @@ -2022,6 +2026,20 @@ public: m_formatter.prefix(PRE_PREDICT_BRANCH_NOT_TAKEN); } +#if WTF_CPU_X86 + void pusha() + { + js::JaegerSpew(js::JSpew_Insns, IPFX "pusha\n", MAYBE_PAD); + m_formatter.oneByteOp(OP_PUSHA); + } + + void popa() + { + js::JaegerSpew(js::JSpew_Insns, IPFX "popa\n", MAYBE_PAD); + m_formatter.oneByteOp(OP_POPA); + } +#endif + // Assembler admin methods: JmpDst label()