xref: /aosp_15_r20/external/vixl/test/test-use-scratch-register-scope.cc (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
1*f5c631daSSadaf Ebrahimi // Copyright 2016, 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 <stdlib.h>
28*f5c631daSSadaf Ebrahimi 
29*f5c631daSSadaf Ebrahimi #include "test-runner.h"
30*f5c631daSSadaf Ebrahimi 
31*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
32*f5c631daSSadaf Ebrahimi #include "aarch32/macro-assembler-aarch32.h"
33*f5c631daSSadaf Ebrahimi #endif
34*f5c631daSSadaf Ebrahimi 
35*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
36*f5c631daSSadaf Ebrahimi #include "aarch64/macro-assembler-aarch64.h"
37*f5c631daSSadaf Ebrahimi #endif
38*f5c631daSSadaf Ebrahimi 
39*f5c631daSSadaf Ebrahimi #define STRINGIFY(x) #x
40*f5c631daSSadaf Ebrahimi 
41*f5c631daSSadaf Ebrahimi #define TEST_AARCH32(Name)                                                \
42*f5c631daSSadaf Ebrahimi   namespace aarch32 {                                                     \
43*f5c631daSSadaf Ebrahimi   void Test_##Name##_AArch32_Impl();                                      \
44*f5c631daSSadaf Ebrahimi   }                                                                       \
45*f5c631daSSadaf Ebrahimi   void Test_##Name##_AArch32() { aarch32::Test_##Name##_AArch32_Impl(); } \
46*f5c631daSSadaf Ebrahimi   Test test_##Name##_AArch32(STRINGIFY(AARCH32_SCRATCH_##Name),           \
47*f5c631daSSadaf Ebrahimi                              &Test_##Name##_AArch32);                     \
48*f5c631daSSadaf Ebrahimi   void aarch32::Test_##Name##_AArch32_Impl()
49*f5c631daSSadaf Ebrahimi 
50*f5c631daSSadaf Ebrahimi #define TEST_AARCH64(Name)                                                \
51*f5c631daSSadaf Ebrahimi   namespace aarch64 {                                                     \
52*f5c631daSSadaf Ebrahimi   void Test_##Name##_AArch64_Impl();                                      \
53*f5c631daSSadaf Ebrahimi   }                                                                       \
54*f5c631daSSadaf Ebrahimi   void Test_##Name##_AArch64() { aarch64::Test_##Name##_AArch64_Impl(); } \
55*f5c631daSSadaf Ebrahimi   Test test_##Name##_AArch64(STRINGIFY(AARCH64_SCRATCH_##Name),           \
56*f5c631daSSadaf Ebrahimi                              &Test_##Name##_AArch64);                     \
57*f5c631daSSadaf Ebrahimi   void aarch64::Test_##Name##_AArch64_Impl()
58*f5c631daSSadaf Ebrahimi 
59*f5c631daSSadaf Ebrahimi #define SETUP() MacroAssembler masm
60*f5c631daSSadaf Ebrahimi 
61*f5c631daSSadaf Ebrahimi #define __ masm.
62*f5c631daSSadaf Ebrahimi 
63*f5c631daSSadaf Ebrahimi namespace vixl {
64*f5c631daSSadaf Ebrahimi 
65*f5c631daSSadaf Ebrahimi // UseScratchRegisterScopes must be able to nest perfectly. That is, they may
66*f5c631daSSadaf Ebrahimi // nest, but nested scopes must not outlive less-nested scopes.
67*f5c631daSSadaf Ebrahimi template <typename MacroAssembler, typename UseScratchRegisterScope>
68*f5c631daSSadaf Ebrahimi class PerfectNestingTestHelper {
69*f5c631daSSadaf Ebrahimi  public:
PerfectNestingTestHelper(MacroAssembler * masm)70*f5c631daSSadaf Ebrahimi   explicit PerfectNestingTestHelper(MacroAssembler* masm) : masm_(masm) {
71*f5c631daSSadaf Ebrahimi     uint16_t seed[3] = {4, 5, 6};
72*f5c631daSSadaf Ebrahimi     seed48(seed);
73*f5c631daSSadaf Ebrahimi   }
Run()74*f5c631daSSadaf Ebrahimi   void Run() {
75*f5c631daSSadaf Ebrahimi     UseScratchRegisterScope* top_scope =
76*f5c631daSSadaf Ebrahimi         masm_->GetCurrentScratchRegisterScope();
77*f5c631daSSadaf Ebrahimi     int descendents = 0;
78*f5c631daSSadaf Ebrahimi     while (descendents < kMinimumDescendentScopeCount) descendents += Run(0);
79*f5c631daSSadaf Ebrahimi     VIXL_CHECK(masm_->GetCurrentScratchRegisterScope() == top_scope);
80*f5c631daSSadaf Ebrahimi   }
81*f5c631daSSadaf Ebrahimi 
82*f5c631daSSadaf Ebrahimi  private:
Run(int depth)83*f5c631daSSadaf Ebrahimi   int Run(int depth) {
84*f5c631daSSadaf Ebrahimi     // As the depth increases, the probability of recursion decreases.
85*f5c631daSSadaf Ebrahimi     // At depth = kDepthLimit, we never recurse.
86*f5c631daSSadaf Ebrahimi     int max_children = static_cast<int>(std::abs(mrand48()) % kDepthLimit);
87*f5c631daSSadaf Ebrahimi     int children = std::max(0, max_children - depth);
88*f5c631daSSadaf Ebrahimi     int descendents = children;
89*f5c631daSSadaf Ebrahimi     while (children-- > 0) {
90*f5c631daSSadaf Ebrahimi       UseScratchRegisterScope scope(masm_);
91*f5c631daSSadaf Ebrahimi       VIXL_CHECK(masm_->GetCurrentScratchRegisterScope() == &scope);
92*f5c631daSSadaf Ebrahimi       descendents += Run(depth + 1);
93*f5c631daSSadaf Ebrahimi       VIXL_CHECK(masm_->GetCurrentScratchRegisterScope() == &scope);
94*f5c631daSSadaf Ebrahimi     }
95*f5c631daSSadaf Ebrahimi     return descendents;
96*f5c631daSSadaf Ebrahimi   }
97*f5c631daSSadaf Ebrahimi 
98*f5c631daSSadaf Ebrahimi   MacroAssembler* masm_;
99*f5c631daSSadaf Ebrahimi   static const int kDepthLimit = 12;
100*f5c631daSSadaf Ebrahimi   static const int kMinimumDescendentScopeCount = 10000;
101*f5c631daSSadaf Ebrahimi };
102*f5c631daSSadaf Ebrahimi 
103*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_AARCH32(perfect_nesting)104*f5c631daSSadaf Ebrahimi TEST_AARCH32(perfect_nesting) {
105*f5c631daSSadaf Ebrahimi   SETUP();
106*f5c631daSSadaf Ebrahimi   PerfectNestingTestHelper<MacroAssembler, UseScratchRegisterScope>(&masm)
107*f5c631daSSadaf Ebrahimi       .Run();
108*f5c631daSSadaf Ebrahimi }
109*f5c631daSSadaf Ebrahimi #endif  // VIXL_INCLUDE_TARGET_AARCH32
110*f5c631daSSadaf Ebrahimi 
111*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH64
TEST_AARCH64(perfect_nesting)112*f5c631daSSadaf Ebrahimi TEST_AARCH64(perfect_nesting) {
113*f5c631daSSadaf Ebrahimi   SETUP();
114*f5c631daSSadaf Ebrahimi   PerfectNestingTestHelper<MacroAssembler, UseScratchRegisterScope>(&masm)
115*f5c631daSSadaf Ebrahimi       .Run();
116*f5c631daSSadaf Ebrahimi }
117*f5c631daSSadaf Ebrahimi #endif  // VIXL_INCLUDE_TARGET_AARCH64
118*f5c631daSSadaf Ebrahimi 
119*f5c631daSSadaf Ebrahimi 
120*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_AARCH32(v_registers)121*f5c631daSSadaf Ebrahimi TEST_AARCH32(v_registers) {
122*f5c631daSSadaf Ebrahimi   SETUP();
123*f5c631daSSadaf Ebrahimi   {
124*f5c631daSSadaf Ebrahimi     UseScratchRegisterScope temps(&masm);
125*f5c631daSSadaf Ebrahimi     temps.Include(VRegisterList(q0, q1, q2, q3));
126*f5c631daSSadaf Ebrahimi 
127*f5c631daSSadaf Ebrahimi     // This test assumes that low-numbered registers are allocated first. The
128*f5c631daSSadaf Ebrahimi     // implementation is allowed to use a different strategy; if it does, the
129*f5c631daSSadaf Ebrahimi     // test will need to be updated.
130*f5c631daSSadaf Ebrahimi     // TODO: Write more flexible (and thorough) tests.
131*f5c631daSSadaf Ebrahimi 
132*f5c631daSSadaf Ebrahimi     VIXL_CHECK(q0.Is(temps.AcquireQ()));
133*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(q0));
134*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(d0));
135*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(d1));
136*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s0));
137*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s1));
138*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s2));
139*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s3));
140*f5c631daSSadaf Ebrahimi 
141*f5c631daSSadaf Ebrahimi     VIXL_CHECK(d2.Is(temps.AcquireV(64)));
142*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(q1));
143*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(d2));
144*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(d3));
145*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s4));
146*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s5));
147*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s6));
148*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s7));
149*f5c631daSSadaf Ebrahimi 
150*f5c631daSSadaf Ebrahimi     VIXL_CHECK(s6.Is(temps.AcquireS()));
151*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(d3));
152*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s6));
153*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s7));
154*f5c631daSSadaf Ebrahimi 
155*f5c631daSSadaf Ebrahimi     VIXL_CHECK(q2.Is(temps.AcquireV(128)));
156*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(q2));
157*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(d4));
158*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(d5));
159*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s8));
160*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s9));
161*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s10));
162*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s11));
163*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s7));
164*f5c631daSSadaf Ebrahimi 
165*f5c631daSSadaf Ebrahimi     VIXL_CHECK(d6.Is(temps.AcquireD()));
166*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(q3));
167*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(d6));
168*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(d7));
169*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s12));
170*f5c631daSSadaf Ebrahimi     VIXL_CHECK(!temps.IsAvailable(s13));
171*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s14));
172*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s15));
173*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s7));
174*f5c631daSSadaf Ebrahimi 
175*f5c631daSSadaf Ebrahimi     VIXL_CHECK(s7.Is(temps.AcquireS()));
176*f5c631daSSadaf Ebrahimi   }
177*f5c631daSSadaf Ebrahimi }
178*f5c631daSSadaf Ebrahimi #endif  // VIXL_INCLUDE_TARGET_AARCH32
179*f5c631daSSadaf Ebrahimi 
180*f5c631daSSadaf Ebrahimi 
181*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_AARCH32
TEST_AARCH32(include_exclude)182*f5c631daSSadaf Ebrahimi TEST_AARCH32(include_exclude) {
183*f5c631daSSadaf Ebrahimi   SETUP();
184*f5c631daSSadaf Ebrahimi   {
185*f5c631daSSadaf Ebrahimi     UseScratchRegisterScope temps(&masm);
186*f5c631daSSadaf Ebrahimi     temps.Include(r0, r1, r2, r3);
187*f5c631daSSadaf Ebrahimi     temps.Include(s0, s1, d1, q1);
188*f5c631daSSadaf Ebrahimi 
189*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(r0));
190*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(r1));
191*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(r2));
192*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(r3));
193*f5c631daSSadaf Ebrahimi 
194*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s0));
195*f5c631daSSadaf Ebrahimi 
196*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s1));
197*f5c631daSSadaf Ebrahimi 
198*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(d1));
199*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s2));
200*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s3));
201*f5c631daSSadaf Ebrahimi 
202*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(q1));
203*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(d2));
204*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(d3));
205*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s4));
206*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s5));
207*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s6));
208*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s7));
209*f5c631daSSadaf Ebrahimi 
210*f5c631daSSadaf Ebrahimi     // Test local exclusion.
211*f5c631daSSadaf Ebrahimi     {
212*f5c631daSSadaf Ebrahimi       UseScratchRegisterScope local_temps(&masm);
213*f5c631daSSadaf Ebrahimi       local_temps.Exclude(r1, r2);
214*f5c631daSSadaf Ebrahimi       local_temps.Exclude(s1, q1);
215*f5c631daSSadaf Ebrahimi 
216*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(r0));
217*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(r1));
218*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(r2));
219*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(r3));
220*f5c631daSSadaf Ebrahimi 
221*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(s0));
222*f5c631daSSadaf Ebrahimi 
223*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(s1));
224*f5c631daSSadaf Ebrahimi 
225*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(d1));
226*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(s2));
227*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(s3));
228*f5c631daSSadaf Ebrahimi 
229*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(q1));
230*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(d2));
231*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(d3));
232*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(s4));
233*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(s5));
234*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(s6));
235*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(s7));
236*f5c631daSSadaf Ebrahimi     }
237*f5c631daSSadaf Ebrahimi 
238*f5c631daSSadaf Ebrahimi     // This time, exclude part of included registers, making sure the entire
239*f5c631daSSadaf Ebrahimi     // register gets excluded.
240*f5c631daSSadaf Ebrahimi     {
241*f5c631daSSadaf Ebrahimi       UseScratchRegisterScope local_temps(&masm);
242*f5c631daSSadaf Ebrahimi       local_temps.Exclude(s2, d3);
243*f5c631daSSadaf Ebrahimi 
244*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(r0));
245*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(r1));
246*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(r2));
247*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(r3));
248*f5c631daSSadaf Ebrahimi 
249*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(s0));
250*f5c631daSSadaf Ebrahimi 
251*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(s1));
252*f5c631daSSadaf Ebrahimi 
253*f5c631daSSadaf Ebrahimi       // Excluding s2 should exclude d1 but not s3.
254*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(d1));
255*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(s2));
256*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(s3));
257*f5c631daSSadaf Ebrahimi 
258*f5c631daSSadaf Ebrahimi       // Excluding d3 should exclude q1, s7 and s6 but not d2, s5, s4.
259*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(q1));
260*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(d2));
261*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(d3));
262*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(s4));
263*f5c631daSSadaf Ebrahimi       VIXL_CHECK(temps.IsAvailable(s5));
264*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(s6));
265*f5c631daSSadaf Ebrahimi       VIXL_CHECK(!temps.IsAvailable(s7));
266*f5c631daSSadaf Ebrahimi     }
267*f5c631daSSadaf Ebrahimi 
268*f5c631daSSadaf Ebrahimi     // Make sure the initial state was restored.
269*f5c631daSSadaf Ebrahimi 
270*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(r0));
271*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(r1));
272*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(r2));
273*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(r3));
274*f5c631daSSadaf Ebrahimi 
275*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s0));
276*f5c631daSSadaf Ebrahimi 
277*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s1));
278*f5c631daSSadaf Ebrahimi 
279*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(d1));
280*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s2));
281*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s3));
282*f5c631daSSadaf Ebrahimi 
283*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(q1));
284*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(d2));
285*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(d3));
286*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s4));
287*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s5));
288*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s6));
289*f5c631daSSadaf Ebrahimi     VIXL_CHECK(temps.IsAvailable(s7));
290*f5c631daSSadaf Ebrahimi   }
291*f5c631daSSadaf Ebrahimi }
292*f5c631daSSadaf Ebrahimi #endif  // VIXL_INCLUDE_TARGET_AARCH32
293*f5c631daSSadaf Ebrahimi 
294*f5c631daSSadaf Ebrahimi }  // namespace vixl
295