Rubber-stamped by Brady Eidson.
[webbrowser.git] / JavaScriptCore / assembler / MacroAssembler.h
blob858707dbb903353671578361eb5baf3925ce0208
1 /*
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
6 * are met:
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 MacroAssembler_h
27 #define MacroAssembler_h
29 #include <wtf/Platform.h>
31 #if ENABLE(ASSEMBLER)
33 #if PLATFORM(ARM_THUMB2)
34 #include "MacroAssemblerARMv7.h"
35 namespace JSC { typedef MacroAssemblerARMv7 MacroAssemblerBase; };
37 #elif PLATFORM(ARM_TRADITIONAL)
38 #include "MacroAssemblerARM.h"
39 namespace JSC { typedef MacroAssemblerARM MacroAssemblerBase; };
41 #elif PLATFORM(X86)
42 #include "MacroAssemblerX86.h"
43 namespace JSC { typedef MacroAssemblerX86 MacroAssemblerBase; };
45 #elif PLATFORM(X86_64)
46 #include "MacroAssemblerX86_64.h"
47 namespace JSC { typedef MacroAssemblerX86_64 MacroAssemblerBase; };
49 #else
50 #error "The MacroAssembler is not supported on this platform."
51 #endif
54 namespace JSC {
56 class MacroAssembler : public MacroAssemblerBase {
57 public:
59 using MacroAssemblerBase::pop;
60 using MacroAssemblerBase::jump;
61 using MacroAssemblerBase::branch32;
62 using MacroAssemblerBase::branch16;
63 #if PLATFORM(X86_64)
64 using MacroAssemblerBase::branchPtr;
65 using MacroAssemblerBase::branchTestPtr;
66 #endif
69 // Platform agnostic onvenience functions,
70 // described in terms of other macro assembly methods.
71 void pop()
73 addPtr(Imm32(sizeof(void*)), stackPointerRegister);
76 void peek(RegisterID dest, int index = 0)
78 loadPtr(Address(stackPointerRegister, (index * sizeof(void*))), dest);
81 void poke(RegisterID src, int index = 0)
83 storePtr(src, Address(stackPointerRegister, (index * sizeof(void*))));
86 void poke(Imm32 value, int index = 0)
88 store32(value, Address(stackPointerRegister, (index * sizeof(void*))));
91 void poke(ImmPtr imm, int index = 0)
93 storePtr(imm, Address(stackPointerRegister, (index * sizeof(void*))));
97 // Backwards banches, these are currently all implemented using existing forwards branch mechanisms.
98 void branchPtr(Condition cond, RegisterID op1, ImmPtr imm, Label target)
100 branchPtr(cond, op1, imm).linkTo(target, this);
103 void branch32(Condition cond, RegisterID op1, RegisterID op2, Label target)
105 branch32(cond, op1, op2).linkTo(target, this);
108 void branch32(Condition cond, RegisterID op1, Imm32 imm, Label target)
110 branch32(cond, op1, imm).linkTo(target, this);
113 void branch32(Condition cond, RegisterID left, Address right, Label target)
115 branch32(cond, left, right).linkTo(target, this);
118 void branch16(Condition cond, BaseIndex left, RegisterID right, Label target)
120 branch16(cond, left, right).linkTo(target, this);
123 void branchTestPtr(Condition cond, RegisterID reg, Label target)
125 branchTestPtr(cond, reg).linkTo(target, this);
128 void jump(Label target)
130 jump().linkTo(target, this);
134 // Ptr methods
135 // On 32-bit platforms (i.e. x86), these methods directly map onto their 32-bit equivalents.
136 #if !PLATFORM(X86_64)
137 void addPtr(RegisterID src, RegisterID dest)
139 add32(src, dest);
142 void addPtr(Imm32 imm, RegisterID srcDest)
144 add32(imm, srcDest);
147 void addPtr(ImmPtr imm, RegisterID dest)
149 add32(Imm32(imm), dest);
152 void addPtr(Imm32 imm, RegisterID src, RegisterID dest)
154 add32(imm, src, dest);
157 void andPtr(RegisterID src, RegisterID dest)
159 and32(src, dest);
162 void andPtr(Imm32 imm, RegisterID srcDest)
164 and32(imm, srcDest);
167 void orPtr(RegisterID src, RegisterID dest)
169 or32(src, dest);
172 void orPtr(ImmPtr imm, RegisterID dest)
174 or32(Imm32(imm), dest);
177 void orPtr(Imm32 imm, RegisterID dest)
179 or32(imm, dest);
182 void subPtr(RegisterID src, RegisterID dest)
184 sub32(src, dest);
187 void subPtr(Imm32 imm, RegisterID dest)
189 sub32(imm, dest);
192 void subPtr(ImmPtr imm, RegisterID dest)
194 sub32(Imm32(imm), dest);
197 void xorPtr(RegisterID src, RegisterID dest)
199 xor32(src, dest);
202 void xorPtr(Imm32 imm, RegisterID srcDest)
204 xor32(imm, srcDest);
208 void loadPtr(ImplicitAddress address, RegisterID dest)
210 load32(address, dest);
213 void loadPtr(BaseIndex address, RegisterID dest)
215 load32(address, dest);
218 void loadPtr(void* address, RegisterID dest)
220 load32(address, dest);
223 DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest)
225 return load32WithAddressOffsetPatch(address, dest);
228 void setPtr(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
230 set32(cond, left, right, dest);
233 void storePtr(RegisterID src, ImplicitAddress address)
235 store32(src, address);
238 void storePtr(RegisterID src, BaseIndex address)
240 store32(src, address);
243 void storePtr(RegisterID src, void* address)
245 store32(src, address);
248 void storePtr(ImmPtr imm, ImplicitAddress address)
250 store32(Imm32(imm), address);
253 void storePtr(ImmPtr imm, void* address)
255 store32(Imm32(imm), address);
258 DataLabel32 storePtrWithAddressOffsetPatch(RegisterID src, Address address)
260 return store32WithAddressOffsetPatch(src, address);
264 Jump branchPtr(Condition cond, RegisterID left, RegisterID right)
266 return branch32(cond, left, right);
269 Jump branchPtr(Condition cond, RegisterID left, ImmPtr right)
271 return branch32(cond, left, Imm32(right));
274 Jump branchPtr(Condition cond, RegisterID left, Address right)
276 return branch32(cond, left, right);
279 Jump branchPtr(Condition cond, Address left, RegisterID right)
281 return branch32(cond, left, right);
284 Jump branchPtr(Condition cond, AbsoluteAddress left, RegisterID right)
286 return branch32(cond, left, right);
289 Jump branchPtr(Condition cond, Address left, ImmPtr right)
291 return branch32(cond, left, Imm32(right));
294 Jump branchPtr(Condition cond, AbsoluteAddress left, ImmPtr right)
296 return branch32(cond, left, Imm32(right));
299 Jump branchTestPtr(Condition cond, RegisterID reg, RegisterID mask)
301 return branchTest32(cond, reg, mask);
304 Jump branchTestPtr(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1))
306 return branchTest32(cond, reg, mask);
309 Jump branchTestPtr(Condition cond, Address address, Imm32 mask = Imm32(-1))
311 return branchTest32(cond, address, mask);
314 Jump branchTestPtr(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1))
316 return branchTest32(cond, address, mask);
320 Jump branchAddPtr(Condition cond, RegisterID src, RegisterID dest)
322 return branchAdd32(cond, src, dest);
325 Jump branchSubPtr(Condition cond, Imm32 imm, RegisterID dest)
327 return branchSub32(cond, imm, dest);
329 #endif
333 } // namespace JSC
335 #endif // ENABLE(ASSEMBLER)
337 #endif // MacroAssembler_h