• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 Apple Inc. All rights reserved.
3  *
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.
12  *
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.
24  */
25 
26 #ifndef MacroAssembler_h
27 #define MacroAssembler_h
28 
29 #include <wtf/Platform.h>
30 
31 #if ENABLE(ASSEMBLER)
32 
33 #if CPU(ARM_THUMB2)
34 #include "MacroAssemblerARMv7.h"
35 namespace JSC { typedef MacroAssemblerARMv7 MacroAssemblerBase; };
36 
37 #elif CPU(ARM_TRADITIONAL)
38 #include "MacroAssemblerARM.h"
39 namespace JSC { typedef MacroAssemblerARM MacroAssemblerBase; };
40 
41 #elif CPU(X86)
42 #include "MacroAssemblerX86.h"
43 namespace JSC { typedef MacroAssemblerX86 MacroAssemblerBase; };
44 
45 #elif CPU(X86_64)
46 #include "MacroAssemblerX86_64.h"
47 namespace JSC { typedef MacroAssemblerX86_64 MacroAssemblerBase; };
48 
49 #else
50 #error "The MacroAssembler is not supported on this platform."
51 #endif
52 
53 
54 namespace JSC {
55 
56 class MacroAssembler : public MacroAssemblerBase {
57 public:
58 
59     using MacroAssemblerBase::pop;
60     using MacroAssemblerBase::jump;
61     using MacroAssemblerBase::branch32;
62     using MacroAssemblerBase::branch16;
63 #if CPU(X86_64)
64     using MacroAssemblerBase::branchPtr;
65     using MacroAssemblerBase::branchTestPtr;
66 #endif
67 
68 
69     // Platform agnostic onvenience functions,
70     // described in terms of other macro assembly methods.
pop()71     void pop()
72     {
73         addPtr(Imm32(sizeof(void*)), stackPointerRegister);
74     }
75 
76     void peek(RegisterID dest, int index = 0)
77     {
78         loadPtr(Address(stackPointerRegister, (index * sizeof(void*))), dest);
79     }
80 
81     void poke(RegisterID src, int index = 0)
82     {
83         storePtr(src, Address(stackPointerRegister, (index * sizeof(void*))));
84     }
85 
86     void poke(Imm32 value, int index = 0)
87     {
88         store32(value, Address(stackPointerRegister, (index * sizeof(void*))));
89     }
90 
91     void poke(ImmPtr imm, int index = 0)
92     {
93         storePtr(imm, Address(stackPointerRegister, (index * sizeof(void*))));
94     }
95 
96 
97     // Backwards banches, these are currently all implemented using existing forwards branch mechanisms.
branchPtr(Condition cond,RegisterID op1,ImmPtr imm,Label target)98     void branchPtr(Condition cond, RegisterID op1, ImmPtr imm, Label target)
99     {
100         branchPtr(cond, op1, imm).linkTo(target, this);
101     }
102 
branch32(Condition cond,RegisterID op1,RegisterID op2,Label target)103     void branch32(Condition cond, RegisterID op1, RegisterID op2, Label target)
104     {
105         branch32(cond, op1, op2).linkTo(target, this);
106     }
107 
branch32(Condition cond,RegisterID op1,Imm32 imm,Label target)108     void branch32(Condition cond, RegisterID op1, Imm32 imm, Label target)
109     {
110         branch32(cond, op1, imm).linkTo(target, this);
111     }
112 
branch32(Condition cond,RegisterID left,Address right,Label target)113     void branch32(Condition cond, RegisterID left, Address right, Label target)
114     {
115         branch32(cond, left, right).linkTo(target, this);
116     }
117 
branch16(Condition cond,BaseIndex left,RegisterID right,Label target)118     void branch16(Condition cond, BaseIndex left, RegisterID right, Label target)
119     {
120         branch16(cond, left, right).linkTo(target, this);
121     }
122 
branchTestPtr(Condition cond,RegisterID reg,Label target)123     void branchTestPtr(Condition cond, RegisterID reg, Label target)
124     {
125         branchTestPtr(cond, reg).linkTo(target, this);
126     }
127 
jump(Label target)128     void jump(Label target)
129     {
130         jump().linkTo(target, this);
131     }
132 
133 
134     // Ptr methods
135     // On 32-bit platforms (i.e. x86), these methods directly map onto their 32-bit equivalents.
136     // FIXME: should this use a test for 32-bitness instead of this specific exception?
137 #if !CPU(X86_64)
addPtr(RegisterID src,RegisterID dest)138     void addPtr(RegisterID src, RegisterID dest)
139     {
140         add32(src, dest);
141     }
142 
addPtr(Imm32 imm,RegisterID srcDest)143     void addPtr(Imm32 imm, RegisterID srcDest)
144     {
145         add32(imm, srcDest);
146     }
147 
addPtr(ImmPtr imm,RegisterID dest)148     void addPtr(ImmPtr imm, RegisterID dest)
149     {
150         add32(Imm32(imm), dest);
151     }
152 
addPtr(Imm32 imm,RegisterID src,RegisterID dest)153     void addPtr(Imm32 imm, RegisterID src, RegisterID dest)
154     {
155         add32(imm, src, dest);
156     }
157 
andPtr(RegisterID src,RegisterID dest)158     void andPtr(RegisterID src, RegisterID dest)
159     {
160         and32(src, dest);
161     }
162 
andPtr(Imm32 imm,RegisterID srcDest)163     void andPtr(Imm32 imm, RegisterID srcDest)
164     {
165         and32(imm, srcDest);
166     }
167 
orPtr(RegisterID src,RegisterID dest)168     void orPtr(RegisterID src, RegisterID dest)
169     {
170         or32(src, dest);
171     }
172 
orPtr(ImmPtr imm,RegisterID dest)173     void orPtr(ImmPtr imm, RegisterID dest)
174     {
175         or32(Imm32(imm), dest);
176     }
177 
orPtr(Imm32 imm,RegisterID dest)178     void orPtr(Imm32 imm, RegisterID dest)
179     {
180         or32(imm, dest);
181     }
182 
subPtr(RegisterID src,RegisterID dest)183     void subPtr(RegisterID src, RegisterID dest)
184     {
185         sub32(src, dest);
186     }
187 
subPtr(Imm32 imm,RegisterID dest)188     void subPtr(Imm32 imm, RegisterID dest)
189     {
190         sub32(imm, dest);
191     }
192 
subPtr(ImmPtr imm,RegisterID dest)193     void subPtr(ImmPtr imm, RegisterID dest)
194     {
195         sub32(Imm32(imm), dest);
196     }
197 
xorPtr(RegisterID src,RegisterID dest)198     void xorPtr(RegisterID src, RegisterID dest)
199     {
200         xor32(src, dest);
201     }
202 
xorPtr(Imm32 imm,RegisterID srcDest)203     void xorPtr(Imm32 imm, RegisterID srcDest)
204     {
205         xor32(imm, srcDest);
206     }
207 
208 
loadPtr(ImplicitAddress address,RegisterID dest)209     void loadPtr(ImplicitAddress address, RegisterID dest)
210     {
211         load32(address, dest);
212     }
213 
loadPtr(BaseIndex address,RegisterID dest)214     void loadPtr(BaseIndex address, RegisterID dest)
215     {
216         load32(address, dest);
217     }
218 
loadPtr(void * address,RegisterID dest)219     void loadPtr(void* address, RegisterID dest)
220     {
221         load32(address, dest);
222     }
223 
loadPtrWithAddressOffsetPatch(Address address,RegisterID dest)224     DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest)
225     {
226         return load32WithAddressOffsetPatch(address, dest);
227     }
228 
setPtr(Condition cond,RegisterID left,Imm32 right,RegisterID dest)229     void setPtr(Condition cond, RegisterID left, Imm32 right, RegisterID dest)
230     {
231         set32(cond, left, right, dest);
232     }
233 
storePtr(RegisterID src,ImplicitAddress address)234     void storePtr(RegisterID src, ImplicitAddress address)
235     {
236         store32(src, address);
237     }
238 
storePtr(RegisterID src,BaseIndex address)239     void storePtr(RegisterID src, BaseIndex address)
240     {
241         store32(src, address);
242     }
243 
storePtr(RegisterID src,void * address)244     void storePtr(RegisterID src, void* address)
245     {
246         store32(src, address);
247     }
248 
storePtr(ImmPtr imm,ImplicitAddress address)249     void storePtr(ImmPtr imm, ImplicitAddress address)
250     {
251         store32(Imm32(imm), address);
252     }
253 
storePtr(ImmPtr imm,void * address)254     void storePtr(ImmPtr imm, void* address)
255     {
256         store32(Imm32(imm), address);
257     }
258 
storePtrWithAddressOffsetPatch(RegisterID src,Address address)259     DataLabel32 storePtrWithAddressOffsetPatch(RegisterID src, Address address)
260     {
261         return store32WithAddressOffsetPatch(src, address);
262     }
263 
264 
branchPtr(Condition cond,RegisterID left,RegisterID right)265     Jump branchPtr(Condition cond, RegisterID left, RegisterID right)
266     {
267         return branch32(cond, left, right);
268     }
269 
branchPtr(Condition cond,RegisterID left,ImmPtr right)270     Jump branchPtr(Condition cond, RegisterID left, ImmPtr right)
271     {
272         return branch32(cond, left, Imm32(right));
273     }
274 
branchPtr(Condition cond,RegisterID left,Address right)275     Jump branchPtr(Condition cond, RegisterID left, Address right)
276     {
277         return branch32(cond, left, right);
278     }
279 
branchPtr(Condition cond,Address left,RegisterID right)280     Jump branchPtr(Condition cond, Address left, RegisterID right)
281     {
282         return branch32(cond, left, right);
283     }
284 
branchPtr(Condition cond,AbsoluteAddress left,RegisterID right)285     Jump branchPtr(Condition cond, AbsoluteAddress left, RegisterID right)
286     {
287         return branch32(cond, left, right);
288     }
289 
branchPtr(Condition cond,Address left,ImmPtr right)290     Jump branchPtr(Condition cond, Address left, ImmPtr right)
291     {
292         return branch32(cond, left, Imm32(right));
293     }
294 
branchPtr(Condition cond,AbsoluteAddress left,ImmPtr right)295     Jump branchPtr(Condition cond, AbsoluteAddress left, ImmPtr right)
296     {
297         return branch32(cond, left, Imm32(right));
298     }
299 
branchTestPtr(Condition cond,RegisterID reg,RegisterID mask)300     Jump branchTestPtr(Condition cond, RegisterID reg, RegisterID mask)
301     {
302         return branchTest32(cond, reg, mask);
303     }
304 
305     Jump branchTestPtr(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1))
306     {
307         return branchTest32(cond, reg, mask);
308     }
309 
310     Jump branchTestPtr(Condition cond, Address address, Imm32 mask = Imm32(-1))
311     {
312         return branchTest32(cond, address, mask);
313     }
314 
315     Jump branchTestPtr(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1))
316     {
317         return branchTest32(cond, address, mask);
318     }
319 
320 
branchAddPtr(Condition cond,RegisterID src,RegisterID dest)321     Jump branchAddPtr(Condition cond, RegisterID src, RegisterID dest)
322     {
323         return branchAdd32(cond, src, dest);
324     }
325 
branchSubPtr(Condition cond,Imm32 imm,RegisterID dest)326     Jump branchSubPtr(Condition cond, Imm32 imm, RegisterID dest)
327     {
328         return branchSub32(cond, imm, dest);
329     }
330 #endif
331 
332 };
333 
334 } // namespace JSC
335 
336 #endif // ENABLE(ASSEMBLER)
337 
338 #endif // MacroAssembler_h
339