1*f5c631daSSadaf Ebrahimi // Copyright 2017, VIXL authors
2*f5c631daSSadaf Ebrahimi // All rights reserved.
3*f5c631daSSadaf Ebrahimi //
4*f5c631daSSadaf Ebrahimi // Redistribution and use in source and binary forms, with or without
5*f5c631daSSadaf Ebrahimi // modification, are permitted provided that the following conditions are met:
6*f5c631daSSadaf Ebrahimi //
7*f5c631daSSadaf Ebrahimi // * Redistributions of source code must retain the above copyright notice,
8*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer.
9*f5c631daSSadaf Ebrahimi // * Redistributions in binary form must reproduce the above copyright notice,
10*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer in the documentation
11*f5c631daSSadaf Ebrahimi // and/or other materials provided with the distribution.
12*f5c631daSSadaf Ebrahimi // * Neither the name of ARM Limited nor the names of its contributors may be
13*f5c631daSSadaf Ebrahimi // used to endorse or promote products derived from this software without
14*f5c631daSSadaf Ebrahimi // specific prior written permission.
15*f5c631daSSadaf Ebrahimi //
16*f5c631daSSadaf Ebrahimi // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17*f5c631daSSadaf Ebrahimi // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*f5c631daSSadaf Ebrahimi // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*f5c631daSSadaf Ebrahimi // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20*f5c631daSSadaf Ebrahimi // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*f5c631daSSadaf Ebrahimi // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22*f5c631daSSadaf Ebrahimi // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23*f5c631daSSadaf Ebrahimi // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*f5c631daSSadaf Ebrahimi // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25*f5c631daSSadaf Ebrahimi // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*f5c631daSSadaf Ebrahimi
27*f5c631daSSadaf Ebrahimi #include "test-runner.h"
28*f5c631daSSadaf Ebrahimi
29*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
30*f5c631daSSadaf Ebrahimi #include "aarch32/macro-assembler-aarch32.h"
31*f5c631daSSadaf Ebrahimi #include "aarch32/test-utils-aarch32.h"
32*f5c631daSSadaf Ebrahimi #endif
33*f5c631daSSadaf Ebrahimi
34*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
35*f5c631daSSadaf Ebrahimi #include "aarch64/macro-assembler-aarch64.h"
36*f5c631daSSadaf Ebrahimi #endif
37*f5c631daSSadaf Ebrahimi
38*f5c631daSSadaf Ebrahimi #define TEST(name) TEST_(SCOPES_##name)
39*f5c631daSSadaf Ebrahimi
40*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_A32
41*f5c631daSSadaf Ebrahimi #define TEST_A32(name) TEST(name)
42*f5c631daSSadaf Ebrahimi #else
43*f5c631daSSadaf Ebrahimi // Do not add this test to the harness.
44*f5c631daSSadaf Ebrahimi #define TEST_A32(name) void Test##name()
45*f5c631daSSadaf Ebrahimi #endif
46*f5c631daSSadaf Ebrahimi
47*f5c631daSSadaf Ebrahimi #define __ masm.
48*f5c631daSSadaf Ebrahimi
49*f5c631daSSadaf Ebrahimi namespace vixl {
50*f5c631daSSadaf Ebrahimi
51*f5c631daSSadaf Ebrahimi // This file contains tests for code generation scopes.
52*f5c631daSSadaf Ebrahimi
53*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(CodeBufferCheckScope_basic_32)54*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_basic_32) {
55*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
56*f5c631daSSadaf Ebrahimi
57*f5c631daSSadaf Ebrahimi {
58*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope(&masm, aarch32::kA32InstructionSizeInBytes);
59*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
60*f5c631daSSadaf Ebrahimi }
61*f5c631daSSadaf Ebrahimi
62*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
63*f5c631daSSadaf Ebrahimi }
64*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
65*f5c631daSSadaf Ebrahimi
66*f5c631daSSadaf Ebrahimi
67*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(CodeBufferCheckScope_basic_64)68*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_basic_64) {
69*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
70*f5c631daSSadaf Ebrahimi
71*f5c631daSSadaf Ebrahimi {
72*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope(&masm, aarch64::kInstructionSize);
73*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
74*f5c631daSSadaf Ebrahimi }
75*f5c631daSSadaf Ebrahimi
76*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
77*f5c631daSSadaf Ebrahimi }
78*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
79*f5c631daSSadaf Ebrahimi
80*f5c631daSSadaf Ebrahimi
81*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(CodeBufferCheckScope_assembler_use_32)82*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_assembler_use_32) {
83*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
84*f5c631daSSadaf Ebrahimi
85*f5c631daSSadaf Ebrahimi {
86*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope(&masm, 2 * aarch32::kA32InstructionSizeInBytes);
87*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
88*f5c631daSSadaf Ebrahimi __ mov(aarch32::r1, 1);
89*f5c631daSSadaf Ebrahimi }
90*f5c631daSSadaf Ebrahimi
91*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
92*f5c631daSSadaf Ebrahimi }
93*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
94*f5c631daSSadaf Ebrahimi
95*f5c631daSSadaf Ebrahimi
96*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(CodeBufferCheckScope_assembler_use_64)97*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_assembler_use_64) {
98*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
99*f5c631daSSadaf Ebrahimi
100*f5c631daSSadaf Ebrahimi {
101*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope(&masm, 2 * aarch64::kInstructionSize);
102*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
103*f5c631daSSadaf Ebrahimi __ movz(aarch64::x1, 1);
104*f5c631daSSadaf Ebrahimi }
105*f5c631daSSadaf Ebrahimi
106*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
107*f5c631daSSadaf Ebrahimi }
108*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
109*f5c631daSSadaf Ebrahimi
110*f5c631daSSadaf Ebrahimi
111*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(CodeBufferCheckScope_Open_32)112*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_Open_32) {
113*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
114*f5c631daSSadaf Ebrahimi
115*f5c631daSSadaf Ebrahimi {
116*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope;
117*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
118*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch32::kA32InstructionSizeInBytes);
119*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r1, 1);
120*f5c631daSSadaf Ebrahimi }
121*f5c631daSSadaf Ebrahimi
122*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
123*f5c631daSSadaf Ebrahimi }
124*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
125*f5c631daSSadaf Ebrahimi
126*f5c631daSSadaf Ebrahimi
127*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(CodeBufferCheckScope_Open_64)128*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_Open_64) {
129*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
130*f5c631daSSadaf Ebrahimi
131*f5c631daSSadaf Ebrahimi {
132*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope;
133*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
134*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch64::kInstructionSize);
135*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x1, 1);
136*f5c631daSSadaf Ebrahimi }
137*f5c631daSSadaf Ebrahimi
138*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
139*f5c631daSSadaf Ebrahimi }
140*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
141*f5c631daSSadaf Ebrahimi
142*f5c631daSSadaf Ebrahimi
143*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(CodeBufferCheckScope_Close_32)144*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_Close_32) {
145*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
146*f5c631daSSadaf Ebrahimi
147*f5c631daSSadaf Ebrahimi {
148*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope(&masm, aarch32::kA32InstructionSizeInBytes);
149*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
150*f5c631daSSadaf Ebrahimi scope.Close();
151*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r1, 1);
152*f5c631daSSadaf Ebrahimi }
153*f5c631daSSadaf Ebrahimi
154*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
155*f5c631daSSadaf Ebrahimi }
156*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
157*f5c631daSSadaf Ebrahimi
158*f5c631daSSadaf Ebrahimi
159*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(CodeBufferCheckScope_Close_64)160*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_Close_64) {
161*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
162*f5c631daSSadaf Ebrahimi
163*f5c631daSSadaf Ebrahimi {
164*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope(&masm, aarch64::kInstructionSize);
165*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
166*f5c631daSSadaf Ebrahimi scope.Close();
167*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x1, 1);
168*f5c631daSSadaf Ebrahimi }
169*f5c631daSSadaf Ebrahimi
170*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
171*f5c631daSSadaf Ebrahimi }
172*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
173*f5c631daSSadaf Ebrahimi
174*f5c631daSSadaf Ebrahimi
175*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(CodeBufferCheckScope_Open_Close_32)176*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_Open_Close_32) {
177*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
178*f5c631daSSadaf Ebrahimi
179*f5c631daSSadaf Ebrahimi {
180*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope;
181*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
182*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch32::kA32InstructionSizeInBytes);
183*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r1, 1);
184*f5c631daSSadaf Ebrahimi scope.Close();
185*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r2, 2);
186*f5c631daSSadaf Ebrahimi }
187*f5c631daSSadaf Ebrahimi
188*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
189*f5c631daSSadaf Ebrahimi }
190*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
191*f5c631daSSadaf Ebrahimi
192*f5c631daSSadaf Ebrahimi
193*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(CodeBufferCheckScope_Open_Close_64)194*f5c631daSSadaf Ebrahimi TEST(CodeBufferCheckScope_Open_Close_64) {
195*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
196*f5c631daSSadaf Ebrahimi
197*f5c631daSSadaf Ebrahimi {
198*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope;
199*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
200*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch64::kInstructionSize);
201*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x1, 1);
202*f5c631daSSadaf Ebrahimi scope.Close();
203*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x2, 2);
204*f5c631daSSadaf Ebrahimi }
205*f5c631daSSadaf Ebrahimi
206*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
207*f5c631daSSadaf Ebrahimi }
208*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
209*f5c631daSSadaf Ebrahimi
210*f5c631daSSadaf Ebrahimi
211*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(EmissionCheckScope_basic_32)212*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_basic_32) {
213*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
214*f5c631daSSadaf Ebrahimi
215*f5c631daSSadaf Ebrahimi {
216*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm, aarch32::kA32InstructionSizeInBytes);
217*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
218*f5c631daSSadaf Ebrahimi }
219*f5c631daSSadaf Ebrahimi
220*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
221*f5c631daSSadaf Ebrahimi }
222*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
223*f5c631daSSadaf Ebrahimi
224*f5c631daSSadaf Ebrahimi
225*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(EmissionCheckScope_basic_64)226*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_basic_64) {
227*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
228*f5c631daSSadaf Ebrahimi
229*f5c631daSSadaf Ebrahimi {
230*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm, aarch64::kInstructionSize);
231*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
232*f5c631daSSadaf Ebrahimi }
233*f5c631daSSadaf Ebrahimi
234*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
235*f5c631daSSadaf Ebrahimi }
236*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
237*f5c631daSSadaf Ebrahimi
238*f5c631daSSadaf Ebrahimi
239*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(EmissionCheckScope_Open_32)240*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_Open_32) {
241*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
242*f5c631daSSadaf Ebrahimi
243*f5c631daSSadaf Ebrahimi {
244*f5c631daSSadaf Ebrahimi EmissionCheckScope scope;
245*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
246*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch32::kA32InstructionSizeInBytes);
247*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r1, 1);
248*f5c631daSSadaf Ebrahimi }
249*f5c631daSSadaf Ebrahimi
250*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
251*f5c631daSSadaf Ebrahimi }
252*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
253*f5c631daSSadaf Ebrahimi
254*f5c631daSSadaf Ebrahimi
255*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(EmissionCheckScope_Open_64)256*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_Open_64) {
257*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
258*f5c631daSSadaf Ebrahimi
259*f5c631daSSadaf Ebrahimi {
260*f5c631daSSadaf Ebrahimi EmissionCheckScope scope;
261*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
262*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch64::kInstructionSize);
263*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x1, 1);
264*f5c631daSSadaf Ebrahimi }
265*f5c631daSSadaf Ebrahimi
266*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
267*f5c631daSSadaf Ebrahimi }
268*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
269*f5c631daSSadaf Ebrahimi
270*f5c631daSSadaf Ebrahimi
271*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(EmissionCheckScope_Close_32)272*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_Close_32) {
273*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
274*f5c631daSSadaf Ebrahimi
275*f5c631daSSadaf Ebrahimi {
276*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm, aarch32::kA32InstructionSizeInBytes);
277*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
278*f5c631daSSadaf Ebrahimi scope.Close();
279*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r1, 1);
280*f5c631daSSadaf Ebrahimi }
281*f5c631daSSadaf Ebrahimi
282*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
283*f5c631daSSadaf Ebrahimi }
284*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
285*f5c631daSSadaf Ebrahimi
286*f5c631daSSadaf Ebrahimi
287*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(EmissionCheckScope_Close_64)288*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_Close_64) {
289*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
290*f5c631daSSadaf Ebrahimi
291*f5c631daSSadaf Ebrahimi {
292*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm, aarch64::kInstructionSize);
293*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
294*f5c631daSSadaf Ebrahimi scope.Close();
295*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x1, 1);
296*f5c631daSSadaf Ebrahimi }
297*f5c631daSSadaf Ebrahimi
298*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
299*f5c631daSSadaf Ebrahimi }
300*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
301*f5c631daSSadaf Ebrahimi
302*f5c631daSSadaf Ebrahimi
303*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST(EmissionCheckScope_Open_Close_32)304*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_Open_Close_32) {
305*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
306*f5c631daSSadaf Ebrahimi
307*f5c631daSSadaf Ebrahimi {
308*f5c631daSSadaf Ebrahimi EmissionCheckScope scope;
309*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
310*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch32::kA32InstructionSizeInBytes);
311*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r1, 1);
312*f5c631daSSadaf Ebrahimi scope.Close();
313*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r2, 2);
314*f5c631daSSadaf Ebrahimi }
315*f5c631daSSadaf Ebrahimi
316*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
317*f5c631daSSadaf Ebrahimi }
318*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
319*f5c631daSSadaf Ebrahimi
320*f5c631daSSadaf Ebrahimi
321*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(EmissionCheckScope_Open_Close_64)322*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_Open_Close_64) {
323*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
324*f5c631daSSadaf Ebrahimi
325*f5c631daSSadaf Ebrahimi {
326*f5c631daSSadaf Ebrahimi EmissionCheckScope scope;
327*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
328*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch64::kInstructionSize);
329*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x1, 1);
330*f5c631daSSadaf Ebrahimi scope.Close();
331*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x2, 2);
332*f5c631daSSadaf Ebrahimi }
333*f5c631daSSadaf Ebrahimi
334*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
335*f5c631daSSadaf Ebrahimi }
336*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
337*f5c631daSSadaf Ebrahimi
338*f5c631daSSadaf Ebrahimi
339*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
340*f5c631daSSadaf Ebrahimi
341*f5c631daSSadaf Ebrahimi #define ASSERT_LITERAL_POOL_SIZE_32(expected) \
342*f5c631daSSadaf Ebrahimi { \
343*f5c631daSSadaf Ebrahimi aarch32::TestMacroAssembler test(&masm); \
344*f5c631daSSadaf Ebrahimi VIXL_CHECK((expected) == test.GetPoolSize()); \
345*f5c631daSSadaf Ebrahimi }
346*f5c631daSSadaf Ebrahimi
TEST_A32(EmissionCheckScope_emit_pool_32)347*f5c631daSSadaf Ebrahimi TEST_A32(EmissionCheckScope_emit_pool_32) {
348*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
349*f5c631daSSadaf Ebrahimi
350*f5c631daSSadaf Ebrahimi // Make sure the pool is empty;
351*f5c631daSSadaf Ebrahimi masm.EmitLiteralPool(PoolManager<int32_t>::kBranchRequired);
352*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(0);
353*f5c631daSSadaf Ebrahimi
354*f5c631daSSadaf Ebrahimi __ Ldrd(aarch32::r0, aarch32::r1, 0x1234567890abcdef);
355*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(8);
356*f5c631daSSadaf Ebrahimi
357*f5c631daSSadaf Ebrahimi const int kLdrdRange = 255;
358*f5c631daSSadaf Ebrahimi const int kLessThanLdrdRange = 100;
359*f5c631daSSadaf Ebrahimi
360*f5c631daSSadaf Ebrahimi {
361*f5c631daSSadaf Ebrahimi // Check that opening the scope with a reserved space well below the limit
362*f5c631daSSadaf Ebrahimi // at which can generate the literal pool does not force the emission of
363*f5c631daSSadaf Ebrahimi // the pool.
364*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm,
365*f5c631daSSadaf Ebrahimi kLessThanLdrdRange,
366*f5c631daSSadaf Ebrahimi EmissionCheckScope::kMaximumSize);
367*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(8);
368*f5c631daSSadaf Ebrahimi }
369*f5c631daSSadaf Ebrahimi
370*f5c631daSSadaf Ebrahimi {
371*f5c631daSSadaf Ebrahimi // Check that the scope forces emission of the pool if necessary.
372*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm,
373*f5c631daSSadaf Ebrahimi kLdrdRange + 1,
374*f5c631daSSadaf Ebrahimi EmissionCheckScope::kMaximumSize);
375*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(0);
376*f5c631daSSadaf Ebrahimi }
377*f5c631daSSadaf Ebrahimi
378*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
379*f5c631daSSadaf Ebrahimi }
380*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
381*f5c631daSSadaf Ebrahimi
382*f5c631daSSadaf Ebrahimi
383*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
384*f5c631daSSadaf Ebrahimi
385*f5c631daSSadaf Ebrahimi #define ASSERT_LITERAL_POOL_SIZE_64(expected) \
386*f5c631daSSadaf Ebrahimi VIXL_CHECK((expected + aarch64::kInstructionSize) == \
387*f5c631daSSadaf Ebrahimi masm.GetLiteralPoolSize())
388*f5c631daSSadaf Ebrahimi
TEST(EmissionCheckScope_emit_pool_64)389*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_emit_pool_64) {
390*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
391*f5c631daSSadaf Ebrahimi
392*f5c631daSSadaf Ebrahimi // Make sure the pool is empty;
393*f5c631daSSadaf Ebrahimi masm.EmitLiteralPool(aarch64::LiteralPool::kBranchRequired);
394*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(0);
395*f5c631daSSadaf Ebrahimi
396*f5c631daSSadaf Ebrahimi __ Ldr(aarch64::x0, 0x1234567890abcdef);
397*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(8);
398*f5c631daSSadaf Ebrahimi
399*f5c631daSSadaf Ebrahimi {
400*f5c631daSSadaf Ebrahimi // Check that opening the scope with a reserved space well below the limit
401*f5c631daSSadaf Ebrahimi // at which can generate the literal pool does not force the emission of
402*f5c631daSSadaf Ebrahimi // the pool.
403*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm,
404*f5c631daSSadaf Ebrahimi 10 * aarch64::kInstructionSize,
405*f5c631daSSadaf Ebrahimi EmissionCheckScope::kMaximumSize);
406*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(8);
407*f5c631daSSadaf Ebrahimi }
408*f5c631daSSadaf Ebrahimi
409*f5c631daSSadaf Ebrahimi {
410*f5c631daSSadaf Ebrahimi // Check that the scope forces emission of the pool if necessary.
411*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm,
412*f5c631daSSadaf Ebrahimi aarch64::kMaxLoadLiteralRange + 1,
413*f5c631daSSadaf Ebrahimi EmissionCheckScope::kMaximumSize);
414*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(0);
415*f5c631daSSadaf Ebrahimi }
416*f5c631daSSadaf Ebrahimi
417*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
418*f5c631daSSadaf Ebrahimi }
419*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
420*f5c631daSSadaf Ebrahimi
421*f5c631daSSadaf Ebrahimi
422*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_A32(EmissionCheckScope_emit_pool_on_Open_32)423*f5c631daSSadaf Ebrahimi TEST_A32(EmissionCheckScope_emit_pool_on_Open_32) {
424*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
425*f5c631daSSadaf Ebrahimi
426*f5c631daSSadaf Ebrahimi // Make sure the pool is empty;
427*f5c631daSSadaf Ebrahimi masm.EmitLiteralPool(PoolManager<int32_t>::kBranchRequired);
428*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(0);
429*f5c631daSSadaf Ebrahimi
430*f5c631daSSadaf Ebrahimi __ Ldrd(aarch32::r0, aarch32::r1, 0x1234567890abcdef);
431*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(8);
432*f5c631daSSadaf Ebrahimi
433*f5c631daSSadaf Ebrahimi const int kLdrdRange = 255;
434*f5c631daSSadaf Ebrahimi const int kLessThanLdrdRange = 100;
435*f5c631daSSadaf Ebrahimi
436*f5c631daSSadaf Ebrahimi {
437*f5c631daSSadaf Ebrahimi // Check that opening the scope with a reserved space well below the limit
438*f5c631daSSadaf Ebrahimi // at which can generate the literal pool does not force the emission of
439*f5c631daSSadaf Ebrahimi // the pool.
440*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm,
441*f5c631daSSadaf Ebrahimi kLessThanLdrdRange,
442*f5c631daSSadaf Ebrahimi EmissionCheckScope::kMaximumSize);
443*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(8);
444*f5c631daSSadaf Ebrahimi }
445*f5c631daSSadaf Ebrahimi
446*f5c631daSSadaf Ebrahimi {
447*f5c631daSSadaf Ebrahimi // Check that the scope forces emission of the pool if necessary.
448*f5c631daSSadaf Ebrahimi EmissionCheckScope scope(&masm,
449*f5c631daSSadaf Ebrahimi kLdrdRange + 1,
450*f5c631daSSadaf Ebrahimi EmissionCheckScope::kMaximumSize);
451*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(0);
452*f5c631daSSadaf Ebrahimi }
453*f5c631daSSadaf Ebrahimi
454*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
455*f5c631daSSadaf Ebrahimi }
456*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
457*f5c631daSSadaf Ebrahimi
458*f5c631daSSadaf Ebrahimi
459*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(EmissionCheckScope_emit_pool_on_Open_64)460*f5c631daSSadaf Ebrahimi TEST(EmissionCheckScope_emit_pool_on_Open_64) {
461*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
462*f5c631daSSadaf Ebrahimi
463*f5c631daSSadaf Ebrahimi // Make sure the pool is empty;
464*f5c631daSSadaf Ebrahimi masm.EmitLiteralPool(aarch64::LiteralPool::kBranchRequired);
465*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(0);
466*f5c631daSSadaf Ebrahimi
467*f5c631daSSadaf Ebrahimi __ Ldr(aarch64::x0, 0x1234567890abcdef);
468*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(8);
469*f5c631daSSadaf Ebrahimi
470*f5c631daSSadaf Ebrahimi {
471*f5c631daSSadaf Ebrahimi // Check that opening the scope with a reserved space well below the limit
472*f5c631daSSadaf Ebrahimi // at which can generate the literal pool does not force the emission of
473*f5c631daSSadaf Ebrahimi // the pool.
474*f5c631daSSadaf Ebrahimi EmissionCheckScope scope;
475*f5c631daSSadaf Ebrahimi scope.Open(&masm,
476*f5c631daSSadaf Ebrahimi 10 * aarch64::kInstructionSize,
477*f5c631daSSadaf Ebrahimi EmissionCheckScope::kMaximumSize);
478*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(8);
479*f5c631daSSadaf Ebrahimi }
480*f5c631daSSadaf Ebrahimi
481*f5c631daSSadaf Ebrahimi {
482*f5c631daSSadaf Ebrahimi // Check that the scope forces emission of the pool if necessary.
483*f5c631daSSadaf Ebrahimi EmissionCheckScope scope;
484*f5c631daSSadaf Ebrahimi scope.Open(&masm,
485*f5c631daSSadaf Ebrahimi aarch64::kMaxLoadLiteralRange + 1,
486*f5c631daSSadaf Ebrahimi EmissionCheckScope::kMaximumSize);
487*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(0);
488*f5c631daSSadaf Ebrahimi }
489*f5c631daSSadaf Ebrahimi
490*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
491*f5c631daSSadaf Ebrahimi }
492*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
493*f5c631daSSadaf Ebrahimi
494*f5c631daSSadaf Ebrahimi
495*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_A32(ExactAssemblyScope_basic_32)496*f5c631daSSadaf Ebrahimi TEST_A32(ExactAssemblyScope_basic_32) {
497*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
498*f5c631daSSadaf Ebrahimi
499*f5c631daSSadaf Ebrahimi {
500*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope(&masm, aarch32::kA32InstructionSizeInBytes);
501*f5c631daSSadaf Ebrahimi __ nop();
502*f5c631daSSadaf Ebrahimi }
503*f5c631daSSadaf Ebrahimi
504*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
505*f5c631daSSadaf Ebrahimi }
506*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
507*f5c631daSSadaf Ebrahimi
508*f5c631daSSadaf Ebrahimi
509*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(ExactAssemblyScope_basic_64)510*f5c631daSSadaf Ebrahimi TEST(ExactAssemblyScope_basic_64) {
511*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
512*f5c631daSSadaf Ebrahimi
513*f5c631daSSadaf Ebrahimi {
514*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope(&masm, aarch64::kInstructionSize);
515*f5c631daSSadaf Ebrahimi __ nop();
516*f5c631daSSadaf Ebrahimi }
517*f5c631daSSadaf Ebrahimi
518*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
519*f5c631daSSadaf Ebrahimi }
520*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
521*f5c631daSSadaf Ebrahimi
522*f5c631daSSadaf Ebrahimi
523*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_A32(ExactAssemblyScope_Open_32)524*f5c631daSSadaf Ebrahimi TEST_A32(ExactAssemblyScope_Open_32) {
525*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
526*f5c631daSSadaf Ebrahimi
527*f5c631daSSadaf Ebrahimi {
528*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope;
529*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
530*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch32::kA32InstructionSizeInBytes);
531*f5c631daSSadaf Ebrahimi __ mov(aarch32::r1, 1);
532*f5c631daSSadaf Ebrahimi }
533*f5c631daSSadaf Ebrahimi
534*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
535*f5c631daSSadaf Ebrahimi }
536*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
537*f5c631daSSadaf Ebrahimi
538*f5c631daSSadaf Ebrahimi
539*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(ExactAssemblyScope_Open_64)540*f5c631daSSadaf Ebrahimi TEST(ExactAssemblyScope_Open_64) {
541*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
542*f5c631daSSadaf Ebrahimi
543*f5c631daSSadaf Ebrahimi {
544*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope;
545*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
546*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch64::kInstructionSize);
547*f5c631daSSadaf Ebrahimi __ movz(aarch64::x1, 1);
548*f5c631daSSadaf Ebrahimi }
549*f5c631daSSadaf Ebrahimi
550*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
551*f5c631daSSadaf Ebrahimi }
552*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
553*f5c631daSSadaf Ebrahimi
554*f5c631daSSadaf Ebrahimi
555*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_A32(ExactAssemblyScope_Close_32)556*f5c631daSSadaf Ebrahimi TEST_A32(ExactAssemblyScope_Close_32) {
557*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
558*f5c631daSSadaf Ebrahimi
559*f5c631daSSadaf Ebrahimi {
560*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope(&masm, aarch32::kA32InstructionSizeInBytes);
561*f5c631daSSadaf Ebrahimi __ mov(aarch32::r0, 0);
562*f5c631daSSadaf Ebrahimi scope.Close();
563*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r1, 1);
564*f5c631daSSadaf Ebrahimi }
565*f5c631daSSadaf Ebrahimi
566*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
567*f5c631daSSadaf Ebrahimi }
568*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
569*f5c631daSSadaf Ebrahimi
570*f5c631daSSadaf Ebrahimi
571*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(ExactAssemblyScope_Close_64)572*f5c631daSSadaf Ebrahimi TEST(ExactAssemblyScope_Close_64) {
573*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
574*f5c631daSSadaf Ebrahimi
575*f5c631daSSadaf Ebrahimi {
576*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope(&masm, aarch64::kInstructionSize);
577*f5c631daSSadaf Ebrahimi __ movz(aarch64::x0, 0);
578*f5c631daSSadaf Ebrahimi scope.Close();
579*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x1, 1);
580*f5c631daSSadaf Ebrahimi }
581*f5c631daSSadaf Ebrahimi
582*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
583*f5c631daSSadaf Ebrahimi }
584*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
585*f5c631daSSadaf Ebrahimi
586*f5c631daSSadaf Ebrahimi
587*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_A32(ExactAssemblyScope_Open_Close_32)588*f5c631daSSadaf Ebrahimi TEST_A32(ExactAssemblyScope_Open_Close_32) {
589*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
590*f5c631daSSadaf Ebrahimi
591*f5c631daSSadaf Ebrahimi {
592*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope;
593*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r0, 0);
594*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch32::kA32InstructionSizeInBytes);
595*f5c631daSSadaf Ebrahimi __ mov(aarch32::r1, 1);
596*f5c631daSSadaf Ebrahimi scope.Close();
597*f5c631daSSadaf Ebrahimi __ Mov(aarch32::r2, 2);
598*f5c631daSSadaf Ebrahimi }
599*f5c631daSSadaf Ebrahimi
600*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
601*f5c631daSSadaf Ebrahimi }
602*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
603*f5c631daSSadaf Ebrahimi
604*f5c631daSSadaf Ebrahimi
605*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(ExactAssemblyScope_Open_Close_64)606*f5c631daSSadaf Ebrahimi TEST(ExactAssemblyScope_Open_Close_64) {
607*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
608*f5c631daSSadaf Ebrahimi
609*f5c631daSSadaf Ebrahimi {
610*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope;
611*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x0, 0);
612*f5c631daSSadaf Ebrahimi scope.Open(&masm, aarch64::kInstructionSize);
613*f5c631daSSadaf Ebrahimi __ movz(aarch64::x1, 1);
614*f5c631daSSadaf Ebrahimi scope.Close();
615*f5c631daSSadaf Ebrahimi __ Mov(aarch64::x2, 2);
616*f5c631daSSadaf Ebrahimi }
617*f5c631daSSadaf Ebrahimi
618*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
619*f5c631daSSadaf Ebrahimi }
620*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
621*f5c631daSSadaf Ebrahimi
622*f5c631daSSadaf Ebrahimi
623*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_A32(ExactAssemblyScope_32)624*f5c631daSSadaf Ebrahimi TEST_A32(ExactAssemblyScope_32) {
625*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
626*f5c631daSSadaf Ebrahimi
627*f5c631daSSadaf Ebrahimi // By default macro instructions are allowed.
628*f5c631daSSadaf Ebrahimi VIXL_CHECK(!masm.ArePoolsBlocked());
629*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowAssembler());
630*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowMacroInstructions());
631*f5c631daSSadaf Ebrahimi {
632*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope1(&masm, 2 * aarch32::kA32InstructionSizeInBytes);
633*f5c631daSSadaf Ebrahimi VIXL_CHECK(masm.ArePoolsBlocked());
634*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowAssembler());
635*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowMacroInstructions());
636*f5c631daSSadaf Ebrahimi __ nop();
637*f5c631daSSadaf Ebrahimi {
638*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope2(&masm, 1 * aarch32::kA32InstructionSizeInBytes);
639*f5c631daSSadaf Ebrahimi VIXL_CHECK(masm.ArePoolsBlocked());
640*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowAssembler());
641*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowMacroInstructions());
642*f5c631daSSadaf Ebrahimi __ nop();
643*f5c631daSSadaf Ebrahimi }
644*f5c631daSSadaf Ebrahimi VIXL_CHECK(masm.ArePoolsBlocked());
645*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowAssembler());
646*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowMacroInstructions());
647*f5c631daSSadaf Ebrahimi }
648*f5c631daSSadaf Ebrahimi VIXL_CHECK(!masm.ArePoolsBlocked());
649*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowAssembler());
650*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowMacroInstructions());
651*f5c631daSSadaf Ebrahimi
652*f5c631daSSadaf Ebrahimi {
653*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope(&masm, 2 * aarch32::kA32InstructionSizeInBytes);
654*f5c631daSSadaf Ebrahimi __ add(aarch32::r0, aarch32::r0, aarch32::r0);
655*f5c631daSSadaf Ebrahimi __ sub(aarch32::r0, aarch32::r0, aarch32::r0);
656*f5c631daSSadaf Ebrahimi }
657*f5c631daSSadaf Ebrahimi
658*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
659*f5c631daSSadaf Ebrahimi }
660*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
661*f5c631daSSadaf Ebrahimi
662*f5c631daSSadaf Ebrahimi
663*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(ExactAssemblyScope_64)664*f5c631daSSadaf Ebrahimi TEST(ExactAssemblyScope_64) {
665*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
666*f5c631daSSadaf Ebrahimi
667*f5c631daSSadaf Ebrahimi // By default macro instructions are allowed.
668*f5c631daSSadaf Ebrahimi VIXL_CHECK(!masm.ArePoolsBlocked());
669*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowAssembler());
670*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowMacroInstructions());
671*f5c631daSSadaf Ebrahimi {
672*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope1(&masm, 2 * aarch64::kInstructionSize);
673*f5c631daSSadaf Ebrahimi VIXL_CHECK(masm.ArePoolsBlocked());
674*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowAssembler());
675*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowMacroInstructions());
676*f5c631daSSadaf Ebrahimi __ nop();
677*f5c631daSSadaf Ebrahimi {
678*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope2(&masm, 1 * aarch64::kInstructionSize);
679*f5c631daSSadaf Ebrahimi VIXL_CHECK(masm.ArePoolsBlocked());
680*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowAssembler());
681*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowMacroInstructions());
682*f5c631daSSadaf Ebrahimi __ nop();
683*f5c631daSSadaf Ebrahimi }
684*f5c631daSSadaf Ebrahimi VIXL_CHECK(masm.ArePoolsBlocked());
685*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowAssembler());
686*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowMacroInstructions());
687*f5c631daSSadaf Ebrahimi }
688*f5c631daSSadaf Ebrahimi VIXL_CHECK(!masm.ArePoolsBlocked());
689*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!masm.AllowAssembler());
690*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm.AllowMacroInstructions());
691*f5c631daSSadaf Ebrahimi
692*f5c631daSSadaf Ebrahimi {
693*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope(&masm, 2 * aarch64::kInstructionSize);
694*f5c631daSSadaf Ebrahimi __ add(aarch64::x0, aarch64::x0, aarch64::x0);
695*f5c631daSSadaf Ebrahimi __ sub(aarch64::x0, aarch64::x0, aarch64::x0);
696*f5c631daSSadaf Ebrahimi }
697*f5c631daSSadaf Ebrahimi
698*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
699*f5c631daSSadaf Ebrahimi }
700*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
701*f5c631daSSadaf Ebrahimi
702*f5c631daSSadaf Ebrahimi
703*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_A32(ExactAssemblyScope_scope_with_pools_32)704*f5c631daSSadaf Ebrahimi TEST_A32(ExactAssemblyScope_scope_with_pools_32) {
705*f5c631daSSadaf Ebrahimi aarch32::MacroAssembler masm;
706*f5c631daSSadaf Ebrahimi
707*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(0);
708*f5c631daSSadaf Ebrahimi
709*f5c631daSSadaf Ebrahimi __ Ldrd(aarch32::r0, aarch32::r1, 0x1234567890abcdef);
710*f5c631daSSadaf Ebrahimi
711*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(8);
712*f5c631daSSadaf Ebrahimi
713*f5c631daSSadaf Ebrahimi const int32_t kLdrdRange = 255;
714*f5c631daSSadaf Ebrahimi const int32_t n_nops = (kLdrdRange / aarch32::kA32InstructionSizeInBytes) + 1;
715*f5c631daSSadaf Ebrahimi {
716*f5c631daSSadaf Ebrahimi // The literal pool should be generated when opening this scope, as
717*f5c631daSSadaf Ebrahimi // otherwise the `Ldrd` will run out of range when we generate the `nop`
718*f5c631daSSadaf Ebrahimi // instructions below.
719*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope(&masm,
720*f5c631daSSadaf Ebrahimi n_nops * aarch32::kA32InstructionSizeInBytes);
721*f5c631daSSadaf Ebrahimi
722*f5c631daSSadaf Ebrahimi // Although it must be, we do not check that the literal pool size is zero
723*f5c631daSSadaf Ebrahimi // here, because we want this regression test to fail while or after we
724*f5c631daSSadaf Ebrahimi // generate the nops.
725*f5c631daSSadaf Ebrahimi
726*f5c631daSSadaf Ebrahimi for (int32_t i = 0; i < n_nops; ++i) {
727*f5c631daSSadaf Ebrahimi __ nop();
728*f5c631daSSadaf Ebrahimi }
729*f5c631daSSadaf Ebrahimi }
730*f5c631daSSadaf Ebrahimi
731*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_32(0);
732*f5c631daSSadaf Ebrahimi
733*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
734*f5c631daSSadaf Ebrahimi }
735*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH32
736*f5c631daSSadaf Ebrahimi
737*f5c631daSSadaf Ebrahimi
738*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST(ExactAssemblyScope_scope_with_pools_64)739*f5c631daSSadaf Ebrahimi TEST(ExactAssemblyScope_scope_with_pools_64) {
740*f5c631daSSadaf Ebrahimi aarch64::MacroAssembler masm;
741*f5c631daSSadaf Ebrahimi
742*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(0);
743*f5c631daSSadaf Ebrahimi
744*f5c631daSSadaf Ebrahimi __ Ldr(aarch64::x10, 0x1234567890abcdef);
745*f5c631daSSadaf Ebrahimi
746*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(8);
747*f5c631daSSadaf Ebrahimi
748*f5c631daSSadaf Ebrahimi const int64_t n_nops =
749*f5c631daSSadaf Ebrahimi aarch64::kMaxLoadLiteralRange / aarch64::kInstructionSize;
750*f5c631daSSadaf Ebrahimi {
751*f5c631daSSadaf Ebrahimi // The literal pool should be generated when opening this scope, as
752*f5c631daSSadaf Ebrahimi // otherwise the `Ldr` will run out of range when we generate the `nop`
753*f5c631daSSadaf Ebrahimi // instructions below.
754*f5c631daSSadaf Ebrahimi ExactAssemblyScope scope(&masm, n_nops * aarch64::kInstructionSize);
755*f5c631daSSadaf Ebrahimi
756*f5c631daSSadaf Ebrahimi // Although it must be, we do not check that the literal pool size is zero
757*f5c631daSSadaf Ebrahimi // here, because we want this regression test to fail while or after we
758*f5c631daSSadaf Ebrahimi // generate the nops.
759*f5c631daSSadaf Ebrahimi
760*f5c631daSSadaf Ebrahimi for (int64_t i = 0; i < n_nops; ++i) {
761*f5c631daSSadaf Ebrahimi __ nop();
762*f5c631daSSadaf Ebrahimi }
763*f5c631daSSadaf Ebrahimi }
764*f5c631daSSadaf Ebrahimi
765*f5c631daSSadaf Ebrahimi ASSERT_LITERAL_POOL_SIZE_64(0);
766*f5c631daSSadaf Ebrahimi
767*f5c631daSSadaf Ebrahimi masm.FinalizeCode();
768*f5c631daSSadaf Ebrahimi }
769*f5c631daSSadaf Ebrahimi #endif // VIXL_INCLUDE_TARGET_AARCH64
770*f5c631daSSadaf Ebrahimi
771*f5c631daSSadaf Ebrahimi
772*f5c631daSSadaf Ebrahimi } // namespace vixl
773