xref: /aosp_15_r20/external/vixl/test/test-code-generation-scopes.cc (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
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