2008-11-16 Geoffrey Garen <ggaren@apple.com>
Reviewed by Sam Weinig.
Moved masm => assembler and split "AssemblerBuffer.h" out of "X86Assembler.h".
Also renamed ENABLE_MASM to ENABLE_ASSEMBLER.
* GNUmakefile.am:
* JavaScriptCore.xcodeproj/project.pbxproj:
* assembler: Added.
* assembler/AssemblerBuffer.h: Copied from masm/X86Assembler.h.
(JSC::AssemblerBuffer::AssemblerBuffer):
(JSC::AssemblerBuffer::~AssemblerBuffer):
(JSC::AssemblerBuffer::ensureSpace):
(JSC::AssemblerBuffer::isAligned):
(JSC::AssemblerBuffer::putByteUnchecked):
(JSC::AssemblerBuffer::putByte):
(JSC::AssemblerBuffer::putShortUnchecked):
(JSC::AssemblerBuffer::putShort):
(JSC::AssemblerBuffer::putIntUnchecked):
(JSC::AssemblerBuffer::putInt):
(JSC::AssemblerBuffer::data):
(JSC::AssemblerBuffer::size):
(JSC::AssemblerBuffer::reset):
(JSC::AssemblerBuffer::executableCopy):
(JSC::AssemblerBuffer::grow):
* assembler/X86Assembler.h: Copied from masm/X86Assembler.h.
* masm: Removed.
* masm/X86Assembler.h: Removed.
* wtf/Platform.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@38487 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/assembler/AssemblerBuffer.h b/JavaScriptCore/assembler/AssemblerBuffer.h
new file mode 100644
index 0000000..21eeac9
--- /dev/null
+++ b/JavaScriptCore/assembler/AssemblerBuffer.h
@@ -0,0 +1,149 @@
+/*
+ * 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef AssemblerBuffer_h
+#define AssemblerBuffer_h
+
+#include <wtf/Platform.h>
+
+#if ENABLE(ASSEMBLER)
+
+#include <wtf/Assertions.h>
+#include <wtf/FastMalloc.h>
+
+namespace JSC {
+
+ class AssemblerBuffer {
+ public:
+ AssemblerBuffer(int capacity)
+ : m_buffer(static_cast<char*>(fastMalloc(capacity)))
+ , m_capacity(capacity)
+ , m_size(0)
+ {
+ }
+
+ ~AssemblerBuffer()
+ {
+ fastFree(m_buffer);
+ }
+
+ void ensureSpace(int space)
+ {
+ if (m_size > m_capacity - space)
+ grow();
+ }
+
+ bool isAligned(int alignment)
+ {
+ return !(m_size & (alignment - 1));
+ }
+
+ void putByteUnchecked(int value)
+ {
+ ASSERT(!(m_size > m_capacity - 4));
+ m_buffer[m_size] = value;
+ m_size++;
+ }
+
+ void putByte(int value)
+ {
+ if (m_size > m_capacity - 4)
+ grow();
+ putByteUnchecked(value);
+ }
+
+ void putShortUnchecked(int value)
+ {
+ ASSERT(!(m_size > m_capacity - 4));
+ *reinterpret_cast<short*>(&m_buffer[m_size]) = value;
+ m_size += 2;
+ }
+
+ void putShort(int value)
+ {
+ if (m_size > m_capacity - 4)
+ grow();
+ putShortUnchecked(value);
+ }
+
+ void putIntUnchecked(int value)
+ {
+ *reinterpret_cast<int*>(&m_buffer[m_size]) = value;
+ m_size += 4;
+ }
+
+ void putInt(int value)
+ {
+ if (m_size > m_capacity - 4)
+ grow();
+ putIntUnchecked(value);
+ }
+
+ void* data()
+ {
+ return m_buffer;
+ }
+
+ int size()
+ {
+ return m_size;
+ }
+
+ AssemblerBuffer* reset()
+ {
+ m_size = 0;
+ return this;
+ }
+
+ void* executableCopy()
+ {
+ if (!m_size)
+ return 0;
+
+ void* result = WTF::fastMallocExecutable(m_size);
+
+ if (!result)
+ return 0;
+
+ return memcpy(result, m_buffer, m_size);
+ }
+
+ private:
+ void grow()
+ {
+ m_capacity += m_capacity / 2;
+ m_buffer = static_cast<char*>(fastRealloc(m_buffer, m_capacity));
+ }
+
+ char* m_buffer;
+ int m_capacity;
+ int m_size;
+ };
+
+} // namespace JSC
+
+#endif // ENABLE(ASSEMBLER)
+
+#endif // AssemblerBuffer_h
diff --git a/JavaScriptCore/assembler/X86Assembler.h b/JavaScriptCore/assembler/X86Assembler.h
new file mode 100644
index 0000000..d8b91d1
--- /dev/null
+++ b/JavaScriptCore/assembler/X86Assembler.h
@@ -0,0 +1,1164 @@
+/*
+ * 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef X86Assembler_h
+#define X86Assembler_h
+
+#include <wtf/Platform.h>
+
+#if ENABLE(ASSEMBLER) && PLATFORM(X86)
+
+#include "AssemblerBuffer.h"
+#include <wtf/Assertions.h>
+
+namespace JSC {
+
+#define MODRM(type, reg, rm) ((type << 6) | (reg << 3) | (rm))
+#define SIB(type, reg, rm) MODRM(type, reg, rm)
+#define CAN_SIGN_EXTEND_8_32(value) (value == ((int)(signed char)value))
+
+namespace X86 {
+ typedef enum {
+ eax,
+ ecx,
+ edx,
+ ebx,
+ esp,
+ ebp,
+ esi,
+ edi,
+
+ noBase = ebp,
+ hasSib = esp,
+ noScale = esp,
+ } RegisterID;
+
+ typedef enum {
+ xmm0,
+ xmm1,
+ xmm2,
+ xmm3,
+ xmm4,
+ xmm5,
+ xmm6,
+ xmm7,
+ } XMMRegisterID;
+}
+
+class X86Assembler {
+public:
+ typedef X86::RegisterID RegisterID;
+ typedef X86::XMMRegisterID XMMRegisterID;
+
+ typedef enum {
+ OP_ADD_EvGv = 0x01,
+ OP_ADD_GvEv = 0x03,
+ OP_OR_EvGv = 0x09,
+ OP_OR_GvEv = 0x0B,
+ OP_2BYTE_ESCAPE = 0x0F,
+ OP_AND_EvGv = 0x21,
+ OP_SUB_EvGv = 0x29,
+ OP_SUB_GvEv = 0x2B,
+ PRE_PREDICT_BRANCH_NOT_TAKEN = 0x2E,
+ OP_XOR_EvGv = 0x31,
+ OP_CMP_EvGv = 0x39,
+ OP_CMP_GvEv = 0x3B,
+ OP_PUSH_EAX = 0x50,
+ OP_POP_EAX = 0x58,
+ PRE_OPERAND_SIZE = 0x66,
+ PRE_SSE_66 = 0x66,
+ OP_PUSH_Iz = 0x68,
+ OP_IMUL_GvEvIz = 0x69,
+ OP_GROUP1_EvIz = 0x81,
+ OP_GROUP1_EvIb = 0x83,
+ OP_TEST_EvGv = 0x85,
+ OP_MOV_EvGv = 0x89,
+ OP_MOV_GvEv = 0x8B,
+ OP_LEA = 0x8D,
+ OP_GROUP1A_Ev = 0x8F,
+ OP_CDQ = 0x99,
+ OP_SETE = 0x94,
+ OP_SETNE = 0x95,
+ OP_GROUP2_EvIb = 0xC1,
+ OP_RET = 0xC3,
+ OP_GROUP11_EvIz = 0xC7,
+ OP_INT3 = 0xCC,
+ OP_GROUP2_Ev1 = 0xD1,
+ OP_GROUP2_EvCL = 0xD3,
+ OP_CALL_rel32 = 0xE8,
+ OP_JMP_rel32 = 0xE9,
+ PRE_SSE_F2 = 0xF2,
+ OP_HLT = 0xF4,
+ OP_GROUP3_Ev = 0xF7,
+ OP_GROUP3_EvIz = 0xF7, // OP_GROUP3_Ev has an immediate, when instruction is a test.
+ OP_GROUP5_Ev = 0xFF,
+
+ OP2_MOVSD_VsdWsd = 0x10,
+ OP2_MOVSD_WsdVsd = 0x11,
+ OP2_CVTSI2SD_VsdEd = 0x2A,
+ OP2_CVTTSD2SI_GdWsd = 0x2C,
+ OP2_UCOMISD_VsdWsd = 0x2E,
+ OP2_XORPD_VsdWsd = 0x57,
+ OP2_ADDSD_VsdWsd = 0x58,
+ OP2_MULSD_VsdWsd = 0x59,
+ OP2_SUBSD_VsdWsd = 0x5C,
+ OP2_MOVD_EdVd = 0x7E,
+ OP2_JO_rel32 = 0x80,
+ OP2_JB_rel32 = 0x82,
+ OP2_JAE_rel32 = 0x83,
+ OP2_JE_rel32 = 0x84,
+ OP2_JNE_rel32 = 0x85,
+ OP2_JBE_rel32 = 0x86,
+ OP2_JA_rel32 = 0x87,
+ OP2_JS_rel32 = 0x88,
+ OP2_JP_rel32 = 0x8A,
+ OP2_JL_rel32 = 0x8C,
+ OP2_JGE_rel32 = 0x8D,
+ OP2_JLE_rel32 = 0x8E,
+ OP2_JG_rel32 = 0x8F,
+ OP2_IMUL_GvEv = 0xAF,
+ OP2_MOVZX_GvEb = 0xB6,
+ OP2_MOVZX_GvEw = 0xB7,
+ OP2_PEXTRW_GdUdIb = 0xC5,
+
+ GROUP1_OP_ADD = 0,
+ GROUP1_OP_OR = 1,
+ GROUP1_OP_AND = 4,
+ GROUP1_OP_SUB = 5,
+ GROUP1_OP_XOR = 6,
+ GROUP1_OP_CMP = 7,
+
+ GROUP1A_OP_POP = 0,
+
+ GROUP2_OP_SHL = 4,
+ GROUP2_OP_SAR = 7,
+
+ GROUP3_OP_TEST = 0,
+ GROUP3_OP_NEG = 3,
+ GROUP3_OP_IDIV = 7,
+
+ GROUP5_OP_CALLN = 2,
+ GROUP5_OP_JMPN = 4,
+ GROUP5_OP_PUSH = 6,
+
+ GROUP11_MOV = 0,
+ } OpcodeID;
+
+ static const int maxInstructionSize = 16;
+
+ X86Assembler(AssemblerBuffer* m_buffer)
+ : m_buffer(m_buffer)
+ {
+ m_buffer->reset();
+ }
+
+ void emitInt3()
+ {
+ m_buffer->putByte(OP_INT3);
+ }
+
+ void pushl_r(RegisterID reg)
+ {
+ m_buffer->putByte(OP_PUSH_EAX + reg);
+ }
+
+ void pushl_m(int offset, RegisterID base)
+ {
+ m_buffer->putByte(OP_GROUP5_Ev);
+ emitModRm_opm(GROUP5_OP_PUSH, base, offset);
+ }
+
+ void pushl_i32(int imm)
+ {
+ m_buffer->putByte(OP_PUSH_Iz);
+ m_buffer->putInt(imm);
+ }
+
+ void popl_r(RegisterID reg)
+ {
+ m_buffer->putByte(OP_POP_EAX + reg);
+ }
+
+ void popl_m(int offset, RegisterID base)
+ {
+ m_buffer->putByte(OP_GROUP1A_Ev);
+ emitModRm_opm(GROUP1A_OP_POP, base, offset);
+ }
+
+ void movl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_MOV_EvGv);
+ emitModRm_rr(src, dst);
+ }
+
+ void addl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_ADD_EvGv);
+ emitModRm_rr(src, dst);
+ }
+
+ void addl_i8r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIb);
+ emitModRm_opr(GROUP1_OP_ADD, dst);
+ m_buffer->putByte(imm);
+ }
+
+ void addl_i8m(int imm, void* addr)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIb);
+ emitModRm_opm(GROUP1_OP_ADD, addr);
+ m_buffer->putByte(imm);
+ }
+
+ void addl_i32r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIz);
+ emitModRm_opr(GROUP1_OP_ADD, dst);
+ m_buffer->putInt(imm);
+ }
+
+ void addl_mr(int offset, RegisterID base, RegisterID dst)
+ {
+ m_buffer->putByte(OP_ADD_GvEv);
+ emitModRm_rm(dst, base, offset);
+ }
+
+ void andl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_AND_EvGv);
+ emitModRm_rr(src, dst);
+ }
+
+ void andl_i32r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIz);
+ emitModRm_opr(GROUP1_OP_AND, dst);
+ m_buffer->putInt(imm);
+ }
+
+ void cmpl_i8r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIb);
+ emitModRm_opr(GROUP1_OP_CMP, dst);
+ m_buffer->putByte(imm);
+ }
+
+ void cmpl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_CMP_EvGv);
+ emitModRm_rr(src, dst);
+ }
+
+ void cmpl_rm(RegisterID src, int offset, RegisterID base)
+ {
+ m_buffer->putByte(OP_CMP_EvGv);
+ emitModRm_rm(src, base, offset);
+ }
+
+ void cmpl_mr(int offset, RegisterID base, RegisterID dst)
+ {
+ m_buffer->putByte(OP_CMP_GvEv);
+ emitModRm_rm(dst, base, offset);
+ }
+
+ void cmpl_i32r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIz);
+ emitModRm_opr(GROUP1_OP_CMP, dst);
+ m_buffer->putInt(imm);
+ }
+
+ void cmpl_i32m(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIz);
+ emitModRm_opm(GROUP1_OP_CMP, dst);
+ m_buffer->putInt(imm);
+ }
+
+ void cmpl_i32m(int imm, int offset, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIz);
+ emitModRm_opm(GROUP1_OP_CMP, dst, offset);
+ m_buffer->putInt(imm);
+ }
+
+ void cmpl_i32m(int imm, void* addr)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIz);
+ emitModRm_opm(GROUP1_OP_CMP, addr);
+ m_buffer->putInt(imm);
+ }
+
+ void cmpl_i8m(int imm, int offset, RegisterID base, RegisterID index, int scale)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIb);
+ emitModRm_opmsib(GROUP1_OP_CMP, base, index, scale, offset);
+ m_buffer->putByte(imm);
+ }
+
+ void cmpw_rm(RegisterID src, RegisterID base, RegisterID index, int scale)
+ {
+ m_buffer->putByte(PRE_OPERAND_SIZE);
+ m_buffer->putByte(OP_CMP_EvGv);
+ emitModRm_rmsib(src, base, index, scale);
+ }
+
+ void sete_r(RegisterID dst)
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP_SETE);
+ m_buffer->putByte(MODRM(3, 0, dst));
+ }
+
+ void setz_r(RegisterID dst)
+ {
+ sete_r(dst);
+ }
+
+ void setne_r(RegisterID dst)
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP_SETNE);
+ m_buffer->putByte(MODRM(3, 0, dst));
+ }
+
+ void setnz_r(RegisterID dst)
+ {
+ setne_r(dst);
+ }
+
+ void orl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_OR_EvGv);
+ emitModRm_rr(src, dst);
+ }
+
+ void orl_mr(int offset, RegisterID base, RegisterID dst)
+ {
+ m_buffer->putByte(OP_OR_GvEv);
+ emitModRm_rm(dst, base, offset);
+ }
+
+ void orl_i32r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIb);
+ emitModRm_opr(GROUP1_OP_OR, dst);
+ m_buffer->putByte(imm);
+ }
+
+ void subl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_SUB_EvGv);
+ emitModRm_rr(src, dst);
+ }
+
+ void subl_i8r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIb);
+ emitModRm_opr(GROUP1_OP_SUB, dst);
+ m_buffer->putByte(imm);
+ }
+
+ void subl_i8m(int imm, void* addr)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIb);
+ emitModRm_opm(GROUP1_OP_SUB, addr);
+ m_buffer->putByte(imm);
+ }
+
+ void subl_i32r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIz);
+ emitModRm_opr(GROUP1_OP_SUB, dst);
+ m_buffer->putInt(imm);
+ }
+
+ void subl_mr(int offset, RegisterID base, RegisterID dst)
+ {
+ m_buffer->putByte(OP_SUB_GvEv);
+ emitModRm_rm(dst, base, offset);
+ }
+
+ void testl_i32r(int imm, RegisterID dst)
+ {
+ m_buffer->ensureSpace(maxInstructionSize);
+ m_buffer->putByteUnchecked(OP_GROUP3_EvIz);
+ emitModRm_opr_Unchecked(GROUP3_OP_TEST, dst);
+ m_buffer->putIntUnchecked(imm);
+ }
+
+ void testl_i32m(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP3_EvIz);
+ emitModRm_opm(GROUP3_OP_TEST, dst);
+ m_buffer->putInt(imm);
+ }
+
+ void testl_i32m(int imm, int offset, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP3_EvIz);
+ emitModRm_opm(GROUP3_OP_TEST, dst, offset);
+ m_buffer->putInt(imm);
+ }
+
+ void testl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_TEST_EvGv);
+ emitModRm_rr(src, dst);
+ }
+
+ void xorl_i8r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP1_EvIb);
+ emitModRm_opr(GROUP1_OP_XOR, dst);
+ m_buffer->putByte(imm);
+ }
+
+ void xorl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_XOR_EvGv);
+ emitModRm_rr(src, dst);
+ }
+
+ void sarl_i8r(int imm, RegisterID dst)
+ {
+ if (imm == 1) {
+ m_buffer->putByte(OP_GROUP2_Ev1);
+ emitModRm_opr(GROUP2_OP_SAR, dst);
+ } else {
+ m_buffer->putByte(OP_GROUP2_EvIb);
+ emitModRm_opr(GROUP2_OP_SAR, dst);
+ m_buffer->putByte(imm);
+ }
+ }
+
+ void sarl_CLr(RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP2_EvCL);
+ emitModRm_opr(GROUP2_OP_SAR, dst);
+ }
+
+ void shl_i8r(int imm, RegisterID dst)
+ {
+ if (imm == 1) {
+ m_buffer->putByte(OP_GROUP2_Ev1);
+ emitModRm_opr(GROUP2_OP_SHL, dst);
+ } else {
+ m_buffer->putByte(OP_GROUP2_EvIb);
+ emitModRm_opr(GROUP2_OP_SHL, dst);
+ m_buffer->putByte(imm);
+ }
+ }
+
+ void shll_CLr(RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP2_EvCL);
+ emitModRm_opr(GROUP2_OP_SHL, dst);
+ }
+
+ void imull_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_IMUL_GvEv);
+ emitModRm_rr(dst, src);
+ }
+
+ void imull_i32r(RegisterID src, int32_t value, RegisterID dst)
+ {
+ m_buffer->putByte(OP_IMUL_GvEvIz);
+ emitModRm_rr(dst, src);
+ m_buffer->putInt(value);
+ }
+
+ void idivl_r(RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP3_Ev);
+ emitModRm_opr(GROUP3_OP_IDIV, dst);
+ }
+
+ void negl_r(RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP3_Ev);
+ emitModRm_opr(GROUP3_OP_NEG, dst);
+ }
+
+ void cdq()
+ {
+ m_buffer->putByte(OP_CDQ);
+ }
+
+ void movl_mr(RegisterID base, RegisterID dst)
+ {
+ m_buffer->putByte(OP_MOV_GvEv);
+ emitModRm_rm(dst, base);
+ }
+
+ void movl_mr(int offset, RegisterID base, RegisterID dst)
+ {
+ m_buffer->ensureSpace(maxInstructionSize);
+ m_buffer->putByteUnchecked(OP_MOV_GvEv);
+ emitModRm_rm_Unchecked(dst, base, offset);
+ }
+
+ void movl_mr(void* addr, RegisterID dst)
+ {
+ m_buffer->putByte(OP_MOV_GvEv);
+ emitModRm_rm(dst, addr);
+ }
+
+ void movl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
+ {
+ m_buffer->putByte(OP_MOV_GvEv);
+ emitModRm_rmsib(dst, base, index, scale, offset);
+ }
+
+ void movzbl_rr(RegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MOVZX_GvEb);
+ emitModRm_rr(dst, src);
+ }
+
+ void movzwl_mr(int offset, RegisterID base, RegisterID dst)
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MOVZX_GvEw);
+ emitModRm_rm(dst, base, offset);
+ }
+
+ void movzwl_mr(RegisterID base, RegisterID index, int scale, RegisterID dst)
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MOVZX_GvEw);
+ emitModRm_rmsib(dst, base, index, scale);
+ }
+
+ void movzwl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MOVZX_GvEw);
+ emitModRm_rmsib(dst, base, index, scale, offset);
+ }
+
+ void movl_rm(RegisterID src, RegisterID base)
+ {
+ m_buffer->putByte(OP_MOV_EvGv);
+ emitModRm_rm(src, base);
+ }
+
+ void movl_rm(RegisterID src, int offset, RegisterID base)
+ {
+ m_buffer->ensureSpace(maxInstructionSize);
+ m_buffer->putByteUnchecked(OP_MOV_EvGv);
+ emitModRm_rm_Unchecked(src, base, offset);
+ }
+
+ void movl_rm(RegisterID src, int offset, RegisterID base, RegisterID index, int scale)
+ {
+ m_buffer->putByte(OP_MOV_EvGv);
+ emitModRm_rmsib(src, base, index, scale, offset);
+ }
+
+ void movl_i32r(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP11_EvIz);
+ emitModRm_opr(GROUP11_MOV, dst);
+ m_buffer->putInt(imm);
+ }
+
+ void movl_i32m(int imm, int offset, RegisterID base)
+ {
+ m_buffer->ensureSpace(maxInstructionSize);
+ m_buffer->putByteUnchecked(OP_GROUP11_EvIz);
+ emitModRm_opm_Unchecked(GROUP11_MOV, base, offset);
+ m_buffer->putIntUnchecked(imm);
+ }
+
+ void movl_i32m(int imm, void* addr)
+ {
+ m_buffer->putByte(OP_GROUP11_EvIz);
+ emitModRm_opm(GROUP11_MOV, addr);
+ m_buffer->putInt(imm);
+ }
+
+ void leal_mr(int offset, RegisterID base, RegisterID dst)
+ {
+ m_buffer->putByte(OP_LEA);
+ emitModRm_rm(dst, base, offset);
+ }
+
+ void leal_mr(int offset, RegisterID index, int scale, RegisterID dst)
+ {
+ m_buffer->putByte(OP_LEA);
+ emitModRm_rmsib(dst, X86::noBase, index, scale, offset);
+ }
+
+ void ret()
+ {
+ m_buffer->putByte(OP_RET);
+ }
+
+ void jmp_r(RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP5_Ev);
+ emitModRm_opr(GROUP5_OP_JMPN, dst);
+ }
+
+ void jmp_m(int offset, RegisterID base)
+ {
+ m_buffer->putByte(OP_GROUP5_Ev);
+ emitModRm_opm(GROUP5_OP_JMPN, base, offset);
+ }
+
+ void movsd_mr(int offset, RegisterID base, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MOVSD_VsdWsd);
+ emitModRm_rm((RegisterID)dst, base, offset);
+ }
+
+ void xorpd_mr(void* addr, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_66);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_XORPD_VsdWsd);
+ emitModRm_rm((RegisterID)dst, addr);
+ }
+
+ void movsd_rm(XMMRegisterID src, int offset, RegisterID base)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MOVSD_WsdVsd);
+ emitModRm_rm((RegisterID)src, base, offset);
+ }
+
+ void movd_rr(XMMRegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_66);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MOVD_EdVd);
+ emitModRm_rr((RegisterID)src, dst);
+ }
+
+ void cvtsi2sd_rr(RegisterID src, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_CVTSI2SD_VsdEd);
+ emitModRm_rr((RegisterID)dst, src);
+ }
+
+ void cvttsd2si_rr(XMMRegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_CVTTSD2SI_GdWsd);
+ emitModRm_rr(dst, (RegisterID)src);
+ }
+
+ void addsd_mr(int offset, RegisterID base, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_ADDSD_VsdWsd);
+ emitModRm_rm((RegisterID)dst, base, offset);
+ }
+
+ void subsd_mr(int offset, RegisterID base, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_SUBSD_VsdWsd);
+ emitModRm_rm((RegisterID)dst, base, offset);
+ }
+
+ void mulsd_mr(int offset, RegisterID base, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MULSD_VsdWsd);
+ emitModRm_rm((RegisterID)dst, base, offset);
+ }
+
+ void addsd_rr(XMMRegisterID src, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_ADDSD_VsdWsd);
+ emitModRm_rr((RegisterID)dst, (RegisterID)src);
+ }
+
+ void subsd_rr(XMMRegisterID src, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_SUBSD_VsdWsd);
+ emitModRm_rr((RegisterID)dst, (RegisterID)src);
+ }
+
+ void mulsd_rr(XMMRegisterID src, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_F2);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_MULSD_VsdWsd);
+ emitModRm_rr((RegisterID)dst, (RegisterID)src);
+ }
+
+ void ucomis_rr(XMMRegisterID src, XMMRegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_66);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_UCOMISD_VsdWsd);
+ emitModRm_rr((RegisterID)dst, (RegisterID)src);
+ }
+
+ void pextrw_irr(int whichWord, XMMRegisterID src, RegisterID dst)
+ {
+ m_buffer->putByte(PRE_SSE_66);
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_PEXTRW_GdUdIb);
+ emitModRm_rr(dst, (RegisterID)src);
+ m_buffer->putByte(whichWord);
+ }
+
+ // Opaque label types
+
+ class JmpSrc {
+ friend class X86Assembler;
+ public:
+ JmpSrc()
+ : m_offset(-1)
+ {
+ }
+
+ private:
+ JmpSrc(int offset)
+ : m_offset(offset)
+ {
+ }
+
+ int m_offset;
+ };
+
+ class JmpDst {
+ friend class X86Assembler;
+ public:
+ JmpDst()
+ : m_offset(-1)
+ {
+ }
+
+ private:
+ JmpDst(int offset)
+ : m_offset(offset)
+ {
+ }
+
+ int m_offset;
+ };
+
+ // FIXME: make this point to a global label, linked later.
+ JmpSrc emitCall()
+ {
+ m_buffer->putByte(OP_CALL_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitCall(RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP5_Ev);
+ emitModRm_opr(GROUP5_OP_CALLN, dst);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpDst label()
+ {
+ return JmpDst(m_buffer->size());
+ }
+
+ JmpDst align(int alignment)
+ {
+ while (!m_buffer->isAligned(alignment))
+ m_buffer->putByte(OP_HLT);
+
+ return label();
+ }
+
+ JmpSrc emitUnlinkedJmp()
+ {
+ m_buffer->putByte(OP_JMP_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJne()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JNE_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJnz()
+ {
+ return emitUnlinkedJne();
+ }
+
+ JmpSrc emitUnlinkedJe()
+ {
+ m_buffer->ensureSpace(maxInstructionSize);
+ m_buffer->putByteUnchecked(OP_2BYTE_ESCAPE);
+ m_buffer->putByteUnchecked(OP2_JE_rel32);
+ m_buffer->putIntUnchecked(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJl()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JL_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJb()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JB_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJle()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JLE_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJbe()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JBE_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJge()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JGE_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJg()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JG_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJa()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JA_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJae()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JAE_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJo()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JO_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJp()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JP_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ JmpSrc emitUnlinkedJs()
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP2_JS_rel32);
+ m_buffer->putInt(0);
+ return JmpSrc(m_buffer->size());
+ }
+
+ void emitPredictionNotTaken()
+ {
+ m_buffer->putByte(PRE_PREDICT_BRANCH_NOT_TAKEN);
+ }
+
+ void link(JmpSrc from, JmpDst to)
+ {
+ ASSERT(to.m_offset != -1);
+ ASSERT(from.m_offset != -1);
+
+ reinterpret_cast<int*>(reinterpret_cast<ptrdiff_t>(m_buffer->data()) + from.m_offset)[-1] = to.m_offset - from.m_offset;
+ }
+
+ static void linkAbsoluteAddress(void* code, JmpDst useOffset, JmpDst address)
+ {
+ ASSERT(useOffset.m_offset != -1);
+ ASSERT(address.m_offset != -1);
+
+ reinterpret_cast<int*>(reinterpret_cast<ptrdiff_t>(code) + useOffset.m_offset)[-1] = reinterpret_cast<ptrdiff_t>(code) + address.m_offset;
+ }
+
+ static void link(void* code, JmpSrc from, void* to)
+ {
+ ASSERT(from.m_offset != -1);
+
+ reinterpret_cast<int*>(reinterpret_cast<ptrdiff_t>(code) + from.m_offset)[-1] = reinterpret_cast<ptrdiff_t>(to) - (reinterpret_cast<ptrdiff_t>(code) + from.m_offset);
+ }
+
+ static void* getRelocatedAddress(void* code, JmpSrc jump)
+ {
+ return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(code) + jump.m_offset);
+ }
+
+ static void* getRelocatedAddress(void* code, JmpDst jump)
+ {
+ return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(code) + jump.m_offset);
+ }
+
+ static int getDifferenceBetweenLabels(JmpDst src, JmpDst dst)
+ {
+ return dst.m_offset - src.m_offset;
+ }
+
+ static int getDifferenceBetweenLabels(JmpDst src, JmpSrc dst)
+ {
+ return dst.m_offset - src.m_offset;
+ }
+
+ static int getDifferenceBetweenLabels(JmpSrc src, JmpDst dst)
+ {
+ return dst.m_offset - src.m_offset;
+ }
+
+ static void repatchImmediate(intptr_t where, int32_t value)
+ {
+ reinterpret_cast<int32_t*>(where)[-1] = value;
+ }
+
+ static void repatchDisplacement(intptr_t where, intptr_t value)
+ {
+ reinterpret_cast<intptr_t*>(where)[-1] = value;
+ }
+
+ static void repatchBranchOffset(intptr_t where, void* destination)
+ {
+ reinterpret_cast<intptr_t*>(where)[-1] = (reinterpret_cast<intptr_t>(destination) - where);
+ }
+
+ void* executableCopy()
+ {
+ return m_buffer->executableCopy();
+ }
+
+#if COMPILER(MSVC)
+ void emitConvertToFastCall()
+ {
+ movl_mr(4, X86::esp, X86::eax);
+ movl_mr(8, X86::esp, X86::edx);
+ movl_mr(12, X86::esp, X86::ecx);
+ }
+#else
+ void emitConvertToFastCall() {}
+#endif
+
+#if USE(CTI_ARGUMENT)
+ void emitRestoreArgumentReference()
+ {
+#if USE(FAST_CALL_CTI_ARGUMENT)
+ movl_rr(X86::esp, X86::ecx);
+#else
+ movl_rm(X86::esp, 0, X86::esp);
+#endif
+ }
+
+ void emitRestoreArgumentReferenceForTrampoline()
+ {
+#if USE(FAST_CALL_CTI_ARGUMENT)
+ movl_rr(X86::esp, X86::ecx);
+ addl_i32r(4, X86::ecx);
+#endif
+ }
+#else
+ void emitRestoreArgumentReference() {}
+ void emitRestoreArgumentReferenceForTrampoline() {}
+#endif
+
+private:
+ void emitModRm_rr(RegisterID reg, RegisterID rm)
+ {
+ m_buffer->ensureSpace(maxInstructionSize);
+ emitModRm_rr_Unchecked(reg, rm);
+ }
+
+ void emitModRm_rr_Unchecked(RegisterID reg, RegisterID rm)
+ {
+ m_buffer->putByteUnchecked(MODRM(3, reg, rm));
+ }
+
+ void emitModRm_rm(RegisterID reg, void* addr)
+ {
+ m_buffer->putByte(MODRM(0, reg, X86::noBase));
+ m_buffer->putInt((int)addr);
+ }
+
+ void emitModRm_rm(RegisterID reg, RegisterID base)
+ {
+ if (base == X86::esp) {
+ m_buffer->putByte(MODRM(0, reg, X86::hasSib));
+ m_buffer->putByte(SIB(0, X86::noScale, X86::esp));
+ } else
+ m_buffer->putByte(MODRM(0, reg, base));
+ }
+
+ void emitModRm_rm_Unchecked(RegisterID reg, RegisterID base, int offset)
+ {
+ if (base == X86::esp) {
+ if (CAN_SIGN_EXTEND_8_32(offset)) {
+ m_buffer->putByteUnchecked(MODRM(1, reg, X86::hasSib));
+ m_buffer->putByteUnchecked(SIB(0, X86::noScale, X86::esp));
+ m_buffer->putByteUnchecked(offset);
+ } else {
+ m_buffer->putByteUnchecked(MODRM(2, reg, X86::hasSib));
+ m_buffer->putByteUnchecked(SIB(0, X86::noScale, X86::esp));
+ m_buffer->putIntUnchecked(offset);
+ }
+ } else {
+ if (CAN_SIGN_EXTEND_8_32(offset)) {
+ m_buffer->putByteUnchecked(MODRM(1, reg, base));
+ m_buffer->putByteUnchecked(offset);
+ } else {
+ m_buffer->putByteUnchecked(MODRM(2, reg, base));
+ m_buffer->putIntUnchecked(offset);
+ }
+ }
+ }
+
+ void emitModRm_rm(RegisterID reg, RegisterID base, int offset)
+ {
+ m_buffer->ensureSpace(maxInstructionSize);
+ emitModRm_rm_Unchecked(reg, base, offset);
+ }
+
+ void emitModRm_rmsib(RegisterID reg, RegisterID base, RegisterID index, int scale)
+ {
+ int shift = 0;
+ while (scale >>= 1)
+ shift++;
+
+ m_buffer->putByte(MODRM(0, reg, X86::hasSib));
+ m_buffer->putByte(SIB(shift, index, base));
+ }
+
+ void emitModRm_rmsib(RegisterID reg, RegisterID base, RegisterID index, int scale, int offset)
+ {
+ int shift = 0;
+ while (scale >>= 1)
+ shift++;
+
+ if (CAN_SIGN_EXTEND_8_32(offset)) {
+ m_buffer->putByte(MODRM(1, reg, X86::hasSib));
+ m_buffer->putByte(SIB(shift, index, base));
+ m_buffer->putByte(offset);
+ } else {
+ m_buffer->putByte(MODRM(2, reg, X86::hasSib));
+ m_buffer->putByte(SIB(shift, index, base));
+ m_buffer->putInt(offset);
+ }
+ }
+
+ void emitModRm_opr(OpcodeID opcodeID, RegisterID rm)
+ {
+ m_buffer->ensureSpace(maxInstructionSize);
+ emitModRm_opr_Unchecked(opcodeID, rm);
+ }
+
+ void emitModRm_opr_Unchecked(OpcodeID opcodeID, RegisterID rm)
+ {
+ emitModRm_rr_Unchecked(static_cast<RegisterID>(opcodeID), rm);
+ }
+
+ void emitModRm_opm(OpcodeID opcodeID, RegisterID base)
+ {
+ emitModRm_rm(static_cast<RegisterID>(opcodeID), base);
+ }
+
+ void emitModRm_opm_Unchecked(OpcodeID opcodeID, RegisterID base, int offset)
+ {
+ emitModRm_rm_Unchecked(static_cast<RegisterID>(opcodeID), base, offset);
+ }
+
+ void emitModRm_opm(OpcodeID opcodeID, RegisterID base, int offset)
+ {
+ emitModRm_rm(static_cast<RegisterID>(opcodeID), base, offset);
+ }
+
+ void emitModRm_opm(OpcodeID opcodeID, void* addr)
+ {
+ emitModRm_rm(static_cast<RegisterID>(opcodeID), addr);
+ }
+
+ void emitModRm_opmsib(OpcodeID opcodeID, RegisterID base, RegisterID index, int scale, int offset)
+ {
+ emitModRm_rmsib(static_cast<RegisterID>(opcodeID), base, index, scale, offset);
+ }
+
+ AssemblerBuffer* m_buffer;
+};
+
+typedef Vector<X86Assembler::JmpSrc> JmpSrcVector;
+
+} // namespace JSC
+
+#endif // ENABLE(ASSEMBLER) && PLATFORM(X86)
+
+#endif // X86Assembler_h