2 * Copyright (C) 2008 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef MacroAssemblerX86_h
27 #define MacroAssemblerX86_h
29 #if ENABLE(ASSEMBLER) && CPU(X86)
31 #include "MacroAssemblerX86Common.h"
35 class MacroAssemblerX86 : public MacroAssemblerX86Common {
38 : m_isSSE2Present(isSSE2Present())
42 static const Scale ScalePtr = TimesFour;
44 using MacroAssemblerX86Common::add32;
45 using MacroAssemblerX86Common::and32;
46 using MacroAssemblerX86Common::branchAdd32;
47 using MacroAssemblerX86Common::sub32;
48 using MacroAssemblerX86Common::or32;
49 using MacroAssemblerX86Common::load32;
50 using MacroAssemblerX86Common::store32;
51 using MacroAssemblerX86Common::branch32;
52 using MacroAssemblerX86Common::call;
53 using MacroAssemblerX86Common::loadDouble;
54 using MacroAssemblerX86Common::convertInt32ToDouble;
56 void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
58 m_assembler.leal_mr(imm.m_value, src, dest);
61 void add32(TrustedImm32 imm, AbsoluteAddress address)
63 m_assembler.addl_im(imm.m_value, address.m_ptr);
66 void addWithCarry32(TrustedImm32 imm, AbsoluteAddress address)
68 m_assembler.adcl_im(imm.m_value, address.m_ptr);
71 void and32(TrustedImm32 imm, AbsoluteAddress address)
73 m_assembler.andl_im(imm.m_value, address.m_ptr);
76 void or32(TrustedImm32 imm, AbsoluteAddress address)
78 m_assembler.orl_im(imm.m_value, address.m_ptr);
81 void sub32(TrustedImm32 imm, AbsoluteAddress address)
83 m_assembler.subl_im(imm.m_value, address.m_ptr);
86 void load32(void* address, RegisterID dest)
88 m_assembler.movl_mr(address, dest);
91 void loadDouble(const void* address, FPRegisterID dest)
93 ASSERT(isSSE2Present());
94 m_assembler.movsd_mr(address, dest);
97 void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest)
99 m_assembler.cvtsi2sd_mr(src.m_ptr, dest);
102 void store32(TrustedImm32 imm, void* address)
104 m_assembler.movl_i32m(imm.m_value, address);
107 void store32(RegisterID src, void* address)
109 m_assembler.movl_rm(src, address);
112 Jump branchAdd32(ResultCondition cond, TrustedImm32 src, AbsoluteAddress dest)
114 m_assembler.addl_im(src.m_value, dest.m_ptr);
115 return Jump(m_assembler.jCC(x86Condition(cond)));
118 Jump branch32(RelationalCondition cond, AbsoluteAddress left, RegisterID right)
120 m_assembler.cmpl_rm(right, left.m_ptr);
121 return Jump(m_assembler.jCC(x86Condition(cond)));
124 Jump branch32(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
126 m_assembler.cmpl_im(right.m_value, left.m_ptr);
127 return Jump(m_assembler.jCC(x86Condition(cond)));
132 return Call(m_assembler.call(), Call::Linkable);
135 Call tailRecursiveCall()
137 return Call::fromTailJump(jump());
140 Call makeTailRecursiveCall(Jump oldJump)
142 return Call::fromTailJump(oldJump);
146 DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest)
148 m_assembler.movl_i32r(initialValue.asIntptr(), dest);
149 return DataLabelPtr(this);
152 Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
154 m_assembler.cmpl_ir_force32(initialRightValue.asIntptr(), left);
155 dataLabel = DataLabelPtr(this);
156 return Jump(m_assembler.jCC(x86Condition(cond)));
159 Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
161 m_assembler.cmpl_im_force32(initialRightValue.asIntptr(), left.offset, left.base);
162 dataLabel = DataLabelPtr(this);
163 return Jump(m_assembler.jCC(x86Condition(cond)));
166 DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address)
168 m_assembler.movl_i32m(initialValue.asIntptr(), address.offset, address.base);
169 return DataLabelPtr(this);
172 bool supportsFloatingPoint() const { return m_isSSE2Present; }
173 // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate()
174 bool supportsFloatingPointTruncate() const { return m_isSSE2Present; }
175 bool supportsFloatingPointSqrt() const { return m_isSSE2Present; }
176 bool supportsDoubleBitops() const { return m_isSSE2Present; }
179 const bool m_isSSE2Present;
181 friend class LinkBuffer;
182 friend class RepatchBuffer;
184 static void linkCall(void* code, Call call, FunctionPtr function)
186 X86Assembler::linkCall(code, call.m_label, function.value());
189 static void repatchCall(CodeLocationCall call, CodeLocationLabel destination)
191 X86Assembler::relinkCall(call.dataLocation(), destination.executableAddress());
194 static void repatchCall(CodeLocationCall call, FunctionPtr destination)
196 X86Assembler::relinkCall(call.dataLocation(), destination.executableAddress());
202 #endif // ENABLE(ASSEMBLER)
204 #endif // MacroAssemblerX86_h