test-assembler-a64.cc revision f37fdc0b307fc66239b8b754b0465d36bc0f8aed
1ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Copyright 2013, ARM Limited
2ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// All rights reserved.
3ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
4ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Redistribution and use in source and binary forms, with or without
5ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// modification, are permitted provided that the following conditions are met:
6ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
7ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   * Redistributions of source code must retain the above copyright notice,
8ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     this list of conditions and the following disclaimer.
9ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   * Redistributions in binary form must reproduce the above copyright notice,
10ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     this list of conditions and the following disclaimer in the documentation
11ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     and/or other materials provided with the distribution.
12ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   * Neither the name of ARM Limited nor the names of its contributors may be
13ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     used to endorse or promote products derived from this software without
14ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     specific prior written permission.
15ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
16ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include <stdio.h>
28f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl#include <stdlib.h>
29ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include <string.h>
30578645f14e122d2b87d907e298cda7e7d0babf1farmvixl#include <math.h>
31578645f14e122d2b87d907e298cda7e7d0babf1farmvixl#include <float.h>
32ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include "cctest.h"
34ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include "test-utils-a64.h"
35ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include "a64/macro-assembler-a64.h"
36ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include "a64/simulator-a64.h"
37ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include "a64/debugger-a64.h"
38ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include "a64/disasm-a64.h"
39ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include "a64/cpu-a64.h"
40ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
41ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlnamespace vixl {
42ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Test infrastructure.
44ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
45ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Tests are functions which accept no parameters and have no return values.
46ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// The testing code should not perform an explicit return once completed. For
47ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// example to test the mov immediate instruction a very simple test would be:
48ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
49ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   TEST(mov_x0_one) {
50ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     SETUP();
51ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
52ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     START();
53ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     __ mov(x0, Operand(1));
54ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     END();
55ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
56ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     RUN();
57ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
58ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     ASSERT_EQUAL_64(1, x0);
59ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
60ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//     TEARDOWN();
61ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   }
62ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
63ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Within a START ... END block all registers but sp can be modified. sp has to
64ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// be explicitly saved/restored. The END() macro replaces the function return
65ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// so it may appear multiple times in a test if the test has multiple exit
66ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// points.
67ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
68ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Once the test has been run all integer and floating point registers as well
69ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// as flags are accessible through a RegisterDump instance, see
70ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// utils-a64.cc for more info on RegisterDump.
71ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
72ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// We provide some helper assert to handle common cases:
73ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
74ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_32(int32_t, int_32t)
75ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_FP32(float, float)
76ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_32(int32_t, W register)
77ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_FP32(float, S register)
78ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_64(int64_t, int_64t)
79ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_FP64(double, double)
80ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_64(int64_t, X register)
81ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_64(X register, X register)
82ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_FP64(double, D register)
83ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
84ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// e.g. ASSERT_EQUAL_64(0.5, d30);
85ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
86578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// If more advanced computation is required before the assert then access the
87ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// RegisterDump named core directly:
88ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
89ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//   ASSERT_EQUAL_64(0x1234, core->reg_x0() & 0xffff);
90ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
91ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
92ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define __ masm.
93ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define TEST(name)  TEST_(ASM_##name)
94ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
95ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define BUF_SIZE (4096)
96ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
97ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define SETUP() SETUP_SIZE(BUF_SIZE)
98ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
99ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifdef USE_SIMULATOR
100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Run tests with the simulator.
102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define SETUP_SIZE(buf_size)                                                   \
103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  byte* buf = new byte[buf_size];                                              \
104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  MacroAssembler masm(buf, buf_size);                                          \
105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Decoder decoder;                                                             \
106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Simulator* simulator = NULL;                                                 \
107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (Cctest::run_debugger()) {                                                \
108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    simulator = new Debugger(&decoder);                                        \
109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  } else {                                                                     \
110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    simulator = new Simulator(&decoder);                                       \
111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    simulator->set_disasm_trace(Cctest::trace_sim());                          \
112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }                                                                            \
113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  simulator->set_coloured_trace(Cctest::coloured_trace());                     \
114578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  simulator->set_instruction_stats(Cctest::instruction_stats());               \
115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump core
116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define START()                                                                \
118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.Reset();                                                                \
119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  simulator->ResetState();                                                     \
120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushCalleeSavedRegisters();                                               \
121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (Cctest::run_debugger()) {                                                \
122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (Cctest::trace_reg()) {                                                 \
123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Trace(LOG_STATE, TRACE_ENABLE);                                       \
124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }                                                                          \
125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (Cctest::trace_sim()) {                                                 \
126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Trace(LOG_DISASM, TRACE_ENABLE);                                      \
127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }                                                                          \
128578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }                                                                            \
129578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (Cctest::instruction_stats()) {                                           \
130578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ EnableInstrumentation();                                                \
131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define END()                                                                  \
134578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (Cctest::instruction_stats()) {                                           \
135578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ DisableInstrumentation();                                               \
136578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }                                                                            \
137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (Cctest::run_debugger()) {                                                \
138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Trace(LOG_ALL, TRACE_DISABLE);                                          \
139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }                                                                            \
140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  core.Dump(&masm);                                                            \
141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopCalleeSavedRegisters();                                                \
142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ret();                                                                    \
143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.FinalizeCode()
144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define RUN()                                                                  \
146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  simulator->RunFrom(reinterpret_cast<Instruction*>(buf))
147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define TEARDOWN()                                                             \
149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  delete simulator;                                                            \
150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  delete[] buf;
151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#else  // ifdef USE_SIMULATOR.
153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Run the test on real hardware or models.
154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define SETUP_SIZE(buf_size)                                                   \
155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  byte* buf = new byte[buf_size];                                              \
156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  MacroAssembler masm(buf, buf_size);                                          \
157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump core;                                                           \
158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CPU::SetUp()
159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define START()                                                                \
161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.Reset();                                                                \
162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushCalleeSavedRegisters()
163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define END()                                                                  \
165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  core.Dump(&masm);                                                            \
166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopCalleeSavedRegisters();                                                \
167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ret();                                                                    \
168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.FinalizeCode()
169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define RUN()                                                                  \
171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CPU::EnsureIAndDCacheCoherency(&buf, sizeof(buf));                           \
172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {                                                                            \
173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    void (*test_function)(void);                                               \
174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    memcpy(&test_function, &buf, sizeof(buf));                                 \
175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    test_function();                                                           \
176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define TEARDOWN()                                                             \
179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  delete[] buf;
180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif  // ifdef USE_SIMULATOR.
182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_NZCV(expected)                                            \
184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualNzcv(expected, core.flags_nzcv()))
185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_REGISTERS(expected)                                       \
187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualRegisters(&expected, &core))
188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_32(expected, result)                                      \
190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(Equal32(static_cast<uint32_t>(expected), &core, result))
191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_FP32(expected, result)                                    \
193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualFP32(expected, &core, result))
194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_64(expected, result)                                      \
196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(Equal64(expected, &core, result))
197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_FP64(expected, result)                                    \
199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualFP64(expected, &core, result))
200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_LITERAL_POOL_SIZE(expected)                                     \
202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert((expected) == (__ LiteralPoolSize()))
203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(stack_ops) {
206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // save sp.
210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, sp);
211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the sp to a known value.
213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, 0x1004);
214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, sp);
215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Add immediate to the sp, and move the result to a normal register.
217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(sp, sp, Operand(0x50));
218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, sp);
219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Add extended to the sp, and move the result to a normal register.
221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 0xfff);
222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(sp, sp, Operand(x17, SXTB));
223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, sp);
224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Create an sp using a logical instruction, and move to normal register.
226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(sp, xzr, Operand(0x1fff));
227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, sp);
228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Write wsp using a logical instruction.
230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(wsp, wzr, Operand(0xfffffff8L));
231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, sp);
232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Write sp, and read back wsp.
234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(sp, xzr, Operand(0xfffffff8L));
235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, wsp);
236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  restore sp.
238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x29);
239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1004, x0);
244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1054, x1);
245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1053, x2);
246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1fff, x3);
247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff8, x4);
248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff8, x5);
249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mvn) {
255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w0, 0xfff);
259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x1, 0xfff);
260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w2, Operand(w0, LSL, 1));
261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x3, Operand(x1, LSL, 2));
262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w4, Operand(w0, LSR, 3));
263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x5, Operand(x1, LSR, 4));
264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w6, Operand(w0, ASR, 11));
265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x7, Operand(x1, ASR, 12));
266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w8, Operand(w0, ROR, 13));
267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x9, Operand(x1, ROR, 14));
268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w10, Operand(w2, UXTB));
269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x11, Operand(x2, SXTB, 1));
270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w12, Operand(w2, UXTH, 2));
271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x13, Operand(x2, SXTH, 3));
272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x14, Operand(w2, UXTW, 4));
273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x15, Operand(w2, SXTW, 4));
274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff000, x0);
279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffff000UL, x1);
280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00001fff, x2);
281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000003fffUL, x3);
282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xe00001ff, x4);
283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf0000000000000ffUL, x5);
284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x6);
285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x7);
286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ff80000, x8);
287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3ffc000000000000UL, x9);
288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff00, x10);
289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000000001UL, x11);
290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff8003, x12);
291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff0007UL, x13);
292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffe000fUL, x14);
293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffe000fUL, x15);
294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
299f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(mov_imm_w) {
300f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
301f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
302f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
303f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w0, 0xffffffffL);
304f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w1, 0xffff1234L);
305f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w2, 0x1234ffffL);
306f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w3, 0x00000000L);
307f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w4, 0x00001234L);
308f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w5, 0x12340000L);
309f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w6, 0x12345678L);
310f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
311f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
312f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
313f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
314f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffffL, x0);
315f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffff1234L, x1);
316f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234ffffL, x2);
317f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x00000000L, x3);
318f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x00001234L, x4);
319f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x12340000L, x5);
320f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x12345678L, x6);
321f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
322f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
323f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
324f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
325f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
326f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(mov_imm_x) {
327f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
328f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
329f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
330f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0xffffffffffffffffL);
331f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x1, 0xffffffffffff1234L);
332f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x2, 0xffffffff12345678L);
333f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x3, 0xffff1234ffff5678L);
334f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x4, 0x1234ffffffff5678L);
335f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x5, 0x1234ffff5678ffffL);
336f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x6, 0x12345678ffffffffL);
337f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x7, 0x1234ffffffffffffL);
338f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x8, 0x123456789abcffffL);
339f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x9, 0x12345678ffff9abcL);
340f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x10, 0x1234ffff56789abcL);
341f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x11, 0xffff123456789abcL);
342f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x12, 0x0000000000000000L);
343f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x13, 0x0000000000001234L);
344f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x14, 0x0000000012345678L);
345f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x15, 0x0000123400005678L);
346f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x18, 0x1234000000005678L);
347f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x19, 0x1234000056780000L);
348f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x20, 0x1234567800000000L);
349f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x21, 0x1234000000000000L);
350f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x22, 0x123456789abc0000L);
351f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x23, 0x1234567800009abcL);
352f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x24, 0x1234000056789abcL);
353f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x25, 0x0000123456789abcL);
354f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x26, 0x123456789abcdef0L);
355f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x27, 0xffff000000000001L);
356f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x28, 0x8000ffff00000000L);
357f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
358f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
359f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
360f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
361f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffffffff1234L, x1);
362f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff12345678L, x2);
363f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffff1234ffff5678L, x3);
364f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234ffffffff5678L, x4);
365f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234ffff5678ffffL, x5);
366f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x12345678ffffffffL, x6);
367f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234ffffffffffffL, x7);
368f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x123456789abcffffL, x8);
369f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x12345678ffff9abcL, x9);
370f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234ffff56789abcL, x10);
371f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffff123456789abcL, x11);
372f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x0000000000000000L, x12);
373f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x0000000000001234L, x13);
374f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x0000000012345678L, x14);
375f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x0000123400005678L, x15);
376f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234000000005678L, x18);
377f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234000056780000L, x19);
378f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234567800000000L, x20);
379f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234000000000000L, x21);
380f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x123456789abc0000L, x22);
381f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234567800009abcL, x23);
382f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234000056789abcL, x24);
383f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x0000123456789abcL, x25);
384f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x123456789abcdef0L, x26);
385f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffff000000000001L, x27);
386f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000ffff00000000L, x28);
387f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
388f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
389f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
390f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
391f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
392f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mov) {
394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffffffffffffffL);
398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xffffffffffffffffL);
399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0xffffffffffffffffL);
400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0xffffffffffffffffL);
401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0123456789abcdefL);
403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ movz(x1, 0xabcdL << 16);
405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ movk(x2, 0xabcdL << 32);
406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ movn(x3, 0xabcdL << 48);
407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 0x0123456789abcdefL);
409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, x4);
410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, -1);
412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test that moves back to the same register have the desired effect. This
414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // is a no-op for X registers, and a truncation for W registers.
415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x7, 0x0123456789abcdefL);
416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x7, x7);
417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x8, 0x0123456789abcdefL);
418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w8, w8);
419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x9, 0x0123456789abcdefL);
420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x9, Operand(x9));
421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, 0x0123456789abcdefL);
422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w10, Operand(w10));
423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w11, 0xfff);
425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x12, 0xfff);
426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w13, Operand(w11, LSL, 1));
427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x14, Operand(x12, LSL, 2));
428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w15, Operand(w11, LSR, 3));
429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, Operand(x12, LSR, 4));
430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w19, Operand(w11, ASR, 11));
431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, Operand(x12, ASR, 12));
432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, Operand(w11, ROR, 13));
433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, Operand(x12, ROR, 14));
434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w23, Operand(w13, UXTB));
435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, Operand(x13, SXTB, 1));
436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w25, Operand(w13, UXTH, 2));
437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, Operand(x13, SXTH, 3));
438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, Operand(w13, UXTW, 4));
439f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
440f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x28, 0x0123456789abcdefL);
441f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w28, w28, kDiscardForSameWReg);
442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefL, x0);
447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000abcd0000L, x1);
448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffabcdffffffffL, x2);
449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x5432ffffffffffffL, x3);
450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x4, x5);
451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(-1, w6);
452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefL, x7);
453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x89abcdefL, w8);
454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefL, x9);
455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x89abcdefL, w10);
456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000fff, x11);
457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000000fffUL, x12);
458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00001ffe, x13);
459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000003ffcUL, x14);
460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000001ff, x15);
461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000000000ffUL, x18);
462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x19);
463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x20);
464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ff80000, x21);
465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3ffc000000000000UL, x22);
466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000fe, x23);
467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffcUL, x24);
468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00007ff8, x25);
469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000000000fff0UL, x26);
470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000000001ffe0UL, x27);
471f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefL, x28);
472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orr) {
478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xf0f0);
482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x2, x0, Operand(x1));
485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w3, w0, Operand(w1, LSL, 28));
486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x4, x0, Operand(x1, LSL, 32));
487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x5, x0, Operand(x1, LSR, 4));
488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w6, w0, Operand(w1, ASR, 4));
489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x7, x0, Operand(x1, ASR, 4));
490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w8, w0, Operand(w1, ROR, 12));
491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x9, x0, Operand(x1, ROR, 12));
492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w10, w0, Operand(0xf));
493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x11, x0, Operand(0xf0000000f0000000L));
494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf000f0ff, x2);
499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf000f0f0, x3);
500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf00000ff0000f0f0L, x4);
501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0f00f0ff, x5);
502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff00f0ff, x6);
503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0f00f0ff, x7);
504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0ffff0f0, x8);
505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0ff00000000ff0f0L, x9);
506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf0ff, x10);
507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf0000000f000f0f0L, x11);
508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orr_extend) {
514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x8000000080008080UL);
519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w6, w0, Operand(w1, UXTB));
520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x7, x0, Operand(x1, UXTH, 1));
521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w8, w0, Operand(w1, UXTW, 2));
522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x9, x0, Operand(x1, UXTX, 3));
523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w10, w0, Operand(w1, SXTB));
524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x11, x0, Operand(x1, SXTH, 1));
525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x12, x0, Operand(x1, SXTW, 2));
526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x13, x0, Operand(x1, SXTX, 3));
527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000081, x6);
532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00010101, x7);
533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00020201, x8);
534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000400040401UL, x9);
535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000ffffff81UL, x10);
536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff0101UL, x11);
537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe00020201UL, x12);
538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000400040401UL, x13);
539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bitwise_wide_imm) {
545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf0f0f0f0f0f0f0f0UL);
550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x10, x0, Operand(0x1234567890abcdefUL));
552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w11, w1, Operand(0x90abcdef));
553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf0f0f0f0f0f0f0f0UL, x1);
559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1234567890abcdefUL, x10);
560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf0fbfdffUL, x11);
561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orn) {
567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xf0f0);
571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x2, x0, Operand(x1));
574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w3, w0, Operand(w1, LSL, 4));
575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x4, x0, Operand(x1, LSL, 4));
576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x5, x0, Operand(x1, LSR, 1));
577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w6, w0, Operand(w1, ASR, 1));
578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x7, x0, Operand(x1, ASR, 1));
579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w8, w0, Operand(w1, ROR, 16));
580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x9, x0, Operand(x1, ROR, 16));
581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w10, w0, Operand(0xffff));
582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x11, x0, Operand(0xffff0000ffffL));
583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff0ffffff0L, x2);
588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff0ff, x3);
589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff0fffff0ffL, x4);
590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff87fffff0L, x5);
591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x07fffff0, x6);
592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff87fffff0L, x7);
593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff00ffff, x8);
594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff00ffffffffffffL, x9);
595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff0f0, x10);
596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff0000fffff0f0L, x11);
597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orn_extend) {
603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x8000000080008081UL);
608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w6, w0, Operand(w1, UXTB));
609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x7, x0, Operand(x1, UXTH, 1));
610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w8, w0, Operand(w1, UXTW, 2));
611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x9, x0, Operand(x1, UXTX, 3));
612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w10, w0, Operand(w1, SXTB));
613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x11, x0, Operand(x1, SXTH, 1));
614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x12, x0, Operand(x1, SXTW, 2));
615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x13, x0, Operand(x1, SXTX, 3));
616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff7f, x6);
621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffefefdUL, x7);
622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffdfdfb, x8);
623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7UL, x9);
624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007f, x10);
625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000fefd, x11);
626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001fffdfdfbUL, x12);
627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7UL, x13);
628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(and_) {
634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x2, x0, Operand(x1));
641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w3, w0, Operand(w1, LSL, 4));
642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x4, x0, Operand(x1, LSL, 4));
643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x5, x0, Operand(x1, LSR, 1));
644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w6, w0, Operand(w1, ASR, 20));
645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x7, x0, Operand(x1, ASR, 20));
646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w8, w0, Operand(w1, ROR, 28));
647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x9, x0, Operand(x1, ROR, 28));
648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w10, w0, Operand(0xff00));
649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x11, x0, Operand(0xff));
650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x2);
655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x3);
656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x4);
657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000070, x5);
658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x6);
659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000f00, x7);
660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x8);
661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x9);
662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x10);
663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x11);
664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(and_extend) {
670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffffffffffffffUL);
674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x8000000080008081UL);
675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w6, w0, Operand(w1, UXTB));
676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x7, x0, Operand(x1, UXTH, 1));
677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w8, w0, Operand(w1, UXTW, 2));
678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x9, x0, Operand(x1, UXTX, 3));
679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w10, w0, Operand(w1, SXTB));
680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x11, x0, Operand(x1, SXTH, 1));
681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x12, x0, Operand(x1, SXTW, 2));
682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x13, x0, Operand(x1, SXTX, 3));
683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000081, x6);
688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00010102, x7);
689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00020204, x8);
690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000400040408UL, x9);
691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff81, x10);
692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff0102UL, x11);
693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe00020204UL, x12);
694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000400040408UL, x13);
695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ands) {
701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
705f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w1, Operand(w1));
706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf00000ff, x0);
712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
716f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(w1, LSR, 4));
717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x8000000000000000L);
726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x00000001);
727f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(x0, x0, Operand(x1, ROR, 1));
728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000L, x0);
734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
737f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(0xf));
738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xff000000);
747f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(0x80000000));
748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x0);
754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bic) {
760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x2, x0, Operand(x1));
767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w3, w0, Operand(w1, LSL, 4));
768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x4, x0, Operand(x1, LSL, 4));
769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x5, x0, Operand(x1, LSR, 1));
770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w6, w0, Operand(w1, ASR, 20));
771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x7, x0, Operand(x1, ASR, 20));
772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w8, w0, Operand(w1, ROR, 28));
773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x9, x0, Operand(x1, ROR, 24));
774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x10, x0, Operand(0x1f));
775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x11, x0, Operand(0x100));
776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test bic into sp when the constant cannot be encoded in the immediate
778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // field.
779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Use x20 to preserve sp. We check for the result via x21 because the
780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // test infrastructure requires that sp be restored to its original value.
781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, sp);
782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffff);
783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(sp, x0, Operand(0xabcdef));
784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, sp);
785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x20);
786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x2);
791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x3);
792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x4);
793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff80, x5);
794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x6);
795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f0f0, x7);
796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x8);
797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x9);
798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ffe0, x10);
799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000fef0, x11);
800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x543210, x21);
802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bic_extend) {
808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffffffffffffffUL);
812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x8000000080008081UL);
813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w6, w0, Operand(w1, UXTB));
814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x7, x0, Operand(x1, UXTH, 1));
815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w8, w0, Operand(w1, UXTW, 2));
816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x9, x0, Operand(x1, UXTX, 3));
817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w10, w0, Operand(w1, SXTB));
818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x11, x0, Operand(x1, SXTH, 1));
819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x12, x0, Operand(x1, SXTW, 2));
820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x13, x0, Operand(x1, SXTX, 3));
821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff7e, x6);
826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffefefdUL, x7);
827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffdfdfb, x8);
828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7UL, x9);
829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007e, x10);
830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000fefd, x11);
831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001fffdfdfbUL, x12);
832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7UL, x13);
833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bics) {
839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xffff);
843f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(w0, w1, Operand(w1));
844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffffff);
853f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(w0, w0, Operand(w0, LSR, 1));
854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x0);
860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x8000000000000000L);
863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x00000001);
864f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(x0, x0, Operand(x1, ROR, 1));
865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffffffffffffffL);
874f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(x0, x0, Operand(0x7fffffffffffffffL));
875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000L, x0);
881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0xffff0000);
884f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(w0, w0, Operand(0xfffffff0));
885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eor) {
897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x2, x0, Operand(x1));
904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w3, w0, Operand(w1, LSL, 4));
905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x4, x0, Operand(x1, LSL, 4));
906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x5, x0, Operand(x1, LSR, 1));
907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w6, w0, Operand(w1, ASR, 20));
908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x7, x0, Operand(x1, ASR, 20));
909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w8, w0, Operand(w1, ROR, 28));
910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x9, x0, Operand(x1, ROR, 28));
911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w10, w0, Operand(0xff00ff00));
912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x11, x0, Operand(0xff00ff00ff00ff00L));
913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf000ff0f, x2);
918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x3);
919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000f0000f000L, x4);
920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7800ff8f, x5);
921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff00f0, x6);
922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f0f0, x7);
923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f00f, x8);
924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff00000ffffL, x9);
925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff0000f0, x10);
926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff00ff00ff0000f0L, x11);
927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eor_extend) {
932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x1111111111111111UL);
936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x8000000080008081UL);
937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w6, w0, Operand(w1, UXTB));
938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x7, x0, Operand(x1, UXTH, 1));
939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w8, w0, Operand(w1, UXTW, 2));
940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x9, x0, Operand(x1, UXTX, 3));
941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w10, w0, Operand(w1, SXTB));
942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x11, x0, Operand(x1, SXTH, 1));
943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x12, x0, Operand(x1, SXTW, 2));
944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x13, x0, Operand(x1, SXTX, 3));
945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x11111190, x6);
950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1111111111101013UL, x7);
951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x11131315, x8);
952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1111111511151519UL, x9);
953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeee90, x10);
954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeeeeeeeee1013UL, x11);
955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeeeef11131315UL, x12);
956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1111111511151519UL, x13);
957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eon) {
963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x2, x0, Operand(x1));
970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w3, w0, Operand(w1, LSL, 4));
971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x4, x0, Operand(x1, LSL, 4));
972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x5, x0, Operand(x1, LSR, 1));
973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w6, w0, Operand(w1, ASR, 20));
974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x7, x0, Operand(x1, ASR, 20));
975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w8, w0, Operand(w1, ROR, 28));
976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x9, x0, Operand(x1, ROR, 28));
977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w10, w0, Operand(0x03c003c0));
978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x11, x0, Operand(0x0000100000001000L));
979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff0fff00f0L, x2);
984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff0fff, x3);
985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff0ffff0fffL, x4);
986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff87ff0070L, x5);
987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff0f, x6);
988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff0f0fL, x7);
989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff0ff0, x8);
990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff00fffff0000L, x9);
991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfc3f03cf, x10);
992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffefffffff100fL, x11);
993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eon_extend) {
999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x1111111111111111UL);
1003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x8000000080008081UL);
1004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w6, w0, Operand(w1, UXTB));
1005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x7, x0, Operand(x1, UXTH, 1));
1006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w8, w0, Operand(w1, UXTW, 2));
1007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x9, x0, Operand(x1, UXTX, 3));
1008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w10, w0, Operand(w1, SXTB));
1009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x11, x0, Operand(x1, SXTH, 1));
1010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x12, x0, Operand(x1, SXTW, 2));
1011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x13, x0, Operand(x1, SXTX, 3));
1012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeee6f, x6);
1017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeeeeeeeefefecUL, x7);
1018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeececea, x8);
1019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeeeeaeeeaeae6UL, x9);
1020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1111116f, x10);
1021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x111111111111efecUL, x11);
1022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x11111110eeececeaUL, x12);
1023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeeeeaeeeaeae6UL, x13);
1024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mul) {
1030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
1036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0xffffffffffffffffUL);
1037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w0, w16, w16);
1039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w1, w16, w17);
1040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w2, w17, w18);
1041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w3, w18, w19);
1042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x4, x16, x16);
1043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x5, x17, x18);
1044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x6, x18, x19);
1045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x7, x19, x19);
1046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smull(x8, w17, w18);
1047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smull(x9, w18, w18);
1048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smull(x10, w19, w19);
1049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w11, w16, w16);
1050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w12, w16, w17);
1051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w13, w17, w18);
1052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w14, w18, w19);
1053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x20, x16, x16);
1054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x21, x17, x18);
1055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x22, x18, x19);
1056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x23, x19, x19);
1057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x3);
1065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x4);
1066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x5);
1067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff00000001UL, x6);
1068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
1069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x8);
1070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
1071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
1072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
1073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
1075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x14);
1076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x20);
1077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff00000001UL, x21);
1078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x22);
1079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x23);
1080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1085f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void SmullHelper(int64_t expected, int64_t a, int64_t b) {
1086f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
1087f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
1088f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w0, a);
1089f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w1, b);
1090f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Smull(x2, w0, w1);
1091f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
1092f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
1093f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(expected, x2);
1094f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
1095f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
1096f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1097f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1098f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(smull) {
1099f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0, 0, 0);
1100f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(1, 1, 1);
1101f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(-1, -1, 1);
1102f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(1, -1, -1);
1103f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0xffffffff80000000, 0x80000000, 1);
1104f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0x0000000080000000, 0x00010000, 0x00008000);
1105f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
1106f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1107f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(madd) {
1109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
1115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0xffffffffffffffffUL);
1116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w0, w16, w16, w16);
1118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w1, w16, w16, w17);
1119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w2, w16, w16, w18);
1120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w3, w16, w16, w19);
1121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w4, w16, w17, w17);
1122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w5, w17, w17, w18);
1123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w6, w17, w17, w19);
1124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w7, w17, w18, w16);
1125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w8, w17, w18, w18);
1126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w9, w18, w18, w17);
1127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w10, w18, w19, w18);
1128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w11, w19, w19, w19);
1129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x12, x16, x16, x16);
1131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x13, x16, x16, x17);
1132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x14, x16, x16, x18);
1133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x15, x16, x16, x19);
1134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x20, x16, x17, x17);
1135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x21, x17, x17, x18);
1136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x22, x17, x17, x19);
1137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x23, x17, x18, x16);
1138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x24, x17, x18, x18);
1139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x25, x18, x18, x17);
1140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x26, x18, x19, x18);
1141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x27, x19, x19, x19);
1142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
1149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
1153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x6);
1154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x7);
1155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x8);
1156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x9);
1157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x10);
1158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
1159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
1162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x14);
1163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x15);
1164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x20);
1165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x100000000UL, x21);
1166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x22);
1167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x23);
1168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1fffffffe, x24);
1169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe00000002UL, x25);
1170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x26);
1171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x27);
1172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(msub) {
1178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
1184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0xffffffffffffffffUL);
1185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w0, w16, w16, w16);
1187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w1, w16, w16, w17);
1188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w2, w16, w16, w18);
1189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w3, w16, w16, w19);
1190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w4, w16, w17, w17);
1191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w5, w17, w17, w18);
1192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w6, w17, w17, w19);
1193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w7, w17, w18, w16);
1194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w8, w17, w18, w18);
1195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w9, w18, w18, w17);
1196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w10, w18, w19, w18);
1197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w11, w19, w19, w19);
1198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x12, x16, x16, x16);
1200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x13, x16, x16, x17);
1201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x14, x16, x16, x18);
1202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x15, x16, x16, x19);
1203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x20, x16, x17, x17);
1204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x21, x17, x17, x18);
1205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x22, x17, x17, x19);
1206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x23, x17, x18, x16);
1207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x24, x17, x18, x18);
1208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x25, x18, x18, x17);
1209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x26, x18, x19, x18);
1210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x27, x19, x19, x19);
1211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
1218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x5);
1222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x6);
1223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
1224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
1225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x9);
1226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x10);
1227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
1228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
1231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x14);
1232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x15);
1233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x20);
1234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffeUL, x21);
1235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffeUL, x22);
1236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff00000001UL, x23);
1237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x24);
1238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x200000000UL, x25);
1239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1fffffffeUL, x26);
1240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffeUL, x27);
1241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(smulh) {
1247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 0);
1251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 1);
1252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, 0x0000000100000000L);
1253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, 0x12345678);
1254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0x0123456789abcdefL);
1255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 0x0000000200000000L);
1256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, 0x8000000000000000UL);
1257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, 0xffffffffffffffffUL);
1258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, 0x5555555555555555UL);
1259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, 0xaaaaaaaaaaaaaaaaUL);
1260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x0, x20, x24);
1262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x1, x21, x24);
1263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x2, x22, x23);
1264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x3, x22, x24);
1265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x4, x24, x25);
1266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x5, x23, x27);
1267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x6, x26, x26);
1268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x7, x26, x27);
1269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x8, x27, x27);
1270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x9, x28, x28);
1271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x10, x28, x29);
1272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x11, x29, x29);
1273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x2);
1280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x01234567, x3);
1281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x02468acf, x4);
1282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x5);
1283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x4000000000000000UL, x6);
1284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x7);
1285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
1286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1c71c71c71c71c71UL, x9);
1287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xe38e38e38e38e38eUL, x10);
1288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1c71c71c71c71c72UL, x11);
1289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(smaddl_umaddl) {
1295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
1300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0xffffffffffffffffUL);
1301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 4);
1302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 0x200000000UL);
1303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x9, w17, w18, x20);
1305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x10, w18, w18, x20);
1306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x11, w19, w19, x20);
1307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x12, w19, w19, x21);
1308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x13, w17, w18, x20);
1309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x14, w18, w18, x20);
1310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x15, w19, w19, x20);
1311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x22, w19, w19, x21);
1312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x9);
1317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x10);
1318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x11);
1319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x200000001UL, x12);
1320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x100000003UL, x13);
1321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe00000005UL, x14);
1322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe00000005UL, x15);
1323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x22);
1324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(smsubl_umsubl) {
1330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
1335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0xffffffffffffffffUL);
1336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 4);
1337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 0x200000000UL);
1338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x9, w17, w18, x20);
1340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x10, w18, w18, x20);
1341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x11, w19, w19, x20);
1342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x12, w19, w19, x21);
1343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x13, w17, w18, x20);
1344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x14, w18, w18, x20);
1345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x15, w19, w19, x20);
1346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x22, w19, w19, x21);
1347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x9);
1352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x10);
1353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x11);
1354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1ffffffffUL, x12);
1355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff00000005UL, x13);
1356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x200000003UL, x14);
1357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x200000003UL, x15);
1358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3ffffffffUL, x22);
1359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(div) {
1365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 1);
1369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 0xffffffff);
1370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffffffffffffUL);
1371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0x80000000);
1372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 0x8000000000000000UL);
1373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 2);
1374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w0, w16, w16);
1376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w1, w17, w16);
1377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w2, w16, w16);
1378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w3, w16, w17);
1379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w4, w17, w18);
1380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x5, x16, x16);
1382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x6, x17, x18);
1383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x7, x16, x16);
1384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x8, x16, x17);
1385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x9, x17, x18);
1386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w10, w19, w21);
1388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w11, w19, w21);
1389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x12, x19, x21);
1390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x13, x19, x21);
1391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x14, x20, x21);
1392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x15, x20, x21);
1393f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1394f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(w22, w19, w17);
1395f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(w23, w19, w17);
1396f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x24, x20, x18);
1397f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x25, x20, x18);
1398f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1399f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x26, x16, x21);
1400f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x27, x16, x21);
1401f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x28, x18, x21);
1402f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x29, x18, x21);
1403f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1404f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x17, 0);
1405f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(w18, w16, w17);
1406f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(w19, w16, w17);
1407f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x20, x16, x17);
1408f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x21, x16, x17);
1409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
1414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x1);
1415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
1416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x5);
1419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x6);
1420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
1421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
1422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff00000001UL, x9);
1423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x40000000, x10);
1424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xC0000000, x11);
1425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x40000000, x12);
1426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x40000000, x13);
1427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x4000000000000000UL, x14);
1428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xC000000000000000UL, x15);
1429f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x22);
1430f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x23);
1431f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x24);
1432f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x25);
1433f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x26);
1434f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x27);
1435f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x28);
1436f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x29);
1437f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x18);
1438f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x19);
1439f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x20);
1440f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x21);
1441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(rbit_rev) {
1447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0xfedcba9876543210UL);
1451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rbit(w0, w24);
1452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rbit(x1, x24);
1453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev16(w2, w24);
1454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev16(x3, x24);
1455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev(w4, w24);
1456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev32(x5, x24);
1457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev(x6, x24);
1458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x084c2a6e, x0);
1463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x084c2a6e195d3b7fUL, x1);
1464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x54761032, x2);
1465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xdcfe98ba54761032UL, x3);
1466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x10325476, x4);
1467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x98badcfe10325476UL, x5);
1468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1032547698badcfeUL, x6);
1469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(clz_cls) {
1475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0x0008000000800000UL);
1479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 0xff800000fff80000UL);
1480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, 0);
1481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w0, w24);
1482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x1, x24);
1483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w2, w25);
1484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x3, x25);
1485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w4, w26);
1486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x5, x26);
1487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w6, w24);
1488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x7, x24);
1489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w8, w25);
1490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x9, x25);
1491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w10, w26);
1492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x11, x26);
1493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(8, x0);
1498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(12, x1);
1499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x2);
1500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
1501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(32, x4);
1502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(64, x5);
1503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(7, x6);
1504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(11, x7);
1505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(12, x8);
1506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(8, x9);
1507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(31, x10);
1508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(63, x11);
1509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(label) {
1515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label label_1, label_2, label_3, label_4;
1518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x1);
1521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0);
1522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, lr);    // Save lr.
1523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);
1525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);
1526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);     // Multiple branches to the same label.
1527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_2);
1529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_3);     // Forward branch.
1530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_1);
1532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_2);     // Backward branch.
1533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_3);
1535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&label_4);
1536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_4);
1539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1);
1540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(lr, x22);
1541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x0);
1546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x1);
1547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adr) {
1553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label label_1, label_2, label_3, label_4;
1556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);        // Set to non-zero to indicate failure.
1559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x1, &label_3);   // Set to zero to indicate success.
1560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_1);   // Multiple forward references to the same label.
1562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x3, &label_1);
1563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x4, &label_1);
1564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_2);
1566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x5, x2, Operand(x3));  // Ensure that x2,x3 and x4 are identical.
1567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x6, x2, Operand(x4));
1568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x0, x0, Operand(x5));
1569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x0, x0, Operand(x6));
1570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x2);  // label_1, label_3
1571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_3);
1573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_3);   // Self-reference (offset 0).
1574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x1, x1, Operand(x2));
1575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_4);   // Simple forward reference.
1576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x2);  // label_4
1577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_1);
1579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_3);   // Multiple reverse references to the same label.
1580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x3, &label_3);
1581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x4, &label_3);
1582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x5, &label_2);   // Simple reverse reference.
1583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x5);  // label_2
1584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_4);
1586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x0);
1591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x1);
1592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(branch_cond) {
1598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label wrong;
1601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x1);
1604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1);
1605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0x8000000000000000L);
1606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // For each 'cmp' instruction below, condition codes other than the ones
1608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // following it would branch.
1609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1610578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 0);
1611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
1612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
1613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
1614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ls);
1616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lt);
1617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, le);
1618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_1;
1619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_1, ne);
1620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_1);
1622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1623578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 1);
1624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ne);
1625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
1626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
1627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hi);
1629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lt);
1630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
1631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_2;
1632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_2, pl);
1633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_2);
1635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1636578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 2);
1637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
1638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hs);
1639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, pl);
1640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hi);
1642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ge);
1643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
1644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_3;
1645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_3, vc);
1646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_3);
1648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1649578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x2, 1);
1650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
1651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
1652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
1653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vc);
1654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ls);
1655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ge);
1656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
1657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_4;
1658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_4, le);
1659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_4);
1661578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1662578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Label ok_5;
1663578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ b(&ok_5, al);
1664578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x0, 0x0);
1665578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bind(&ok_5);
1666578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1667578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Label ok_6;
1668578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ b(&ok_6, nv);
1669578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x0, 0x0);
1670578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bind(&ok_6);
1671578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&wrong);
1675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x0);
1681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(branch_to_reg) {
1687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test br.
1690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label fn1, after_fn1;
1691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, lr);
1694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
1696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&after_fn1);
1697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&fn1);
1699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, lr);
1700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 42);
1701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x0);
1702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&after_fn1);
1704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&fn1);
1705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test blr.
1707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label fn2, after_fn2;
1708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
1710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&after_fn2);
1711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&fn2);
1713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, lr);
1714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 84);
1715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Blr(x0);
1716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&after_fn2);
1718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&fn2);
1719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, lr);
1720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(lr, x29);
1722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(core.xreg(3) + kInstructionSize, x0);
1727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(42, x1);
1728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(84, x2);
1729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(compare_branch) {
1735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
1739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
1740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
1741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0);
1742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 0);
1743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 0);
1744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 42);
1746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label zt, zt_end;
1748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(w16, &zt);
1749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&zt_end);
1750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zt);
1751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
1752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zt_end);
1753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label zf, zf_end;
1755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(x17, &zf);
1756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&zf_end);
1757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zf);
1758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
1759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zf_end);
1760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nzt, nzt_end;
1762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(w17, &nzt);
1763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nzt_end);
1764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzt);
1765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 1);
1766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzt_end);
1767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nzf, nzf_end;
1769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(x16, &nzf);
1770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nzf_end);
1771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzf);
1772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 1);
1773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzf_end);
1774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff00000000UL);
1776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label a, a_end;
1778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(w18, &a);
1779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&a_end);
1780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&a);
1781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 1);
1782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&a_end);
1783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label b, b_end;
1785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(w18, &b);
1786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&b_end);
1787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&b);
1788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 1);
1789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&b_end);
1790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
1796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
1798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
1799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
1801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(test_branch) {
1807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
1811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
1812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
1813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0);
1814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0xaaaaaaaaaaaaaaaaUL);
1815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label bz, bz_end;
1817f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Tbz(w16, 0, &bz);
1818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&bz_end);
1819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bz);
1820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
1821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bz_end);
1822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label bo, bo_end;
1824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Tbz(x16, 63, &bo);
1825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&bo_end);
1826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bo);
1827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
1828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bo_end);
1829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nbz, nbz_end;
1831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Tbnz(x16, 61, &nbz);
1832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nbz_end);
1833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbz);
1834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 1);
1835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbz_end);
1836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nbo, nbo_end;
1838f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Tbnz(w16, 2, &nbo);
1839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nbo_end);
1840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbo);
1841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 1);
1842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbo_end);
1843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
1848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
1850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
1851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_offset) {
1857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL};
1860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
1861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
1862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
1863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
1866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
1867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17));
1868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18));
1869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w1, MemOperand(x17, 4));
1870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w1, MemOperand(x18, 12));
1871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x2, MemOperand(x17, 8));
1872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x2, MemOperand(x18, 16));
1873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x17, 1));
1874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x18, 25));
1875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x17, 2));
1876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x18, 33));
1877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, x0);
1882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, dst[0]);
1883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x1);
1884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba9800000000UL, dst[1]);
1885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefUL, x2);
1886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefUL, dst[2]);
1887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
1888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
1889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7654, x4);
1890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x765400, dst[4]);
1891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
1892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x18);
1893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_wide) {
1899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[8192];
1902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t dst[8192];
1903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
1904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
1905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  memset(src, 0xaa, 8192 * sizeof(src[0]));
1906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  memset(dst, 0xaa, 8192 * sizeof(dst[0]));
1907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[0] = 0;
1908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[6144] = 6144;
1909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[8191] = 8191;
1910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, src_base);
1913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, dst_base);
1914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, src_base);
1915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, dst_base);
1916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, src_base);
1917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, dst_base);
1918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x22, 8191 * sizeof(src[0])));
1920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x23, 8191 * sizeof(dst[0])));
1921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w1, MemOperand(x24, 4096 * sizeof(src[0]), PostIndex));
1922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w1, MemOperand(x25, 4096 * sizeof(dst[0]), PostIndex));
1923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x26, 6144 * sizeof(src[0]), PreIndex));
1924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x27, 6144 * sizeof(dst[0]), PreIndex));
1925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(8191, w0);
1930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(8191, dst[8191]);
1931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x22);
1932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x23);
1933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0, w1);
1934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0, dst[0]);
1935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4096 * sizeof(src[0]), x24);
1936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 4096 * sizeof(dst[0]), x25);
1937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(6144, w2);
1938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(6144, dst[6144]);
1939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 6144 * sizeof(src[0]), x26);
1940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 6144 * sizeof(dst[0]), x27);
1941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_preindex) {
1947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL};
1950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
1951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
1952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
1953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
1956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
1957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
1958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
1959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base + 16);
1960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base + 40);
1961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, src_base);
1962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, dst_base);
1963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, src_base);
1964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, dst_base);
1965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17, 4, PreIndex));
1966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18, 12, PreIndex));
1967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x19, 8, PreIndex));
1968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x20, 16, PreIndex));
1969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x21, -4, PreIndex));
1970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x22, -4, PreIndex));
1971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x23, 1, PreIndex));
1972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x24, 25, PreIndex));
1973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x25, 3, PreIndex));
1974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x26, 41, PreIndex));
1975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x0);
1980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba9800000000UL, dst[1]);
1981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefUL, x1);
1982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefUL, dst[2]);
1983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x01234567, x2);
1984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456700000000UL, dst[4]);
1985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
1986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
1987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x9876, x4);
1988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x987600, dst[5]);
1989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4, x17);
1990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 12, x18);
1991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x19);
1992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 16, x20);
1993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 12, x21);
1994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 36, x22);
1995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 1, x23);
1996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 25, x24);
1997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 3, x25);
1998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 41, x26);
1999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_postindex) {
2005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t src[2] = {0xfedcba9876543210UL, 0x0123456789abcdefUL};
2008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
2009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base + 4);
2014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base + 12);
2015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base + 8);
2016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base + 16);
2017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base + 8);
2018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base + 32);
2019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, src_base + 1);
2020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, dst_base + 25);
2021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, src_base + 3);
2022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, dst_base + 41);
2023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17, 4, PostIndex));
2024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18, 12, PostIndex));
2025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x19, 8, PostIndex));
2026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x20, 16, PostIndex));
2027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x2, MemOperand(x21, -8, PostIndex));
2028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x2, MemOperand(x22, -32, PostIndex));
2029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x23, 1, PostIndex));
2030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x24, 5, PostIndex));
2031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x25, -3, PostIndex));
2032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x26, -41, PostIndex));
2033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x0);
2038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba9800000000UL, dst[1]);
2039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefUL, x1);
2040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefUL, dst[2]);
2041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefUL, x2);
2042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefUL, dst[4]);
2043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
2044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
2045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x9876, x4);
2046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x987600, dst[5]);
2047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x17);
2048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 24, x18);
2049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 16, x19);
2050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 32, x20);
2051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x21);
2052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2, x23);
2054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 30, x24);
2055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x25);
2056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x26);
2057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_largeindex) {
2063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This value won't fit in the immediate offset field of ldr/str instructions.
2066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int largeoffset = 0xabcdef;
2067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int64_t data[3] = { 0x1122334455667788, 0, 0 };
2069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t base_addr = reinterpret_cast<uintptr_t>(data);
2070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t drifted_addr = base_addr - largeoffset;
2071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test checks that we we can use large immediate offsets when
2073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // using PreIndex or PostIndex addressing mode of the MacroAssembler
2074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Ldr/Str instructions.
2075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, drifted_addr);
2078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x0, MemOperand(x17, largeoffset, PreIndex));
2079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, base_addr);
2081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x18, largeoffset, PostIndex));
2082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, drifted_addr);
2084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x0, MemOperand(x19, largeoffset + 8, PreIndex));
2085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, base_addr + 16);
2087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x0, MemOperand(x20, largeoffset, PostIndex));
2088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[0]);
2093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[1]);
2094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[2]);
2095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, x0);
2096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, x1);
2097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(base_addr, x17);
2099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(base_addr + largeoffset, x18);
2100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(base_addr + 8, x19);
2101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(base_addr + 16 + largeoffset, x20);
2102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_signed) {
2108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[2] = {0x80008080, 0x7fff7f7f};
2111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, src_base);
2115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(w0, MemOperand(x24));
2116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(w1, MemOperand(x24, 4));
2117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(w2, MemOperand(x24));
2118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(w3, MemOperand(x24, 4));
2119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(x4, MemOperand(x24));
2120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(x5, MemOperand(x24, 4));
2121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(x6, MemOperand(x24));
2122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(x7, MemOperand(x24, 4));
2123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsw(x8, MemOperand(x24));
2124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsw(x9, MemOperand(x24, 4));
2125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff80, x0);
2130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007f, x1);
2131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff8080, x2);
2132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00007f7f, x3);
2133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffff80UL, x4);
2134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000000000007fUL, x5);
2135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff8080UL, x6);
2136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000007f7fUL, x7);
2137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff80008080UL, x8);
2138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000007fff7f7fUL, x9);
2139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_regoffset) {
2145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[3] = {1, 2, 3};
2148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t dst[4] = {0, 0, 0, 0};
2149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, src_base + 3 * sizeof(src[0]));
2156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, dst_base + 3 * sizeof(dst[0]));
2157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base + 4 * sizeof(dst[0]));
2158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0);
2159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 4);
2160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, -4);
2161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, 0xfffffffc);  // 32-bit -4.
2162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, 0xfffffffe);  // 32-bit -2.
2163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, 0xffffffff);  // 32-bit -1.
2164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x16, x24));
2166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x16, x25));
2167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x18, x26));
2168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w3, MemOperand(x18, x27, SXTW));
2169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w4, MemOperand(x18, x28, SXTW, 2));
2170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x17, x24));
2171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x17, x25));
2172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x20, x29, SXTW, 2));
2173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
2178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000300000002UL, x1);
2179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x2);
2180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x3);
2181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x4);
2182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(1, dst[0]);
2183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(2, dst[1]);
2184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(3, dst[2]);
2185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(3, dst[3]);
2186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_float) {
2192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float src[3] = {1.0, 2.0, 3.0};
2195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float dst[3] = {0.0, 0.0, 0.0};
2196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
2203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
2204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base);
2205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base);
2206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s0, MemOperand(x17, sizeof(src[0])));
2207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s0, MemOperand(x18, sizeof(dst[0]), PostIndex));
2208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s1, MemOperand(x19, sizeof(src[0]), PostIndex));
2209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
2210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
2211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s2, MemOperand(x22, sizeof(dst[0])));
2212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s0);
2217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, dst[0]);
2218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
2219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, dst[2]);
2220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(3.0, s2);
2221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(3.0, dst[1]);
2222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[0]), x18);
2224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + sizeof(src[0]), x19);
2225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
2226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
2227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_double) {
2234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double src[3] = {1.0, 2.0, 3.0};
2237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double dst[3] = {0.0, 0.0, 0.0};
2238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
2245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
2246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base);
2247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base);
2248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d0, MemOperand(x17, sizeof(src[0])));
2249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d0, MemOperand(x18, sizeof(dst[0]), PostIndex));
2250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d1, MemOperand(x19, sizeof(src[0]), PostIndex));
2251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
2252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
2253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d2, MemOperand(x22, sizeof(dst[0])));
2254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d0);
2259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, dst[0]);
2260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d1);
2261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, dst[2]);
2262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(3.0, d2);
2263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(3.0, dst[1]);
2264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[0]), x18);
2266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + sizeof(src[0]), x19);
2267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
2268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
2269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_float) {
2276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float src[2] = {1.0, 2.0};
2279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float dst[3] = {0.0, 0.0, 0.0};
2280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(s31, s0, MemOperand(x16, 2 * sizeof(src[0]), PostIndex));
2287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(s0, s31, MemOperand(x17, sizeof(dst[1]), PreIndex));
2288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s31);
2293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s0);
2294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, dst[0]);
2295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, dst[1]);
2296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, dst[2]);
2297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x16);
2298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[1]), x17);
2299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_double) {
2305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double src[2] = {1.0, 2.0};
2308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double dst[3] = {0.0, 0.0, 0.0};
2309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(d31, d0, MemOperand(x16, 2 * sizeof(src[0]), PostIndex));
2316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(d0, d31, MemOperand(x17, sizeof(dst[1]), PreIndex));
2317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d31);
2322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d0);
2323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, dst[0]);
2324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, dst[1]);
2325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, dst[2]);
2326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x16);
2327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[1]), x17);
2328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_offset) {
2334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t src[3] = {0x0011223344556677UL, 0x8899aabbccddeeffUL,
2337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                     0xffeeddccbbaa9988UL};
2338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0};
2339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, src_base + 24);
2346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, dst_base + 56);
2347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w0, w1, MemOperand(x16));
2348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w2, w3, MemOperand(x16, 4));
2349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8));
2350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w6, w7, MemOperand(x18, -12));
2351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x8, x9, MemOperand(x18, -16));
2352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w0, w1, MemOperand(x17));
2353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w2, w3, MemOperand(x17, 8));
2354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x4, x5, MemOperand(x17, 16));
2355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w6, w7, MemOperand(x19, -24));
2356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x8, x9, MemOperand(x19, -16));
2357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
2362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
2363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0011223344556677UL, dst[0]);
2364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
2365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
2366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff00112233UL, dst[1]);
2367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, x4);
2368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, dst[2]);
2369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, x5);
2370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, dst[3]);
2371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabb, x6);
2372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xbbaa9988, x7);
2373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xbbaa99888899aabbUL, dst[4]);
2374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, x8);
2375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, dst[5]);
2376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, x9);
2377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, dst[6]);
2378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x16);
2379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x17);
2380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 24, x18);
2381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 56, x19);
2382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldnp_stnp_offset) {
2388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t src[3] = {0x0011223344556677UL, 0x8899aabbccddeeffUL,
2391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                     0xffeeddccbbaa9988UL};
2392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0};
2393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, src_base + 24);
2400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, dst_base + 56);
2401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(w0, w1, MemOperand(x16));
2402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(w2, w3, MemOperand(x16, 4));
2403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(x4, x5, MemOperand(x16, 8));
2404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(w6, w7, MemOperand(x18, -12));
2405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(x8, x9, MemOperand(x18, -16));
2406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(w0, w1, MemOperand(x17));
2407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(w2, w3, MemOperand(x17, 8));
2408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(x4, x5, MemOperand(x17, 16));
2409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(w6, w7, MemOperand(x19, -24));
2410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(x8, x9, MemOperand(x19, -16));
2411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
2416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
2417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0011223344556677UL, dst[0]);
2418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
2419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
2420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff00112233UL, dst[1]);
2421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, x4);
2422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, dst[2]);
2423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, x5);
2424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, dst[3]);
2425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabb, x6);
2426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xbbaa9988, x7);
2427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xbbaa99888899aabbUL, dst[4]);
2428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, x8);
2429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, dst[5]);
2430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, x9);
2431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, dst[6]);
2432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x16);
2433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x17);
2434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 24, x18);
2435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 56, x19);
2436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_preindex) {
2442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t src[3] = {0x0011223344556677UL, 0x8899aabbccddeeffUL,
2445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                     0xffeeddccbbaa9988UL};
2446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
2447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base + 16);
2454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w0, w1, MemOperand(x16, 4, PreIndex));
2455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, x16);
2456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w2, w3, MemOperand(x16, -4, PreIndex));
2457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w2, w3, MemOperand(x17, 4, PreIndex));
2458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, x17);
2459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w0, w1, MemOperand(x17, -4, PreIndex));
2460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8, PreIndex));
2461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, x16);
2462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x6, x7, MemOperand(x16, -8, PreIndex));
2463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x7, x6, MemOperand(x18, 8, PreIndex));
2464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, x18);
2465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x5, x4, MemOperand(x18, -8, PreIndex));
2466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x0);
2471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff, x1);
2472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x44556677, x2);
2473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x3);
2474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff00112233UL, dst[0]);
2475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000112233UL, dst[1]);
2476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, x4);
2477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, x5);
2478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0011223344556677UL, x6);
2479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, x7);
2480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, dst[2]);
2481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, dst[3]);
2482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0011223344556677UL, dst[4]);
2483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x16);
2484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x17);
2485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 16, x18);
2486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4, x19);
2487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 4, x20);
2488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x21);
2489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 24, x22);
2490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_postindex) {
2496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t src[4] = {0x0011223344556677UL, 0x8899aabbccddeeffUL,
2499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                     0xffeeddccbbaa9988UL, 0x7766554433221100UL};
2500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
2501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base + 16);
2508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w0, w1, MemOperand(x16, 4, PostIndex));
2509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, x16);
2510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w2, w3, MemOperand(x16, -4, PostIndex));
2511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w2, w3, MemOperand(x17, 4, PostIndex));
2512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, x17);
2513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w0, w1, MemOperand(x17, -4, PostIndex));
2514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8, PostIndex));
2515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, x16);
2516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x6, x7, MemOperand(x16, -8, PostIndex));
2517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x7, x6, MemOperand(x18, 8, PostIndex));
2518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, x18);
2519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x5, x4, MemOperand(x18, -8, PostIndex));
2520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
2525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
2526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
2527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
2528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x4455667700112233UL, dst[0]);
2529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000112233UL, dst[1]);
2530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0011223344556677UL, x4);
2531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, x5);
2532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, x6);
2533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, x7);
2534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988UL, dst[2]);
2535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeffUL, dst[3]);
2536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0011223344556677UL, dst[4]);
2537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x16);
2538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x17);
2539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 16, x18);
2540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4, x19);
2541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 4, x20);
2542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x21);
2543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 24, x22);
2544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_sign_extend) {
2550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[2] = {0x80000000, 0x7fffffff};
2553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, src_base);
2557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldpsw(x0, x1, MemOperand(x24));
2558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff80000000UL, x0);
2563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000007fffffffUL, x1);
2564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldur_stur) {
2570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int64_t src[2] = {0x0123456789abcdefUL, 0x0123456789abcdefUL};
2573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int64_t dst[5] = {0, 0, 0, 0, 0};
2574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base + 16);
2581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base + 32);
2582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, dst_base + 40);
2583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17, 1));
2584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18, 2));
2585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x17, 3));
2586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x18, 9));
2587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x19, -9));
2588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x20, -5));
2589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x19, -1));
2590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x21, -1));
2591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x6789abcd, x0);
2596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x6789abcd0000L, dst[0]);
2597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xabcdef0123456789L, x1);
2598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xcdef012345678900L, dst[1]);
2599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000ab, dst[2]);
2600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xabcdef01, x2);
2601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00abcdef01000000L, dst[3]);
2602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x3);
2603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0100000000000000L, dst[4]);
2604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x18);
2606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 16, x19);
2607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 32, x20);
2608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal) {
2614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x2, 0x1234567890abcdefUL);
2618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w3, 0xfedcba09);
2619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d13, 1.234);
2620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s25, 2.5);
2621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1234567890abcdefUL, x2);
2626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba09, x3);
2627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.234, d13);
2628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.5, s25);
2629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void LdrLiteralRangeHelper(ptrdiff_t range_,
2635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                  LiteralPoolEmitOption option,
2636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                  bool expect_dump) {
2637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT(range_ > 0);
2638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP_SIZE(range_ + 1024);
2639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label label_1, label_2;
2641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  size_t range = static_cast<size_t>(range_);
2643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  size_t code_size = 0;
2644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  size_t pool_guard_size;
2645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (option == NoJumpRequired) {
2647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Space for an explicit branch.
2648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    pool_guard_size = sizeof(Instr);
2649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  } else {
2650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    pool_guard_size = 0;
2651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
2652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Force a pool dump so the pool starts off empty.
2655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ EmitLiteralPool(JumpRequired);
2656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(0);
2657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x0, 0x1234567890abcdefUL);
2659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w1, 0xfedcba09);
2660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d0, 1.234);
2661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s1, 2.5);
2662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(24);
2663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  code_size += 4 * sizeof(Instr);
2665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that the requested range (allowing space for a branch over the pool)
2667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // can be handled by this test.
2668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT((code_size + pool_guard_size) <= range);
2669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Emit NOPs up to 'range', leaving space for the pool guard.
2671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  while ((code_size + pool_guard_size) < range) {
2672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Nop();
2673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    code_size += sizeof(Instr);
2674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
2675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Emit the guard sequence before the literal pool.
2677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (option == NoJumpRequired) {
2678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ B(&label_1);
2679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    code_size += sizeof(Instr);
2680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
2681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT(code_size == range);
2683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(24);
2684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Possibly generate a literal pool.
2686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ CheckLiteralPool(option);
2687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_1);
2688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (expect_dump) {
2689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT_LITERAL_POOL_SIZE(0);
2690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  } else {
2691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT_LITERAL_POOL_SIZE(24);
2692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
2693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Force a pool flush to check that a second pool functions correctly.
2695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ EmitLiteralPool(JumpRequired);
2696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(0);
2697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // These loads should be after the pool (and will require a new one).
2699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x4, 0x34567890abcdef12UL);
2700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w5, 0xdcba09fe);
2701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d4, 123.4);
2702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s5, 250.0);
2703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(24);
2704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that the literals loaded correctly.
2709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1234567890abcdefUL, x0);
2710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba09, x1);
2711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.234, d0);
2712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.5, s1);
2713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x34567890abcdef12UL, x4);
2714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xdcba09fe, x5);
2715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(123.4, d4);
2716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(250.0, s5);
2717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_1) {
2723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(kRecommendedLiteralPoolRange,
2724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        NoJumpRequired,
2725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        true);
2726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_2) {
2730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(kRecommendedLiteralPoolRange-sizeof(Instr),
2731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        NoJumpRequired,
2732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        false);
2733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_3) {
2737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(2 * kRecommendedLiteralPoolRange,
2738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        JumpRequired,
2739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        true);
2740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_4) {
2744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(2 * kRecommendedLiteralPoolRange-sizeof(Instr),
2745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        JumpRequired,
2746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        false);
2747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_5) {
2751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(kLiteralPoolCheckInterval,
2752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        JumpRequired,
2753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        false);
2754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_6) {
2758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(kLiteralPoolCheckInterval-sizeof(Instr),
2759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        JumpRequired,
2760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        false);
2761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_imm) {
2765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
2769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1111);
2770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0xffffffffffffffffL);
2771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0x8000000000000000L);
2772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x0, Operand(0x123));
2774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x1, Operand(0x122000));
2775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x12, x0, Operand(0xabc << 12));
2776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x13, x2, Operand(1));
2777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w14, w0, Operand(0x123));
2779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w15, w1, Operand(0x122000));
2780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w16, w0, Operand(0xabc << 12));
2781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w17, w2, Operand(1));
2782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x20, x0, Operand(0x1));
2784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x21, x1, Operand(0x111));
2785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x22, x1, Operand(0x1 << 12));
2786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x23, x3, Operand(1));
2787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w24, w0, Operand(0x1));
2789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w25, w1, Operand(0x111));
2790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w26, w1, Operand(0x1 << 12));
2791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w27, w3, Operand(1));
2792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x123, x10);
2797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x123111, x11);
2798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xabc000, x12);
2799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x13);
2800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x123, w14);
2802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x123111, w15);
2803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xabc000, w16);
2804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x0, w17);
2805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffL, x20);
2807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1000, x21);
2808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x111, x22);
2809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffL, x23);
2810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffff, w24);
2812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x1000, w25);
2813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x111, w26);
2814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffff, w27);
2815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_wide_imm) {
2821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
2825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1);
2826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x0, Operand(0x1234567890abcdefUL));
2828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x1, Operand(0xffffffff));
2829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w12, w0, Operand(0x12345678));
2831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w13, w1, Operand(0xffffffff));
2832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x20, x0, Operand(0x1234567890abcdefUL));
2834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w21, w0, Operand(0x12345678));
2836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1234567890abcdefUL, x10);
2841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x100000000UL, x11);
2842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x12345678, w12);
2844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x13);
2845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(-0x1234567890abcdefUL, x20);
2847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(-0x12345678, w21);
2849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_shifted) {
2855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
2859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0123456789abcdefL);
2860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0xfedcba9876543210L);
2861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0xffffffffffffffffL);
2862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x1, Operand(x2));
2864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x0, Operand(x1, LSL, 8));
2865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x12, x0, Operand(x1, LSR, 8));
2866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x13, x0, Operand(x1, ASR, 8));
2867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x14, x0, Operand(x2, ASR, 8));
2868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w15, w0, Operand(w1, ASR, 8));
2869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w18, w3, Operand(w1, ROR, 8));
2870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x19, x3, Operand(x1, ROR, 8));
2871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x20, x3, Operand(x2));
2873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x21, x3, Operand(x1, LSL, 8));
2874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x22, x3, Operand(x1, LSR, 8));
2875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x23, x3, Operand(x1, ASR, 8));
2876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x24, x3, Operand(x2, ASR, 8));
2877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w25, w3, Operand(w1, ASR, 8));
2878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w26, w3, Operand(w1, ROR, 8));
2879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x27, x3, Operand(x1, ROR, 8));
2880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffL, x10);
2885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x23456789abcdef00L, x11);
2886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000123456789abcdL, x12);
2887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000123456789abcdL, x13);
2888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffedcba98765432L, x14);
2889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff89abcd, x15);
2890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xef89abcc, x18);
2891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xef0123456789abccL, x19);
2892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefL, x20);
2894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xdcba9876543210ffL, x21);
2895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffedcba98765432L, x22);
2896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffedcba98765432L, x23);
2897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000123456789abcdL, x24);
2898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00765432, x25);
2899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x10765432, x26);
2900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x10fedcba98765432L, x27);
2901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_extended) {
2907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
2911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0123456789abcdefL);
2912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0xfedcba9876543210L);
2913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, 0x80);
2914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x0, Operand(x1, UXTB, 0));
2916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x0, Operand(x1, UXTB, 1));
2917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x12, x0, Operand(x1, UXTH, 2));
2918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x13, x0, Operand(x1, UXTW, 4));
2919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x14, x0, Operand(x1, SXTB, 0));
2921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x15, x0, Operand(x1, SXTB, 1));
2922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x16, x0, Operand(x1, SXTH, 2));
2923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x17, x0, Operand(x1, SXTW, 3));
2924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x18, x0, Operand(x2, SXTB, 0));
2925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x19, x0, Operand(x2, SXTB, 1));
2926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x20, x0, Operand(x2, SXTH, 2));
2927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x21, x0, Operand(x2, SXTW, 3));
2928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x22, x1, Operand(x2, SXTB, 1));
2930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x23, x1, Operand(x2, SXTB, 1));
2931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w24, w1, Operand(w2, UXTB, 2));
2933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w25, w0, Operand(w1, SXTB, 0));
2934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w26, w0, Operand(w1, SXTB, 1));
2935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w27, w2, Operand(w1, SXTW, 3));
2936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w28, w0, Operand(w1, SXTW, 3));
2938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x29, x0, Operand(w1, SXTW, 3));
2939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x30, x0, Operand(w3, SXTB, 1));
2941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xefL, x10);
2946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1deL, x11);
2947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x337bcL, x12);
2948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x89abcdef0L, x13);
2949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffefL, x14);
2951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffdeL, x15);
2952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff37bcL, x16);
2953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffc4d5e6f78L, x17);
2954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x10L, x18);
2955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x20L, x19);
2956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xc840L, x20);
2957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3b2a19080L, x21);
2958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abce0fL, x22);
2960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdcfL, x23);
2961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x89abce2f, w24);
2963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffef, w25);
2964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffde, w26);
2965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xc3b2a188, w27);
2966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x4d5e6f78, w28);
2968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffc4d5e6f78L, x29);
2969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(256, x30);
2971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_negative) {
2977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
2981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 4687);
2982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0x1122334455667788);
2983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, 0x11223344);
2984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, 400000);
2985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x0, -42);
2987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x1, -687);
2988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x12, x2, -0x88);
2989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x13, x0, -600);
2991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x14, x1, -313);
2992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x15, x2, -0x555);
2993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w19, w3, -0x344);
2995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w20, w4, -2000);
2996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w21, w3, -0xbc);
2998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w22, w4, -2000);
2999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(-42, x10);
3004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(4000, x11);
3005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667700, x12);
3006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(600, x13);
3008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5000, x14);
3009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667cdd, x15);
3010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11223000, w19);
3012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(398000, w20);
3013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11223400, w21);
3015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(402000, w22);
3016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3021f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(add_sub_zero) {
3022f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
3023f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3024f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3025f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3026f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x1, 0);
3027f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x2, 0);
3028f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3029f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  Label blob1;
3030f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bind(&blob1);
3031f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Add(x0, x0, 0);
3032f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sub(x1, x1, 0);
3033f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sub(x2, x2, xzr);
3034f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  CHECK(__ SizeOfCodeGeneratedSince(&blob1) == 0);
3035f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3036f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  Label blob2;
3037f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bind(&blob2);
3038f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Add(w3, w3, 0);
3039f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  CHECK(__ SizeOfCodeGeneratedSince(&blob2) != 0);
3040f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3041f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  Label blob3;
3042f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bind(&blob3);
3043f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sub(w3, w3, wzr);
3044f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  CHECK(__ SizeOfCodeGeneratedSince(&blob3) != 0);
3045f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3046f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3047f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3048f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3049f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3050f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x0);
3051f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x1);
3052f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x2);
3053f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3054f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
3055f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
3056f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3057f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3058f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(claim_drop_zero) {
3059f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
3060f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3061f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3062f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3063f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  Label start;
3064f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bind(&start);
3065f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Claim(Operand(0));
3066f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Drop(Operand(0));
3067f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Claim(Operand(xzr));
3068f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Drop(Operand(xzr));
3069f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
3070f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3071f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3072f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3073f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3074f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3075f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
3076f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
3077f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3078f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(neg) {
3080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xf123456789abcdefL);
3084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Immediate.
3086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x1, 0x123);
3087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w2, 0x123);
3088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Shifted.
3090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x3, Operand(x0, LSL, 1));
3091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w4, Operand(w0, LSL, 2));
3092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x5, Operand(x0, LSR, 3));
3093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w6, Operand(w0, LSR, 4));
3094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x7, Operand(x0, ASR, 5));
3095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w8, Operand(w0, ASR, 6));
3096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Extended.
3098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w9, Operand(w0, UXTB));
3099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x10, Operand(x0, SXTB, 1));
3100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w11, Operand(w0, UXTH, 2));
3101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x12, Operand(x0, SXTH, 3));
3102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w13, Operand(w0, UXTW, 4));
3103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x14, Operand(x0, SXTW, 4));
3104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffffeddUL, x1);
3109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffedd, x2);
3110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1db97530eca86422UL, x3);
3111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xd950c844, x4);
3112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xe1db97530eca8643UL, x5);
3113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf7654322, x6);
3114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0076e5d4c3b2a191UL, x7);
3115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x01d950c9, x8);
3116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff11, x9);
3117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000000022UL, x10);
3118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffcc844, x11);
3119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000019088UL, x12);
3120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x65432110, x13);
3121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000765432110UL, x14);
3122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adc_sbc_shift) {
3128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
3133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0x0123456789abcdefL);
3134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0xfedcba9876543210L);
3135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 0xffffffffffffffffL);
3136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3138f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x5, x2, Operand(x3));
3141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x6, x0, Operand(x1, LSL, 60));
3142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(x7, x4, Operand(x3, LSR, 4));
3143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x8, x2, Operand(x3, ASR, 4));
3144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x9, x2, Operand(x3, ROR, 8));
3145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w10, w2, Operand(w3));
3147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w11, w0, Operand(w1, LSL, 30));
3148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(w12, w4, Operand(w3, LSR, 4));
3149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w13, w2, Operand(w3, ASR, 4));
3150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w14, w2, Operand(w3, ROR, 8));
3151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x18, x2, Operand(x3));
3156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x19, x0, Operand(x1, LSL, 60));
3157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(x20, x4, Operand(x3, LSR, 4));
3158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x21, x2, Operand(x3, ASR, 4));
3159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x22, x2, Operand(x3, ROR, 8));
3160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w23, w2, Operand(w3));
3162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w24, w0, Operand(w1, LSL, 30));
3163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(w25, w4, Operand(w3, LSR, 4));
3164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w26, w2, Operand(w3, ASR, 4));
3165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w27, w2, Operand(w3, ROR, 8));
3166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffL, x5);
3171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1L << 60, x6);
3172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf0123456789abcddL, x7);
3173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0111111111111110L, x8);
3174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1222222222222221L, x9);
3175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffff, w10);
3177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(1 << 30, w11);
3178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xf89abcdd, w12);
3179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x91111110, w13);
3180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x9a222221, w14);
3181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffL + 1, x18);
3183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((1L << 60) + 1, x19);
3184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf0123456789abcddL + 1, x20);
3185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0111111111111110L + 1, x21);
3186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1222222222222221L + 1, x22);
3187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffff + 1, w23);
3189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32((1 << 30) + 1, w24);
3190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xf89abcdd + 1, w25);
3191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x91111110 + 1, w26);
3192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x9a222221 + 1, w27);
3193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that adc correctly sets the condition flags.
3195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
3197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xffffffffffffffffL);
3198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3199f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3200f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1));
3201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3206f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
3210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x8000000000000000L);
3211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3212f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3213f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1, ASR, 63));
3214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3219f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x10);
3223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x07ffffffffffffffL);
3224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3225f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3226f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1, LSL, 4));
3227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3232f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000000L, x10);
3233f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3234f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Check that sbc correctly sets the condition flags.
3235f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3236f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3237f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x1, 0xffffffffffffffffL);
3238f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3239f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3240f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbcs(x10, x0, Operand(x1));
3241f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3242f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3243f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3244f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3245f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
3246f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3247f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3248f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3249f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 1);
3250f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x1, 0xffffffffffffffffL);
3251f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3252f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3253f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbcs(x10, x0, Operand(x1, LSR, 1));
3254f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3255f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3256f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3257f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3258f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3259f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000001L, x10);
3260f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3261f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3262f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3263f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3264f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3265f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbcs(x10, x0, Operand(0xffffffffffffffffL));
3266f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3267f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3268f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3269f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3270f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
3271f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3272f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3273f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START()
3274f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w0, 0x7fffffff);
3275f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3276f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3277f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngcs(w10, w0);
3278f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3279f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3280f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3281f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3282f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3283f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x10);
3284f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3285f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3286f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3287f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3288f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngcs(x10, 0x7fffffffffffffffL);
3289f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3290f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3291f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3292f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3293f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3294f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000000L, x10);
3295f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3296f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START()
3297f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3298f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Set the C flag.
3299f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Cmp(x0, Operand(x0));
3300f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbcs(x10, x0, Operand(1));
3301f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3302f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3303f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3304f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3305f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3306f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffL, x10);
3307f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3308f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START()
3309f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3310f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Set the C flag.
3311f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Cmp(x0, Operand(x0));
3312f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngcs(x10, 0x7fffffffffffffffL);
3313f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3314f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3315f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3316f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3317f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3318f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000001L, x10);
3319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adc_sbc_extend) {
3325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3329f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
3333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0x0123456789abcdefL);
3334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x10, x1, Operand(w2, UXTB, 1));
3336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x11, x1, Operand(x2, SXTH, 2));
3337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(x12, x1, Operand(w2, UXTW, 4));
3338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x13, x1, Operand(x2, UXTX, 4));
3339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w14, w1, Operand(w2, UXTB, 1));
3341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w15, w1, Operand(w2, SXTH, 2));
3342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w9, w1, Operand(w2, UXTW, 4));
3343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x20, x1, Operand(w2, UXTB, 1));
3348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x21, x1, Operand(x2, SXTH, 2));
3349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(x22, x1, Operand(w2, UXTW, 4));
3350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x23, x1, Operand(x2, UXTX, 4));
3351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w24, w1, Operand(w2, UXTB, 1));
3353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w25, w1, Operand(w2, SXTH, 2));
3354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w26, w1, Operand(w2, UXTW, 4));
3355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1df, x10);
3360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff37bdL, x11);
3361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff765432110L, x12);
3362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1L, x13);
3363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x1df, w14);
3365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffff37bd, w15);
3366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x9abcdef1, w9);
3367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1df + 1, x20);
3369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff37bdL + 1, x21);
3370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff765432110L + 1, x22);
3371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1L + 1, x23);
3372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x1df + 1, w24);
3374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffff37bd + 1, w25);
3375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x9abcdef1 + 1, w26);
3376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that adc correctly sets the condition flags.
3378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xff);
3380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xffffffffffffffffL);
3381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3382f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3383f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1, SXTX, 1));
3384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(CFlag);
3389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x7fffffffffffffffL);
3392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
3393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3394f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3395f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1, UXTB, 2));
3396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x7fffffffffffffffL);
3404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3405f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3406f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(1));
3407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adc_sbc_wide_imm) {
3418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3424f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x7, x0, Operand(0x1234567890abcdefUL));
3427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w8, w0, Operand(0xffffffff));
3428f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbc(x9, x0, Operand(0x1234567890abcdefUL));
3429f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbc(w10, w0, Operand(0xffffffff));
3430f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngc(x11, Operand(0xffffffff00000000UL));
3431f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngc(w12, Operand(0xffff0000));
3432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3436f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adc(x18, x0, Operand(0x1234567890abcdefUL));
3437f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adc(w19, w0, Operand(0xffffffff));
3438f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbc(x20, x0, Operand(0x1234567890abcdefUL));
3439f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbc(w21, w0, Operand(0xffffffff));
3440f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngc(x22, Operand(0xffffffff00000000UL));
3441f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngc(w23, Operand(0xffff0000));
3442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1234567890abcdefUL, x7);
3447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x8);
3448f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xedcba9876f543210UL, x9);
3449f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3450f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff, x11);
3451f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffff, x12);
3452f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3453f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x1234567890abcdefUL + 1, x18);
3454f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x19);
3455f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xedcba9876f543211UL, x20);
3456f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x21);
3457f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x100000000UL, x22);
3458f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x10000, x23);
3459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(flags) {
3464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1111111111111111L);
3469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x10, Operand(x0));
3470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x11, Operand(x1));
3471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w12, Operand(w1));
3472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3473f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ngc(x13, Operand(x0));
3475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x0, Operand(x0));
3477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ngc(w14, Operand(w0));
3478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x10);
3483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(-0x1111111111111111L, x11);
3484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(-0x11111111, w12);
3485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(-1L, x13);
3486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0, w14);
3487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x0, Operand(x0));
3491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
3499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1111111111111111L);
3509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x0, Operand(x1));
3510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
3518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0x11111111);
3519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w1));
3520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1111111111111111L);
3528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x1, Operand(0));
3529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(CFlag);
3534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0x11111111);
3537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w1, Operand(0));
3538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(CFlag);
3543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
3546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x7fffffffffffffffL);
3547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(x1, Operand(x0));
3548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 1);
3556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0x7fffffff);
3557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(w1, Operand(w0));
3558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
3566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xffffffffffffffffL);
3567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(x1, Operand(x0));
3568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 1);
3576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0xffffffff);
3577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(w1, Operand(w0));
3578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
3586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 1);
3587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3588f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(w0, w0, Operand(0));
3589f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngcs(w0, Operand(w1));
3590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
3598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0);
3599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3601f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngcs(w0, Operand(w1));
3602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(cmp_shift) {
3613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xf0000000);
3617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0xf000000010000000UL);
3618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 0xf0000000f0000000UL);
3619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 0x7800000078000000UL);
3620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, 0x3c0000003c000000UL);
3621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, 0x8000000780000000UL);
3622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0x0000000f00000000UL);
3623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 0x00000003c0000000UL);
3624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, 0x8000000780000000UL);
3625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, 0xc0000003);
3626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w21, LSL, 1));
3628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x20, Operand(x22, LSL, 2));
3631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w19, Operand(w23, LSR, 3));
3634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
3635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x18, Operand(x24, LSR, 4));
3637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
3638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w25, ASR, 2));
3640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
3641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x20, Operand(x26, ASR, 3));
3643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
3644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w27, Operand(w22, ROR, 28));
3646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x6, NZCV);
3647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x20, Operand(x21, ROR, 31));
3649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x7, NZCV);
3650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
3655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
3656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
3657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w3);
3658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
3659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
3660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w6);
3661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w7);
3662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(cmp_extend) {
3668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w20, 0x2);
3672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, 0x1);
3673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, 0xffffffffffffffffUL);
3674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, 0xff);
3675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0xfffffffffffffffeUL);
3676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 0xffff);
3677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, 0xffffffff);
3678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w21, LSL, 1));
3680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x22, Operand(x23, SXTB, 0));
3683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x24, Operand(x23, SXTB, 1));
3686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
3687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x24, Operand(x23, UXTB, 1));
3689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
3690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w22, Operand(w25, UXTH));
3692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
3693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x22, Operand(x25, SXTH));
3695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
3696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x22, Operand(x26, UXTW));
3698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x6, NZCV);
3699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x24, Operand(x26, SXTW, 1));
3701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x7, NZCV);
3702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
3707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
3708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
3709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w3);
3710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w4);
3711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
3712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w6);
3713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w7);
3714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ccmp) {
3720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w16, 0);
3724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w17, 1);
3725578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(w16, w16);
3726578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ccmp(w16, w17, NCFlag, eq);
3727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3729578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(w16, w16);
3730578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ccmp(w16, w17, NCFlag, ne);
3731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3733578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x16, x16);
3734578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ccmn(x16, 2, NZCVFlag, eq);
3735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
3736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3737578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x16, x16);
3738578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ccmn(x16, 2, NZCVFlag, ne);
3739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
3740578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3741578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ ccmp(x16, x16, NZCVFlag, al);
3742578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x4, NZCV);
3743578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3744578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ ccmp(x16, x16, NZCVFlag, nv);
3745578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x5, NZCV);
3746578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w0);
3752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w1);
3753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NoFlag, w2);
3754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NZCVFlag, w3);
3755578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
3756578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
3757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ccmp_wide_imm) {
3763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w20, 0);
3767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(w20, Operand(0x12345678), NZCVFlag, eq);
3770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x20, Operand(0xffffffffffffffffUL), NZCVFlag, eq);
3774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w0);
3780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NoFlag, w1);
3781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ccmp_shift_extend) {
3787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w20, 0x2);
3791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, 0x1);
3792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, 0xffffffffffffffffUL);
3793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, 0xff);
3794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0xfffffffffffffffeUL);
3795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(w20, Operand(w21, LSL, 1), NZCVFlag, eq);
3798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x22, Operand(x23, SXTB, 0), NZCVFlag, eq);
3802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x24, Operand(x23, SXTB, 1), NZCVFlag, eq);
3806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
3807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x24, Operand(x23, UXTB, 1), NZCVFlag, eq);
3810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
3811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x24, Operand(x23, UXTB, 1), NZCVFlag, ne);
3814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
3815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
3820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
3821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
3822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w3);
3823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NZCVFlag, w4);
3824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(csel) {
3830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
3834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0x0000000f0000000fUL);
3835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 0x0000001f0000001fUL);
3836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w16, Operand(0));
3838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csel(w0, w24, w25, eq);
3839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csel(w1, w24, w25, ne);
3840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csinc(w2, w24, w25, mi);
3841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csinc(w3, w24, w25, pl);
3842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3843578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ csel(w13, w24, w25, al);
3844578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ csel(x14, x24, x25, nv);
3845578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x16, Operand(1));
3847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csinv(x4, x24, x25, gt);
3848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csinv(x5, x24, x25, le);
3849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csneg(x6, x24, x25, hs);
3850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csneg(x7, x24, x25, lo);
3851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cset(w8, ne);
3853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csetm(w9, ne);
3854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x10, x25, ne);
3855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinv(x11, x24, ne);
3856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cneg(x12, x24, ne);
3857578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3858578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ csel(w15, w24, w25, al);
3859578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ csel(x17, x24, x25, nv);
3860578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000f, x0);
3866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000001f, x1);
3867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000020, x2);
3868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000f, x3);
3869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffe0ffffffe0UL, x4);
3870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000f0000000fUL, x5);
3871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffe0ffffffe1UL, x6);
3872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000f0000000fUL, x7);
3873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x8);
3874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x9);
3875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000001f00000020UL, x10);
3876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff0fffffff0UL, x11);
3877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff0fffffff1UL, x12);
3878578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(0x0000000f, x13);
3879578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(0x0000000f0000000fUL, x14);
3880578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(0x0000000f, x15);
3881578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(0x0000000f0000000fUL, x17);
3882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3887f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(csel_imm) {
3888f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
3889f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3890f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3891f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x18, 0);
3892f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x19, 0x80000000);
3893f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x20, 0x8000000000000000UL);
3894f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3895f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Cmp(x18, Operand(0));
3896f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w0, w19, -2, ne);
3897f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w1, w19, -1, ne);
3898f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w2, w19, 0, ne);
3899f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w3, w19, 1, ne);
3900f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w4, w19, 2, ne);
3901f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w5, w19, Operand(w19, ASR, 31), ne);
3902f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w6, w19, Operand(w19, ROR, 1), ne);
3903f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w7, w19, 3, eq);
3904f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3905f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x8, x20, -2, ne);
3906f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x9, x20, -1, ne);
3907f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x10, x20, 0, ne);
3908f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x11, x20, 1, ne);
3909f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x12, x20, 2, ne);
3910f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x13, x20, Operand(x20, ASR, 63), ne);
3911f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x14, x20, Operand(x20, ROR, 1), ne);
3912f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x15, x20, 3, eq);
3913f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3914f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3915f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3916f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3917f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3918f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(-2, w0);
3919f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(-1, w1);
3920f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(0, w2);
3921f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(1, w3);
3922f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(2, w4);
3923f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(-1, w5);
3924f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(0x40000000, w6);
3925f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(0x80000000, w7);
3926f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3927f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(-2, x8);
3928f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(-1, x9);
3929f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3930f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x11);
3931f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(2, x12);
3932f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(-1, x13);
3933f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x4000000000000000UL, x14);
3934f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x15);
3935f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3936f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
3937f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
3938f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3939f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(lslv) {
3941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t value = 0x0123456789abcdefUL;
3944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
3945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, value);
3948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, shift[0]);
3949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, shift[1]);
3950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, shift[2]);
3951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, shift[3]);
3952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, shift[4]);
3953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, shift[5]);
3954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ lslv(x0, x0, xzr);
3956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x16, x0, x1);
3958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x17, x0, x2);
3959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x18, x0, x3);
3960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x19, x0, x4);
3961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x20, x0, x5);
3962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x21, x0, x6);
3963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w22, w0, w1);
3965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w23, w0, w2);
3966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w24, w0, w3);
3967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w25, w0, w4);
3968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w26, w0, w5);
3969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w27, w0, w6);
3970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value, x0);
3975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[0] & 63), x16);
3976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[1] & 63), x17);
3977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[2] & 63), x18);
3978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[3] & 63), x19);
3979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[4] & 63), x20);
3980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[5] & 63), x21);
3981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[0] & 31), w22);
3982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[1] & 31), w23);
3983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[2] & 31), w24);
3984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[3] & 31), w25);
3985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[4] & 31), w26);
3986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[5] & 31), w27);
3987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(lsrv) {
3993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t value = 0x0123456789abcdefUL;
3996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
3997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, value);
4000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, shift[0]);
4001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, shift[1]);
4002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, shift[2]);
4003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, shift[3]);
4004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, shift[4]);
4005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, shift[5]);
4006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ lsrv(x0, x0, xzr);
4008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x16, x0, x1);
4010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x17, x0, x2);
4011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x18, x0, x3);
4012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x19, x0, x4);
4013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x20, x0, x5);
4014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x21, x0, x6);
4015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w22, w0, w1);
4017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w23, w0, w2);
4018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w24, w0, w3);
4019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w25, w0, w4);
4020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w26, w0, w5);
4021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w27, w0, w6);
4022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value, x0);
4027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[0] & 63), x16);
4028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[1] & 63), x17);
4029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[2] & 63), x18);
4030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[3] & 63), x19);
4031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[4] & 63), x20);
4032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[5] & 63), x21);
4033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  value &= 0xffffffffUL;
4035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[0] & 31), w22);
4036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[1] & 31), w23);
4037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[2] & 31), w24);
4038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[3] & 31), w25);
4039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[4] & 31), w26);
4040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[5] & 31), w27);
4041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(asrv) {
4047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int64_t value = 0xfedcba98fedcba98UL;
4050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
4051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, value);
4054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, shift[0]);
4055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, shift[1]);
4056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, shift[2]);
4057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, shift[3]);
4058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, shift[4]);
4059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, shift[5]);
4060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ asrv(x0, x0, xzr);
4062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x16, x0, x1);
4064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x17, x0, x2);
4065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x18, x0, x3);
4066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x19, x0, x4);
4067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x20, x0, x5);
4068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x21, x0, x6);
4069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w22, w0, w1);
4071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w23, w0, w2);
4072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w24, w0, w3);
4073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w25, w0, w4);
4074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w26, w0, w5);
4075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w27, w0, w6);
4076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value, x0);
4081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[0] & 63), x16);
4082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[1] & 63), x17);
4083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[2] & 63), x18);
4084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[3] & 63), x19);
4085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[4] & 63), x20);
4086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[5] & 63), x21);
4087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int32_t value32 = static_cast<int32_t>(value & 0xffffffffUL);
4089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[0] & 31), w22);
4090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[1] & 31), w23);
4091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[2] & 31), w24);
4092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[3] & 31), w25);
4093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[4] & 31), w26);
4094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[5] & 31), w27);
4095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(rorv) {
4101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t value = 0x0123456789abcdefUL;
4104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int shift[] = {4, 8, 12, 16, 24, 36};
4105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, value);
4108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, shift[0]);
4109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, shift[1]);
4110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, shift[2]);
4111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, shift[3]);
4112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, shift[4]);
4113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, shift[5]);
4114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ rorv(x0, x0, xzr);
4116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x16, x0, x1);
4118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x17, x0, x2);
4119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x18, x0, x3);
4120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x19, x0, x4);
4121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x20, x0, x5);
4122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x21, x0, x6);
4123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w22, w0, w1);
4125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w23, w0, w2);
4126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w24, w0, w3);
4127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w25, w0, w4);
4128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w26, w0, w5);
4129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w27, w0, w6);
4130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value, x0);
4135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf0123456789abcdeUL, x16);
4136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xef0123456789abcdUL, x17);
4137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xdef0123456789abcUL, x18);
4138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xcdef0123456789abUL, x19);
4139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xabcdef0123456789UL, x20);
4140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x789abcdef0123456UL, x21);
4141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xf89abcde, w22);
4142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xef89abcd, w23);
4143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xdef89abc, w24);
4144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xcdef89ab, w25);
4145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xabcdef89, w26);
4146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xf89abcde, w27);
4147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bfm) {
4153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0123456789abcdefL);
4157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, 0x8888888888888888L);
4159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x11, 0x8888888888888888L);
4160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x12, 0x8888888888888888L);
4161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x13, 0x8888888888888888L);
4162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w20, 0x88888888);
4163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, 0x88888888);
4164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bfm(x10, x1, 16, 31);
4166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bfm(x11, x1, 32, 15);
4167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bfm(w20, w1, 16, 23);
4169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bfm(w21, w1, 24, 15);
4170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Aliases.
4172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bfi(x12, x1, 16, 8);
4173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bfxil(x13, x1, 16, 8);
4174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x88888888888889abL, x10);
4180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8888cdef88888888L, x11);
4181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x888888ab, w20);
4183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x88cdef88, w21);
4184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8888888888ef8888L, x12);
4186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x88888888888888abL, x13);
4187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(sbfm) {
4193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0123456789abcdefL);
4197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0xfedcba9876543210L);
4198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(x10, x1, 16, 31);
4200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(x11, x1, 32, 15);
4201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(x12, x1, 32, 47);
4202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(x13, x1, 48, 35);
4203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(w14, w1, 16, 23);
4205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(w15, w1, 24, 15);
4206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(w16, w2, 16, 23);
4207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(w17, w2, 24, 15);
4208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Aliases.
4210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x18, x1, 32);
4211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x19, x2, 32);
4212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbfiz(x20, x1, 8, 16);
4213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbfiz(x21, x2, 8, 16);
4214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbfx(x22, x1, 8, 16);
4215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbfx(x23, x2, 8, 16);
4216f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sxtb(x24, w1);
4217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sxtb(x25, x2);
4218f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sxth(x26, w1);
4219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sxth(x27, x2);
4220f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sxtw(x28, w1);
4221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sxtw(x29, x2);
4222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffff89abL, x10);
4228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffcdef00000000L, x11);
4229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x4567L, x12);
4230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x789abcdef0000L, x13);
4231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffab, w14);
4233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffcdef00, w15);
4234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x54, w16);
4235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00321000, w17);
4236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x01234567L, x18);
4238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffedcba98L, x19);
4239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffcdef00L, x20);
4240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x321000L, x21);
4241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffabcdL, x22);
4242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x5432L, x23);
4243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffefL, x24);
4244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x10, x25);
4245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffcdefL, x26);
4246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3210, x27);
4247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff89abcdefL, x28);
4248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, x29);
4249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ubfm) {
4255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0123456789abcdefL);
4259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0xfedcba9876543210L);
4260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, 0x8888888888888888L);
4262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x11, 0x8888888888888888L);
4263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(x10, x1, 16, 31);
4265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(x11, x1, 32, 15);
4266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(x12, x1, 32, 47);
4267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(x13, x1, 48, 35);
4268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(w25, w1, 16, 23);
4270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(w26, w1, 24, 15);
4271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(w27, w2, 16, 23);
4272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(w28, w2, 24, 15);
4273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Aliases
4275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x15, x1, 63);
4276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x16, x1, 0);
4277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x17, x1, 32);
4278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ubfiz(x18, x1, 8, 16);
4279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ubfx(x19, x1, 8, 16);
4280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Uxtb(x20, x1);
4281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Uxth(x21, x1);
4282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Uxtw(x22, x1);
4283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000000089abL, x10);
4288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000cdef00000000L, x11);
4289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x4567L, x12);
4290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x789abcdef0000L, x13);
4291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x000000ab, w25);
4293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00cdef00, w26);
4294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x54, w27);
4295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00321000, w28);
4296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000L, x15);
4298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0123456789abcdefL, x16);
4299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x01234567L, x17);
4300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xcdef00L, x18);
4301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xabcdL, x19);
4302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xefL, x20);
4303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xcdefL, x21);
4304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x89abcdefL, x22);
4305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(extr) {
4311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0123456789abcdefL);
4315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0xfedcba9876543210L);
4316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Extr(w10, w1, w2, 0);
4318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Extr(w11, w1, w2, 1);
4319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Extr(x12, x2, x1, 2);
4320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w13, w1, 0);
4322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w14, w2, 17);
4323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w15, w1, 31);
4324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x18, x2, 1);
4325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x19, x1, 63);
4326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, x10);
4331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xbb2a1908, x11);
4332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0048d159e26af37bUL, x12);
4333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x89abcdef, x13);
4334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x19083b2a, x14);
4335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x13579bdf, x15);
4336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7f6e5d4c3b2a1908UL, x18);
4337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x02468acf13579bdeUL, x19);
4338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fmov_imm) {
4344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s11, 1.0);
4348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d22, -13.0);
4349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 255.0);
4350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d2, 12.34567);
4351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, 0.0);
4352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d4, 0.0);
4353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32PositiveInfinity);
4354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d6, kFP64NegativeInfinity);
4355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s11);
4360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-13.0, d22);
4361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(255.0, s1);
4362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(12.34567, d2);
4363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s3);
4364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d4);
4365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
4366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d6);
4367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fmov_reg) {
4373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, 1.0);
4377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(w10, s20);
4378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s30, w10);
4379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, s20);
4380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d1, -13.0);
4381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(x1, d1);
4382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d2, x1);
4383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d4, d1);
4384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d6, rawbits_to_double(0x0123456789abcdefL));
4385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, s6);
4386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(float_to_rawbits(1.0), w10);
4391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s30);
4392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s5);
4393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(double_to_rawbits(-13.0), x1);
4394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-13.0, d2);
4395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-13.0, d4);
4396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(0x89abcdef), s6);
4397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fadd) {
4403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s13, -0.0);
4407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s14, kFP32PositiveInfinity);
4408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s15, kFP32NegativeInfinity);
4409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 3.25);
4410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.0);
4411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 0);
4412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
4414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
4415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
4416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0);
4417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d30, -2.0);
4418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d31, 2.25);
4419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(s0, s16, s17);
4421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(s1, s17, s18);
4422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(s2, s13, s17);
4423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(s3, s14, s17);
4424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(s4, s15, s17);
4425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(d5, d30, d31);
4427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(d6, d29, d31);
4428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(d7, d26, d31);
4429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(d8, d27, d31);
4430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fadd(d9, d28, d31);
4431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(4.25, s0);
4436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
4437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s2);
4438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s3);
4439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s4);
4440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.25, d5);
4441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.25, d6);
4442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.25, d7);
4443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d8);
4444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d9);
4445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fsub) {
4451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s13, -0.0);
4455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s14, kFP32PositiveInfinity);
4456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s15, kFP32NegativeInfinity);
4457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 3.25);
4458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.0);
4459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 0);
4460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
4462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
4463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
4464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0);
4465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d30, -2.0);
4466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d31, 2.25);
4467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(s0, s16, s17);
4469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(s1, s17, s18);
4470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(s2, s13, s17);
4471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(s3, s17, s14);
4472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(s4, s17, s15);
4473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(d5, d30, d31);
4475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(d6, d29, d31);
4476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(d7, d26, d31);
4477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(d8, d31, d27);
4478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsub(d9, d31, d28);
4479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.25, s0);
4484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
4485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-1.0, s2);
4486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s3);
4487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s4);
4488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-4.25, d5);
4489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.25, d6);
4490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.25, d7);
4491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d8);
4492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d9);
4493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fmul) {
4499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s13, -0.0);
4503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s14, kFP32PositiveInfinity);
4504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s15, kFP32NegativeInfinity);
4505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 3.25);
4506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 2.0);
4507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 0);
4508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -2.0);
4509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
4511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
4512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
4513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0);
4514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d30, -2.0);
4515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d31, 2.25);
4516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(s0, s16, s17);
4518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(s1, s17, s18);
4519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(s2, s13, s13);
4520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(s3, s14, s19);
4521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(s4, s15, s19);
4522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(d5, d30, d31);
4524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(d6, d29, d31);
4525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(d7, d26, d26);
4526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(d8, d27, d30);
4527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmul(d9, d28, d30);
4528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(6.5, s0);
4533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s1);
4534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s2);
4535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s3);
4536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s4);
4537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-4.5, d5);
4538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d6);
4539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d7);
4540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d8);
4541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d9);
4542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4547f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void FmaddFmsubDoubleHelper(double n, double m, double a,
4548f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                                   double fmadd, double fmsub) {
4549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4550f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
4551f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4552f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d0, n);
4553f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d1, m);
4554f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d2, a);
4555f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmadd(d28, d0, d1, d2);
4556f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmsub(d29, d0, d1, d2);
4557f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fnmadd(d30, d0, d1, d2);
4558f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fnmsub(d31, d0, d1, d2);
4559f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4560f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
4561f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
4562f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4563f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(fmadd, d28);
4564f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(fmsub, d29);
4565f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(-fmadd, d30);
4566f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(-fmsub, d31);
4567f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4568f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
4569f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4570f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4572f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmadd_fmsub_double) {
4573f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  double inputs[] = {
4574f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Normal numbers, including -0.0.
4575f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    DBL_MAX, DBL_MIN, 3.25, 2.0, 0.0,
4576f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -DBL_MAX, -DBL_MIN, -3.25, -2.0, -0.0,
4577f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Infinities.
4578f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    kFP64NegativeInfinity, kFP64PositiveInfinity,
4579f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Subnormal numbers.
4580f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    rawbits_to_double(0x000fffffffffffff),
4581f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    rawbits_to_double(0x0000000000000001),
4582f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    rawbits_to_double(0x000123456789abcd),
4583f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -rawbits_to_double(0x000fffffffffffff),
4584f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -rawbits_to_double(0x0000000000000001),
4585f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -rawbits_to_double(0x000123456789abcd),
4586f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // NaN.
4587f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    kFP64QuietNaN,
4588f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -kFP64QuietNaN,
4589f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  };
4590f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const int count = sizeof(inputs) / sizeof(inputs[0]);
4591f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4592f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  for (int in = 0; in < count; in++) {
4593f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    double n = inputs[in];
4594f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    for (int im = 0; im < count; im++) {
4595f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      double m = inputs[im];
4596f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      for (int ia = 0; ia < count; ia++) {
4597f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl        double a = inputs[ia];
4598f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl        double fmadd = fma(n, m, a);
4599f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl        double fmsub = fma(-n, m, a);
4600f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4601f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl        FmaddFmsubDoubleHelper(n, m, a, fmadd, fmsub);
4602f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      }
4603f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4604f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4605f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4606f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4607f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4608f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmadd_fmsub_double_rounding) {
4609f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Make sure we run plenty of tests where an intermediate rounding stage would
4610f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // produce an incorrect result.
4611f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const int limit = 1000;
4612f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  int count_fmadd = 0;
4613f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  int count_fmsub = 0;
4614f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4615f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint16_t seed[3] = {42, 43, 44};
4616f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  seed48(seed);
4617f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4618f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  while ((count_fmadd < limit) || (count_fmsub < limit)) {
4619f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    double n, m, a;
4620f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    uint32_t r[2];
4621f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    ASSERT(sizeof(r) == sizeof(n));
4622f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4623f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r[0] = mrand48();
4624f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r[1] = mrand48();
4625f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    memcpy(&n, r, sizeof(r));
4626f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r[0] = mrand48();
4627f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r[1] = mrand48();
4628f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    memcpy(&m, r, sizeof(r));
4629f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r[0] = mrand48();
4630f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r[1] = mrand48();
4631f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    memcpy(&a, r, sizeof(r));
4632f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4633f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (!isfinite(a) || !isfinite(n) || !isfinite(m)) {
4634f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      continue;
4635f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4636f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4637f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Calculate the expected results.
4638f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    double fmadd = fma(n, m, a);
4639f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    double fmsub = fma(-n, m, a);
4640f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4641f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    bool test_fmadd = (fmadd != (a + n * m));
4642f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    bool test_fmsub = (fmsub != (a - n * m));
4643f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4644f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // If rounding would produce a different result, increment the test count.
4645f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    count_fmadd += test_fmadd;
4646f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    count_fmsub += test_fmsub;
4647f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4648f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (test_fmadd || test_fmsub) {
4649f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      FmaddFmsubDoubleHelper(n, m, a, fmadd, fmsub);
4650f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4651f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4652f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4653f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4654f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4655f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void FmaddFmsubFloatHelper(float n, float m, float a,
4656f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                                  float fmadd, float fmsub) {
4657f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
4658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4660f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s0, n);
4661f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s1, m);
4662f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s2, a);
4663f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmadd(s30, s0, s1, s2);
4664f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmsub(s31, s0, s1, s2);
4665f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4666f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
4667f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
4668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4669f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(fmadd, s30);
4670f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(fmsub, s31);
4671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4676f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmadd_fmsub_float) {
4677f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  float inputs[] = {
4678f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Normal numbers, including -0.0f.
4679f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    FLT_MAX, FLT_MIN, 3.25f, 2.0f, 0.0f,
4680f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -FLT_MAX, -FLT_MIN, -3.25f, -2.0f, -0.0f,
4681f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Infinities.
4682f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    kFP32NegativeInfinity, kFP32PositiveInfinity,
4683f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Subnormal numbers.
4684f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    rawbits_to_float(0x07ffffff),
4685f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    rawbits_to_float(0x00000001),
4686f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    rawbits_to_float(0x01234567),
4687f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -rawbits_to_float(0x07ffffff),
4688f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -rawbits_to_float(0x00000001),
4689f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -rawbits_to_float(0x01234567),
4690f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // NaN.
4691f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    kFP32QuietNaN,
4692f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    -kFP32QuietNaN,
4693f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  };
4694f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const int count = sizeof(inputs) / sizeof(inputs[0]);
4695f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4696f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  for (int in = 0; in < count; in++) {
4697f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float n = inputs[in];
4698f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    for (int im = 0; im < count; im++) {
4699f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      float m = inputs[im];
4700f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      for (int ia = 0; ia < count; ia++) {
4701f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl        float a = inputs[ia];
4702f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl        float fmadd = fmaf(n, m, a);
4703f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl        float fmsub = fmaf(-n, m, a);
4704f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4705f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl        FmaddFmsubFloatHelper(n, m, a, fmadd, fmsub);
4706f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      }
4707f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4708f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4709f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4710f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4711f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4712f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmadd_fmsub_float_rounding) {
4713f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Make sure we run plenty of tests where an intermediate rounding stage would
4714f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // produce an incorrect result.
4715f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const int limit = 1000;
4716f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  int count_fmadd = 0;
4717f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  int count_fmsub = 0;
4718f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4719f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint16_t seed[3] = {42, 43, 44};
4720f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  seed48(seed);
4721f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4722f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  while ((count_fmadd < limit) || (count_fmsub < limit)) {
4723f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float n, m, a;
4724f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    uint32_t r;
4725f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    ASSERT(sizeof(r) == sizeof(n));
4726f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4727f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r = mrand48();
4728f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    memcpy(&n, &r, sizeof(r));
4729f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r = mrand48();
4730f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    memcpy(&m, &r, sizeof(r));
4731f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    r = mrand48();
4732f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    memcpy(&a, &r, sizeof(r));
4733f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4734f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (!isfinite(a) || !isfinite(n) || !isfinite(m)) {
4735f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      continue;
4736f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4737f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4738f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Calculate the expected results.
4739f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float fmadd = fmaf(n, m, a);
4740f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float fmsub = fmaf(-n, m, a);
4741f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4742f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    bool test_fmadd = (fmadd != (a + n * m));
4743f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    bool test_fmsub = (fmsub != (a - n * m));
4744f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4745f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // If rounding would produce a different result, increment the test count.
4746f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    count_fmadd += test_fmadd;
4747f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    count_fmsub += test_fmsub;
4748f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4749f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (test_fmadd || test_fmsub) {
4750f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      FmaddFmsubFloatHelper(n, m, a, fmadd, fmsub);
4751f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4752f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4753f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4754f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4755f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fdiv) {
4757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s13, -0.0);
4761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s14, kFP32PositiveInfinity);
4762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s15, kFP32NegativeInfinity);
4763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 3.25);
4764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 2.0);
4765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 2.0);
4766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -2.0);
4767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
4769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
4770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
4771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0);
4772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d30, -2.0);
4773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d31, 2.25);
4774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(s0, s16, s17);
4776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(s1, s17, s18);
4777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(s2, s13, s17);
4778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(s3, s17, s14);
4779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(s4, s17, s15);
4780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(d5, d31, d30);
4781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(d6, d29, d31);
4782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(d7, d26, d31);
4783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(d8, d31, d27);
4784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fdiv(d9, d31, d28);
4785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.625, s0);
4790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
4791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s2);
4792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s3);
4793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s4);
4794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-1.125, d5);
4795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d6);
4796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d7);
4797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d8);
4798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d9);
4799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4804f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic float MinMaxHelper(float n,
4805f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          float m,
4806f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          bool min,
4807f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          float quiet_nan_substitute = 0.0) {
4808f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const uint64_t kFP32QuietNaNMask = 0x00400000UL;
4809f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint32_t raw_n = float_to_rawbits(n);
4810f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint32_t raw_m = float_to_rawbits(m);
4811f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4812f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  if (isnan(n) && ((raw_n & kFP32QuietNaNMask) == 0)) {
4813f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // n is signalling NaN.
4814f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    return n;
4815f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else if (isnan(m) && ((raw_m & kFP32QuietNaNMask) == 0)) {
4816f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // m is signalling NaN.
4817f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    return m;
4818f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else if (quiet_nan_substitute == 0.0) {
4819f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (isnan(n)) {
4820f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // n is quiet NaN.
4821f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      return n;
4822f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    } else if (isnan(m)) {
4823f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // m is quiet NaN.
4824f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      return m;
4825f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4826f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else {
4827f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Substitute n or m if one is quiet, but not both.
4828f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (isnan(n) && !isnan(m)) {
4829f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // n is quiet NaN: replace with substitute.
4830f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      n = quiet_nan_substitute;
4831f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    } else if (!isnan(n) && isnan(m)) {
4832f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // m is quiet NaN: replace with substitute.
4833f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      m = quiet_nan_substitute;
4834f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4835f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4837f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  if ((n == 0.0) && (m == 0.0) &&
4838f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      (copysign(1.0, n) != copysign(1.0, m))) {
4839f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    return min ? -0.0 : 0.0;
4840f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4842f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  return min ? fminf(n, m) : fmaxf(n, m);
4843f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4844f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4845f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4846f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic double MinMaxHelper(double n,
4847f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           double m,
4848f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           bool min,
4849f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           double quiet_nan_substitute = 0.0) {
4850f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const uint64_t kFP64QuietNaNMask = 0x0008000000000000UL;
4851f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint64_t raw_n = double_to_rawbits(n);
4852f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint64_t raw_m = double_to_rawbits(m);
4853f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4854f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  if (isnan(n) && ((raw_n & kFP64QuietNaNMask) == 0)) {
4855f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // n is signalling NaN.
4856f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    return n;
4857f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else if (isnan(m) && ((raw_m & kFP64QuietNaNMask) == 0)) {
4858f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // m is signalling NaN.
4859f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    return m;
4860f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else if (quiet_nan_substitute == 0.0) {
4861f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (isnan(n)) {
4862f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // n is quiet NaN.
4863f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      return n;
4864f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    } else if (isnan(m)) {
4865f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // m is quiet NaN.
4866f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      return m;
4867f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4868f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else {
4869f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Substitute n or m if one is quiet, but not both.
4870f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (isnan(n) && !isnan(m)) {
4871f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // n is quiet NaN: replace with substitute.
4872f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      n = quiet_nan_substitute;
4873f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    } else if (!isnan(n) && isnan(m)) {
4874f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // m is quiet NaN: replace with substitute.
4875f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      m = quiet_nan_substitute;
4876f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4877f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4879f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  if ((n == 0.0) && (m == 0.0) &&
4880f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      (copysign(1.0, n) != copysign(1.0, m))) {
4881f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    return min ? -0.0 : 0.0;
4882f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4884f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  return min ? fmin(n, m) : fmax(n, m);
4885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4888f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void FminFmaxDoubleHelper(double n, double m, double min, double max,
4889f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                                 double minnm, double maxnm) {
4890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4893f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d0, n);
4894f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d1, m);
4895f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmin(d28, d0, d1);
4896f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmax(d29, d0, d1);
4897f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fminnm(d30, d0, d1);
4898f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmaxnm(d31, d0, d1);
4899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4903f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(min, d28);
4904f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(max, d29);
4905f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(minnm, d30);
4906f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(maxnm, d31);
4907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4908f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
4909f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4912f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmax_fmin_d) {
4913f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Bootstrap tests.
4914f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(0, 0, 0, 0, 0, 0);
4915f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(0, 1, 0, 1, 0, 1);
4916f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(kFP64PositiveInfinity, kFP64NegativeInfinity,
4917f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64NegativeInfinity, kFP64PositiveInfinity,
4918f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64NegativeInfinity, kFP64PositiveInfinity);
4919f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(kFP64SignallingNaN, 0,
4920f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64SignallingNaN, kFP64SignallingNaN,
4921f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64SignallingNaN, kFP64SignallingNaN);
4922f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(kFP64QuietNaN, 0,
4923f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64QuietNaN, kFP64QuietNaN,
4924f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       0, 0);
4925f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(kFP64QuietNaN, kFP64SignallingNaN,
4926f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64SignallingNaN, kFP64SignallingNaN,
4927f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64SignallingNaN, kFP64SignallingNaN);
4928f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4929f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Iterate over all combinations of inputs.
4930f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  double inputs[] = { DBL_MAX, DBL_MIN, 1.0, 0.0,
4931f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      -DBL_MAX, -DBL_MIN, -1.0, -0.0,
4932f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP64PositiveInfinity, kFP64NegativeInfinity,
4933f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP64QuietNaN, kFP64SignallingNaN };
4934f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4935f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const int count = sizeof(inputs) / sizeof(inputs[0]);
4936f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4937f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  for (int in = 0; in < count; in++) {
4938f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    double n = inputs[in];
4939f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    for (int im = 0; im < count; im++) {
4940f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      double m = inputs[im];
4941f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      FminFmaxDoubleHelper(n, m,
4942f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           MinMaxHelper(n, m, true),
4943f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           MinMaxHelper(n, m, false),
4944f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           MinMaxHelper(n, m, true, kFP64PositiveInfinity),
4945f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           MinMaxHelper(n, m, false, kFP64NegativeInfinity));
4946f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
4947f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
4948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4951f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void FminFmaxFloatHelper(float n, float m, float min, float max,
4952f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                                float minnm, float maxnm) {
4953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4956f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // TODO: Signalling NaNs are sometimes converted by the C compiler to quiet
4957f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // NaNs on implicit casts from float to double. Here, we move the raw bits
4958f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // into a W register first, so we get the correct value. Fix Fmov so this
4959f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // additional step is no longer needed.
4960f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w0, float_to_rawbits(n));
4961f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s0, w0);
4962f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w0, float_to_rawbits(m));
4963f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s1, w0);
4964f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmin(s28, s0, s1);
4965f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmax(s29, s0, s1);
4966f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fminnm(s30, s0, s1);
4967f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmaxnm(s31, s0, s1);
4968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4972f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(min, s28);
4973f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(max, s29);
4974f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(minnm, s30);
4975f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(maxnm, s31);
4976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4981f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmax_fmin_s) {
4982f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Bootstrap tests.
4983f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(0, 0, 0, 0, 0, 0);
4984f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(0, 1, 0, 1, 0, 1);
4985f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(kFP32PositiveInfinity, kFP32NegativeInfinity,
4986f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32NegativeInfinity, kFP32PositiveInfinity,
4987f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32NegativeInfinity, kFP32PositiveInfinity);
4988f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(kFP32SignallingNaN, 0,
4989f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32SignallingNaN, kFP32SignallingNaN,
4990f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32SignallingNaN, kFP32SignallingNaN);
4991f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(kFP32QuietNaN, 0,
4992f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32QuietNaN, kFP32QuietNaN,
4993f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      0, 0);
4994f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(kFP32QuietNaN, kFP32SignallingNaN,
4995f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32SignallingNaN, kFP32SignallingNaN,
4996f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32SignallingNaN, kFP32SignallingNaN);
4997f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4998f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Iterate over all combinations of inputs.
4999f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  float inputs[] = { FLT_MAX, FLT_MIN, 1.0, 0.0,
5000f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                     -FLT_MAX, -FLT_MIN, -1.0, -0.0,
5001f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                     kFP32PositiveInfinity, kFP32NegativeInfinity,
5002f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                     kFP32QuietNaN, kFP32SignallingNaN };
5003f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5004f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const int count = sizeof(inputs) / sizeof(inputs[0]);
5005f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5006f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  for (int in = 0; in < count; in++) {
5007f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float n = inputs[in];
5008f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    for (int im = 0; im < count; im++) {
5009f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      float m = inputs[im];
5010f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      FminFmaxFloatHelper(n, m,
5011f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          MinMaxHelper(n, m, true),
5012f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          MinMaxHelper(n, m, false),
5013f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          MinMaxHelper(n, m, true, kFP32PositiveInfinity),
5014f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          MinMaxHelper(n, m, false, kFP32NegativeInfinity));
5015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
5016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
5017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fccmp) {
5021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 0.0);
5025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 0.5);
5026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d18, -0.5);
5027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, -1.0);
5028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 0);
5029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5030578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(s16, s16, NoFlag, eq);
5032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
5033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5034578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(s16, s16, VFlag, ne);
5036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
5037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5038578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(s16, s17, CFlag, ge);
5040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
5041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5042578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(s16, s17, CVFlag, lt);
5044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
5045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5046578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(d18, d18, ZFlag, le);
5048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
5049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5050578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(d18, d18, ZVFlag, gt);
5052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
5053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5054578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(d18, d19, ZCVFlag, ls);
5056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x6, NZCV);
5057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5058578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(d18, d19, NFlag, hi);
5060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x7, NZCV);
5061578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5062578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ fccmp(s16, s16, NFlag, al);
5063578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x8, NZCV);
5064578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5065578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ fccmp(d18, d18, NFlag, nv);
5066578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x9, NZCV);
5067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
5072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(VFlag, w1);
5073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w2);
5074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w3);
5075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
5076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZVFlag, w5);
5077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CFlag, w6);
5078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w7);
5079578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(ZCFlag, w8);
5080578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(ZCFlag, w9);
5081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcmp) {
5087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5090f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5091f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Some of these tests require a floating-point scratch register assigned to
5092f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // the macro assembler, but most do not.
5093f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ SetFPScratchRegister(NoFPReg);
5094f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s8, 0.0);
5096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s9, 0.5);
5097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w18, 0x7f800001);  // Single precision NaN.
5098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, w18);
5099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(s8, s8);
5101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
5102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(s8, s9);
5103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
5104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(s9, s8);
5105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
5106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(s8, s18);
5107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
5108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(s18, s18);
5109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
5110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(s8, 0.0);
5111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
5112f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ SetFPScratchRegister(d0);
5113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(s8, 255.0);
5114f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ SetFPScratchRegister(NoFPReg);
5115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x6, NZCV);
5116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 0.0);
5118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, 0.5);
5119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 0x7ff0000000000001UL);  // Double precision NaN.
5120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, x21);
5121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(d19, d19);
5123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x10, NZCV);
5124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(d19, d20);
5125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x11, NZCV);
5126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(d20, d19);
5127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x12, NZCV);
5128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(d19, d21);
5129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x13, NZCV);
5130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(d21, d21);
5131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x14, NZCV);
5132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(d19, 0.0);
5133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x15, NZCV);
5134f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ SetFPScratchRegister(d0);
5135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcmp(d19, 12.3456);
5136f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ SetFPScratchRegister(NoFPReg);
5137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x16, NZCV);
5138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
5143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w1);
5144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CFlag, w2);
5145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w3);
5146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w4);
5147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
5148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w6);
5149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w10);
5150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w11);
5151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CFlag, w12);
5152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w13);
5153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w14);
5154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w15);
5155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w16);
5156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcsel) {
5162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
5166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 2.0);
5168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d18, 3.0);
5169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 4.0);
5170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5171578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x16, 0);
5172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcsel(s0, s16, s17, eq);
5173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcsel(s1, s16, s17, ne);
5174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcsel(d2, d18, d19, eq);
5175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcsel(d3, d18, d19, ne);
5176578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ fcsel(s4, s16, s17, al);
5177578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ fcsel(d5, d18, d19, nv);
5178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s1);
5184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(3.0, d2);
5185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(4.0, d3);
5186578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP32(1.0, s4);
5187578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(3.0, d5);
5188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fneg) {
5194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 0.0);
5199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, kFP32PositiveInfinity);
5200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 1.0);
5201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, 0.0);
5202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, kFP64PositiveInfinity);
5203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s0, s16);
5205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s1, s0);
5206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s2, s17);
5207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s3, s2);
5208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s4, s18);
5209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s5, s4);
5210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d6, d19);
5211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d7, d6);
5212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d8, d20);
5213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d9, d8);
5214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d10, d21);
5215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d11, d10);
5216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-1.0, s0);
5221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s2);
5223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s3);
5224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s4);
5225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
5226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-1.0, d6);
5227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d7);
5228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d8);
5229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d9);
5230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d10);
5231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d11);
5232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fabs) {
5238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, -1.0);
5242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, -0.0);
5243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, kFP32NegativeInfinity);
5244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, -1.0);
5245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, -0.0);
5246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, kFP64NegativeInfinity);
5247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(s0, s16);
5249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(s1, s0);
5250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(s2, s17);
5251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(s3, s18);
5252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(d4, d19);
5253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(d5, d4);
5254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(d6, d20);
5255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(d7, d21);
5256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s2);
5263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s3);
5264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d4);
5265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d5);
5266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d6);
5267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d7);
5268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fsqrt) {
5274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 0.0);
5278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.0);
5279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 0.25);
5280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, 65536.0);
5281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, -0.0);
5282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32PositiveInfinity);
5283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d22, 0.0);
5284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d23, 1.0);
5285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 0.25);
5286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 4294967296.0);
5287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
5288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
5289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s0, s16);
5291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s1, s17);
5292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s2, s18);
5293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s3, s19);
5294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s4, s20);
5295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s5, s21);
5296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d6, d22);
5297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d7, d23);
5298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d8, d24);
5299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d9, d25);
5300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d10, d26);
5301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d11, d27);
5302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s0);
5307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.5, s2);
5309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(256.0, s3);
5310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s4);
5311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
5312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d6);
5313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d7);
5314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.5, d8);
5315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(65536.0, d9);
5316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d10);
5317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP32PositiveInfinity, d11);
5318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5323f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(frinta) {
5324f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
5325f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5326f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
5327f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s16, 1.0);
5328f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s17, 1.1);
5329f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s18, 1.5);
5330f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s19, 1.9);
5331f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s20, 2.5);
5332f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s21, -1.5);
5333f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s22, -2.5);
5334f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5335f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5336f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s25, 0.0);
5337f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s26, -0.0);
5338f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5339f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s0, s16);
5340f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s1, s17);
5341f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s2, s18);
5342f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s3, s19);
5343f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s4, s20);
5344f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s5, s21);
5345f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s6, s22);
5346f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s7, s23);
5347f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s8, s24);
5348f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s9, s25);
5349f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s10, s26);
5350f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5351f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d16, 1.0);
5352f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d17, 1.1);
5353f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d18, 1.5);
5354f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d19, 1.9);
5355f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d20, 2.5);
5356f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d21, -1.5);
5357f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d22, -2.5);
5358f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
5359f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
5360f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d25, 0.0);
5361f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d26, -0.0);
5362f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5363f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d11, d16);
5364f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d12, d17);
5365f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d13, d18);
5366f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d14, d19);
5367f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d15, d20);
5368f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d16, d21);
5369f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d17, d22);
5370f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d18, d23);
5371f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d19, d24);
5372f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d20, d25);
5373f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(d21, d26);
5374f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
5375f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5376f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
5377f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5378f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5379f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5380f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
5381f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
5382f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(3.0, s4);
5383f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
5384f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(-3.0, s6);
5385f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
5386f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
5387f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
5388f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
5389f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(1.0, d11);
5390f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
5391f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(2.0, d13);
5392f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
5393f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(3.0, d15);
5394f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(-2.0, d16);
5395f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(-3.0, d17);
5396f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d18);
5397f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d19);
5398f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(0.0, d20);
5399f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(-0.0, d21);
5400f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5401f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
5402f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
5403f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5404f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(frintn) {
5406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
5411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
5412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, 1.9);
5413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, 2.5);
5414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, -1.5);
5415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, -2.5);
5416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s25, 0.0);
5419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s26, -0.0);
5420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s0, s16);
5422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s1, s17);
5423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s2, s18);
5424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s3, s19);
5425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s4, s20);
5426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s5, s21);
5427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s6, s22);
5428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s7, s23);
5429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s8, s24);
5430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s9, s25);
5431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s10, s26);
5432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d16, 1.0);
5434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d17, 1.1);
5435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d18, 1.5);
5436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 1.9);
5437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, 2.5);
5438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, -1.5);
5439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d22, -2.5);
5440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
5441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
5442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 0.0);
5443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
5444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d11, d16);
5446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d12, d17);
5447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d13, d18);
5448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d14, d19);
5449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d15, d20);
5450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d16, d21);
5451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d17, d22);
5452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d18, d23);
5453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d19, d24);
5454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d20, d25);
5455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(d21, d26);
5456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
5463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
5464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
5465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
5466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
5467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
5468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
5469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
5470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
5471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d11);
5472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
5473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d13);
5474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
5475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
5476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.0, d16);
5477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
5478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d18);
5479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d19);
5480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d20);
5481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d21);
5482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(frintz) {
5488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
5493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
5494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, 1.9);
5495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, 2.5);
5496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, -1.5);
5497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, -2.5);
5498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s25, 0.0);
5501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s26, -0.0);
5502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s0, s16);
5504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s1, s17);
5505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s2, s18);
5506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s3, s19);
5507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s4, s20);
5508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s5, s21);
5509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s6, s22);
5510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s7, s23);
5511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s8, s24);
5512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s9, s25);
5513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s10, s26);
5514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d16, 1.0);
5516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d17, 1.1);
5517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d18, 1.5);
5518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 1.9);
5519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, 2.5);
5520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, -1.5);
5521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d22, -2.5);
5522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
5523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
5524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 0.0);
5525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
5526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d11, d16);
5528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d12, d17);
5529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d13, d18);
5530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d14, d19);
5531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d15, d20);
5532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d16, d21);
5533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d17, d22);
5534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d18, d23);
5535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d19, d24);
5536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d20, d25);
5537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d21, d26);
5538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s2);
5545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s3);
5546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
5547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-1.0, s5);
5548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
5549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
5550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
5551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
5552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
5553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d11);
5554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
5555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
5556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d14);
5557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
5558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-1.0, d16);
5559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
5560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d18);
5561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d19);
5562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d20);
5563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d21);
5564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5569578645f14e122d2b87d907e298cda7e7d0babf1farmvixlTEST(fcvt_ds) {
5570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
5575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
5576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, 1.9);
5577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, 2.5);
5578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, -1.5);
5579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, -2.5);
5580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s25, 0.0);
5583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s26, -0.0);
5584578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fmov(s27, FLT_MAX);
5585578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fmov(s28, FLT_MIN);
5586578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fmov(s29, rawbits_to_float(0x7fc12345));   // Quiet NaN.
5587578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fmov(s30, rawbits_to_float(0x7f812345));   // Signalling NaN.
5588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d0, s16);
5590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d1, s17);
5591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d2, s18);
5592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d3, s19);
5593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d4, s20);
5594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d5, s21);
5595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d6, s22);
5596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d7, s23);
5597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d8, s24);
5598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d9, s25);
5599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d10, s26);
5600578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fcvt(d11, s27);
5601578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fcvt(d12, s28);
5602578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fcvt(d13, s29);
5603578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fcvt(d14, s30);
5604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0f, d0);
5609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.1f, d1);
5610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.5f, d2);
5611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.9f, d3);
5612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.5f, d4);
5613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-1.5f, d5);
5614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.5f, d6);
5615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d7);
5616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d8);
5617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0f, d9);
5618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0f, d10);
5619578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(FLT_MAX, d11);
5620578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(FLT_MIN, d12);
5621578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5622578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check that the NaN payload is preserved according to A64 conversion rules:
5623578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  - The sign bit is preserved.
5624578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  - The top bit of the mantissa is forced to 1 (making it a quiet NaN).
5625578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  - The remaining mantissa bits are copied until they run out.
5626578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  - The low-order bits that haven't already been assigned are set to 0.
5627578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d13);
5628578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d14);
5629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5634578645f14e122d2b87d907e298cda7e7d0babf1farmvixlTEST(fcvt_sd) {
5635578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // There are a huge number of corner-cases to check, so this test iterates
5636578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // through a list. The list is then negated and checked again (since the sign
5637578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // is irrelevant in ties-to-even rounding), so the list shouldn't include any
5638578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // negative values.
5639578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //
5640578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Note that this test only checks ties-to-even rounding, because that is all
5641578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // that the simulator supports.
5642578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  struct {double in; float expected;} test[] = {
5643578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    // Check some simple conversions.
5644578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {0.0, 0.0f},
5645578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {1.0, 1.0f},
5646578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {1.5, 1.5f},
5647578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {2.0, 2.0f},
5648578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {FLT_MAX, FLT_MAX},
5649578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - The smallest normalized float.
5650f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    {pow(2, -126), powf(2, -126)},
5651578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - Normal floats that need (ties-to-even) rounding.
5652578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //    For normalized numbers:
5653578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //         bit 29 (0x0000000020000000) is the lowest-order bit which will
5654578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //                                     fit in the float's mantissa.
5655578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000000000000), rawbits_to_float(0x3f800000)},
5656578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000000000001), rawbits_to_float(0x3f800000)},
5657578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000010000000), rawbits_to_float(0x3f800000)},
5658578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000010000001), rawbits_to_float(0x3f800001)},
5659578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000020000000), rawbits_to_float(0x3f800001)},
5660578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000020000001), rawbits_to_float(0x3f800001)},
5661578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000030000000), rawbits_to_float(0x3f800002)},
5662578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000030000001), rawbits_to_float(0x3f800002)},
5663578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000040000000), rawbits_to_float(0x3f800002)},
5664578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000040000001), rawbits_to_float(0x3f800002)},
5665578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000050000000), rawbits_to_float(0x3f800002)},
5666578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000050000001), rawbits_to_float(0x3f800003)},
5667578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3ff0000060000000), rawbits_to_float(0x3f800003)},
5668578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - A mantissa that overflows into the exponent during rounding.
5669578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3feffffff0000000), rawbits_to_float(0x3f800000)},
5670578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - The largest double that rounds to a normal float.
5671578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x47efffffefffffff), rawbits_to_float(0x7f7fffff)},
5672578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5673578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    // Doubles that are too big for a float.
5674578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {kFP64PositiveInfinity, kFP32PositiveInfinity},
5675578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {DBL_MAX, kFP32PositiveInfinity},
5676578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - The smallest exponent that's too big for a float.
5677578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {pow(2, 128), kFP32PositiveInfinity},
5678578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - This exponent is in range, but the value rounds to infinity.
5679578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x47effffff0000000), kFP32PositiveInfinity},
5680578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5681578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    // Doubles that are too small for a float.
5682578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - The smallest (subnormal) double.
5683578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {DBL_MIN, 0.0},
5684578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - The largest double which is too small for a subnormal float.
5685578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3690000000000000), rawbits_to_float(0x00000000)},
5686578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5687578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    // Normal doubles that become subnormal floats.
5688578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - The largest subnormal float.
5689578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x380fffffc0000000), rawbits_to_float(0x007fffff)},
5690578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - The smallest subnormal float.
5691578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x36a0000000000000), rawbits_to_float(0x00000001)},
5692578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - Subnormal floats that need (ties-to-even) rounding.
5693578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //    For these subnormals:
5694578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //         bit 34 (0x0000000400000000) is the lowest-order bit which will
5695578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //                                     fit in the float's mantissa.
5696578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e000000000), rawbits_to_float(0x00045678)},
5697578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e000000001), rawbits_to_float(0x00045678)},
5698578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e200000000), rawbits_to_float(0x00045678)},
5699578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e200000001), rawbits_to_float(0x00045679)},
5700578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e400000000), rawbits_to_float(0x00045679)},
5701578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e400000001), rawbits_to_float(0x00045679)},
5702578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e600000000), rawbits_to_float(0x0004567a)},
5703578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e600000001), rawbits_to_float(0x0004567a)},
5704578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e800000000), rawbits_to_float(0x0004567a)},
5705578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159e800000001), rawbits_to_float(0x0004567a)},
5706578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159ea00000000), rawbits_to_float(0x0004567a)},
5707578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159ea00000001), rawbits_to_float(0x0004567b)},
5708578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x37c159ec00000000), rawbits_to_float(0x0004567b)},
5709578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - The smallest double which rounds up to become a subnormal float.
5710578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x3690000000000001), rawbits_to_float(0x00000001)},
5711578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5712578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    // Check NaN payload preservation.
5713578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x7ff82468a0000000), rawbits_to_float(0x7fc12345)},
5714578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x7ff82468bfffffff), rawbits_to_float(0x7fc12345)},
5715578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    //  - Signalling NaNs become quiet NaNs.
5716578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x7ff02468a0000000), rawbits_to_float(0x7fc12345)},
5717578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x7ff02468bfffffff), rawbits_to_float(0x7fc12345)},
5718578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    {rawbits_to_double(0x7ff000001fffffff), rawbits_to_float(0x7fc00000)},
5719578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  };
5720578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int count = sizeof(test) / sizeof(test[0]);
5721578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5722578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int i = 0; i < count; i++) {
5723578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double in = test[i].in;
5724578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    float expected = test[i].expected;
5725578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5726578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    // We only expect positive input.
5727578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT(signbit(in) == 0);
5728578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT(signbit(expected) == 0);
5729578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5730578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    SETUP();
5731578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    START();
5732578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5733578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Fmov(d10, in);
5734578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Fcvt(s20, d10);
5735578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5736578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Fmov(d11, -in);
5737578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Fcvt(s21, d11);
5738578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5739578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    END();
5740578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    RUN();
5741578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected, s20);
5742578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(-expected, s21);
5743578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    TEARDOWN();
5744578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
5745578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
5746578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5747578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5748f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fcvtas) {
5749f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
5750f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5751f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
5752f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s0, 1.0);
5753f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s1, 1.1);
5754f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s2, 2.5);
5755f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s3, -2.5);
5756f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
5757f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
5758f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s6, 0x7fffff80);  // Largest float < INT32_MAX.
5759f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fneg(s7, s6);          // Smallest float > INT32_MIN.
5760f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d8, 1.0);
5761f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d9, 1.1);
5762f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d10, 2.5);
5763f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d11, -2.5);
5764f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
5765f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
5766f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d14, kWMaxInt - 1);
5767f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d15, kWMinInt + 1);
5768f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s17, 1.1);
5769f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s18, 2.5);
5770f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s19, -2.5);
5771f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
5772f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
5773f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s22, 0x7fffff8000000000UL);   // Largest float < INT64_MAX.
5774f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fneg(s23, s22);                    // Smallest float > INT64_MIN.
5775f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d24, 1.1);
5776f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d25, 2.5);
5777f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d26, -2.5);
5778f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
5779f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
5780f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d29, 0x7ffffffffffffc00UL);   // Largest double < INT64_MAX.
5781f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fneg(d30, d29);                    // Smallest double > INT64_MIN.
5782f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5783f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w0, s0);
5784f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w1, s1);
5785f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w2, s2);
5786f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w3, s3);
5787f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w4, s4);
5788f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w5, s5);
5789f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w6, s6);
5790f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w7, s7);
5791f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w8, d8);
5792f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w9, d9);
5793f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w10, d10);
5794f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w11, d11);
5795f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w12, d12);
5796f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w13, d13);
5797f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w14, d14);
5798f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w15, d15);
5799f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x17, s17);
5800f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x18, s18);
5801f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x19, s19);
5802f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x20, s20);
5803f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x21, s21);
5804f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x22, s22);
5805f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x23, s23);
5806f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x24, d24);
5807f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x25, d25);
5808f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x26, d26);
5809f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x27, d27);
5810f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x28, d28);
5811f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x29, d29);
5812f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x30, d30);
5813f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
5814f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5815f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
5816f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5817f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x0);
5818f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x1);
5819f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x2);
5820f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffd, x3);
5821f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
5822f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
5823f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
5824f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
5825f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x8);
5826f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x9);
5827f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x10);
5828f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffd, x11);
5829f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
5830f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
5831f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
5832f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
5833f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x17);
5834f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x18);
5835f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffdUL, x19);
5836f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x20);
5837f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x21);
5838f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000UL, x22);
5839f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000008000000000UL, x23);
5840f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x24);
5841f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x25);
5842f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffdUL, x26);
5843f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x27);
5844f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x28);
5845f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00UL, x29);
5846f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x8000000000000400UL, x30);
5847f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5848f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
5849f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
5850f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5851f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5852f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fcvtau) {
5853f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
5854f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5855f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
5856f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s0, 1.0);
5857f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s1, 1.1);
5858f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s2, 2.5);
5859f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s3, -2.5);
5860f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
5861f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
5862f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s6, 0xffffff00);  // Largest float < UINT32_MAX.
5863f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d8, 1.0);
5864f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d9, 1.1);
5865f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d10, 2.5);
5866f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d11, -2.5);
5867f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
5868f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
5869f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d14, 0xfffffffe);
5870f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s16, 1.0);
5871f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s17, 1.1);
5872f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s18, 2.5);
5873f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s19, -2.5);
5874f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
5875f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
5876f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s22, 0xffffff0000000000UL);  // Largest float < UINT64_MAX.
5877f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d24, 1.1);
5878f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d25, 2.5);
5879f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d26, -2.5);
5880f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
5881f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
5882f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d29, 0xfffffffffffff800UL);  // Largest double < UINT64_MAX.
5883f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s30, 0x100000000UL);
5884f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5885f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w0, s0);
5886f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w1, s1);
5887f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w2, s2);
5888f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w3, s3);
5889f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w4, s4);
5890f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w5, s5);
5891f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w6, s6);
5892f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w8, d8);
5893f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w9, d9);
5894f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w10, d10);
5895f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w11, d11);
5896f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w12, d12);
5897f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w13, d13);
5898f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w14, d14);
5899f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w15, d15);
5900f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x16, s16);
5901f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x17, s17);
5902f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x18, s18);
5903f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x19, s19);
5904f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x20, s20);
5905f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x21, s21);
5906f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x22, s22);
5907f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x24, d24);
5908f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x25, d25);
5909f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x26, d26);
5910f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x27, d27);
5911f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x28, d28);
5912f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x29, d29);
5913f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w30, s30);
5914f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
5915f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5916f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
5917f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5918f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x0);
5919f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x1);
5920f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x2);
5921f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x3);
5922f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
5923f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x5);
5924f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffff00, x6);
5925f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x8);
5926f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x9);
5927f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x10);
5928f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x11);
5929f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
5930f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x13);
5931f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffe, x14);
5932f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x16);
5933f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x17);
5934f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x18);
5935f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x19);
5936f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x20);
5937f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x21);
5938f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffff0000000000UL, x22);
5939f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x24);
5940f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x25);
5941f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x26);
5942f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x27);
5943f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x28);
5944f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffffffff800UL, x29);
5945f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff, x30);
5946f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5947f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
5948f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
5949f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5950f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtms) {
5952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
5956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
5957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
5958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
5959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
5960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
5961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, 0x7fffff80);  // Largest float < INT32_MAX.
5962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s7, s6);          // Smallest float > INT32_MIN.
5963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
5964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
5965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
5966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
5967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
5968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
5969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
5970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
5971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
5972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
5973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
5974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
5975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
5976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, 0x7fffff8000000000UL);  // Largest float < INT64_MAX.
5977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s23, s22);                    // Smallest float > INT64_MIN.
5978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
5979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
5980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
5981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
5982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
5983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0x7ffffffffffffc00UL);  // Largest double < INT64_MAX.
5984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d30, d29);                    // Smallest double > INT64_MIN.
5985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w0, s0);
5987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w1, s1);
5988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w2, s2);
5989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w3, s3);
5990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w4, s4);
5991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w5, s5);
5992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w6, s6);
5993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w7, s7);
5994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w8, d8);
5995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w9, d9);
5996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w10, d10);
5997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w11, d11);
5998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w12, d12);
5999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w13, d13);
6000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w14, d14);
6001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w15, d15);
6002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x17, s17);
6003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x18, s18);
6004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x19, s19);
6005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x20, s20);
6006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x21, s21);
6007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x22, s22);
6008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x23, s23);
6009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x24, d24);
6010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x25, d25);
6011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x26, d26);
6012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x27, d27);
6013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x28, d28);
6014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x29, d29);
6015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x30, d30);
6016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
6023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x3);
6024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
6025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
6026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
6028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
6031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
6032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
6033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
6034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
6036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x18);
6038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffeUL, x19);
6039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x20);
6040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x21);
6041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000UL, x22);
6042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000008000000000UL, x23);
6043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x25);
6045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffeUL, x26);
6046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x27);
6047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x28);
6048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00UL, x29);
6049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000400UL, x30);
6050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtmu) {
6056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
6065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, 0x7fffff80);  // Largest float < INT32_MAX.
6066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s7, s6);          // Smallest float > INT32_MIN.
6067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
6080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, 0x7fffff8000000000UL);  // Largest float < INT64_MAX.
6081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s23, s22);                    // Smallest float > INT64_MIN.
6082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
6087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0x7ffffffffffffc00UL);  // Largest double < INT64_MAX.
6088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d30, d29);                    // Smallest double > INT64_MIN.
6089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w0, s0);
6091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w1, s1);
6092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w2, s2);
6093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w3, s3);
6094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w4, s4);
6095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w5, s5);
6096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w6, s6);
6097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w7, s7);
6098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w8, d8);
6099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w9, d9);
6100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w10, d10);
6101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w11, d11);
6102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w12, d12);
6103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w13, d13);
6104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w14, d14);
6105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x17, s17);
6106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x18, s18);
6107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x19, s19);
6108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x20, s20);
6109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x21, s21);
6110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x22, s22);
6111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x23, s23);
6112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x24, d24);
6113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x25, d25);
6114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x26, d26);
6115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x27, d27);
6116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x28, d28);
6117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x29, d29);
6118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x30, d30);
6119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
6126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
6127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
6128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
6129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x7);
6131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
6134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
6135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
6136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x13);
6137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x18);
6140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x19);
6141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x20);
6142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x21);
6143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000UL, x22);
6144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x23);
6145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x25);
6147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x26);
6148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x27);
6149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x28);
6150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00UL, x29);
6151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x30);
6152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtns) {
6158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
6167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, 0x7fffff80);  // Largest float < INT32_MAX.
6168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s7, s6);          // Smallest float > INT32_MIN.
6169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
6182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, 0x7fffff8000000000UL);   // Largest float < INT64_MAX.
6183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s23, s22);                    // Smallest float > INT64_MIN.
6184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
6189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0x7ffffffffffffc00UL);   // Largest double < INT64_MAX.
6190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d30, d29);                    // Smallest double > INT64_MIN.
6191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w0, s0);
6193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w1, s1);
6194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w2, s2);
6195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w3, s3);
6196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w4, s4);
6197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w5, s5);
6198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w6, s6);
6199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w7, s7);
6200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w8, d8);
6201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w9, d9);
6202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w10, d10);
6203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w11, d11);
6204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w12, d12);
6205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w13, d13);
6206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w14, d14);
6207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w15, d15);
6208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x17, s17);
6209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x18, s18);
6210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x19, s19);
6211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x20, s20);
6212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x21, s21);
6213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x22, s22);
6214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x23, s23);
6215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x24, d24);
6216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x25, d25);
6217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x26, d26);
6218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x27, d27);
6219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x28, d28);
6220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x29, d29);
6221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x30, d30);
6222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x2);
6229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x3);
6230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
6231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
6232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
6234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x10);
6237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
6238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
6239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
6240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
6242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x18);
6244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffeUL, x19);
6245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x20);
6246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x21);
6247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000UL, x22);
6248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000008000000000UL, x23);
6249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x25);
6251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffeUL, x26);
6252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x27);
6253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x28);
6254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00UL, x29);
6255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000400UL, x30);
6256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtnu) {
6262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
6271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, 0xffffff00);  // Largest float < UINT32_MAX.
6272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, 0xfffffffe);
6279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
6280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
6285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, 0xffffff0000000000UL);  // Largest float < UINT64_MAX.
6286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
6291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0xfffffffffffff800UL);  // Largest double < UINT64_MAX.
6292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s30, 0x100000000UL);
6293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w0, s0);
6295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w1, s1);
6296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w2, s2);
6297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w3, s3);
6298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w4, s4);
6299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w5, s5);
6300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w6, s6);
6301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w8, d8);
6302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w9, d9);
6303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w10, d10);
6304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w11, d11);
6305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w12, d12);
6306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w13, d13);
6307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w14, d14);
6308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w15, d15);
6309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x16, s16);
6310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x17, s17);
6311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x18, s18);
6312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x19, s19);
6313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x20, s20);
6314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x21, s21);
6315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x22, s22);
6316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x24, d24);
6317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x25, d25);
6318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x26, d26);
6319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x27, d27);
6320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x28, d28);
6321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x29, d29);
6322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w30, s30);
6323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x2);
6330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
6331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
6332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
6333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff00, x6);
6334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x10);
6337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
6338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
6339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x13);
6340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x14);
6341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x16);
6342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x18);
6344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x19);
6345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x20);
6346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x21);
6347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff0000000000UL, x22);
6348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x25);
6350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x26);
6351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x27);
6352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x28);
6353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffffffff800UL, x29);
6354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x30);
6355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtzs) {
6361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
6370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, 0x7fffff80);  // Largest float < INT32_MAX.
6371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s7, s6);          // Smallest float > INT32_MIN.
6372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
6385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, 0x7fffff8000000000UL);   // Largest float < INT64_MAX.
6386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s23, s22);                    // Smallest float > INT64_MIN.
6387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
6392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0x7ffffffffffffc00UL);   // Largest double < INT64_MAX.
6393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d30, d29);                    // Smallest double > INT64_MIN.
6394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w0, s0);
6396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w1, s1);
6397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w2, s2);
6398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w3, s3);
6399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w4, s4);
6400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w5, s5);
6401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w6, s6);
6402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w7, s7);
6403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w8, d8);
6404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w9, d9);
6405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w10, d10);
6406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w11, d11);
6407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w12, d12);
6408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w13, d13);
6409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w14, d14);
6410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w15, d15);
6411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x17, s17);
6412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x18, s18);
6413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x19, s19);
6414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x20, s20);
6415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x21, s21);
6416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x22, s22);
6417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x23, s23);
6418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x24, d24);
6419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x25, d25);
6420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x26, d26);
6421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x27, d27);
6422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x28, d28);
6423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x29, d29);
6424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x30, d30);
6425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
6432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
6433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
6434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
6435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
6437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
6440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x11);
6441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
6442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
6443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
6445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x18);
6447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x19);
6448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x20);
6449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x21);
6450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000UL, x22);
6451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000008000000000UL, x23);
6452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x25);
6454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x26);
6455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffffUL, x27);
6456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000000UL, x28);
6457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00UL, x29);
6458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8000000000000400UL, x30);
6459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtzu) {
6464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
6473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, 0x7fffff80);  // Largest float < INT32_MAX.
6474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s7, s6);          // Smallest float > INT32_MIN.
6475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
6488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, 0x7fffff8000000000UL);  // Largest float < INT64_MAX.
6489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s23, s22);                    // Smallest float > INT64_MIN.
6490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
6495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d29, 0x7ffffffffffffc00UL);  // Largest double < INT64_MAX.
6496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d30, d29);                    // Smallest double > INT64_MIN.
6497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w0, s0);
6499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w1, s1);
6500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w2, s2);
6501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w3, s3);
6502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w4, s4);
6503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w5, s5);
6504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w6, s6);
6505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w7, s7);
6506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w8, d8);
6507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w9, d9);
6508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w10, d10);
6509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w11, d11);
6510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w12, d12);
6511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w13, d13);
6512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w14, d14);
6513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x17, s17);
6514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x18, s18);
6515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x19, s19);
6516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x20, s20);
6517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x21, s21);
6518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x22, s22);
6519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x23, s23);
6520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x24, d24);
6521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x25, d25);
6522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x26, d26);
6523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x27, d27);
6524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x28, d28);
6525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x29, d29);
6526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x30, d30);
6527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
6534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
6535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
6536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
6537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x7);
6539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
6542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
6543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
6544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x13);
6545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x18);
6548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x19);
6549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x20);
6550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x21);
6551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000UL, x22);
6552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x23);
6553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x25);
6555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x26);
6556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffffUL, x27);
6557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x28);
6558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00UL, x29);
6559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0UL, x30);
6560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6565578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// Test that scvtf and ucvtf can convert the 64-bit input into the expected
6566578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// value. All possible values of 'fbits' are tested. The expected value is
6567578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// modified accordingly in each case.
6568578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//
6569578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// The expected value is specified as the bit encoding of the expected double
6570578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// produced by scvtf (expected_scvtf_bits) as well as ucvtf
6571578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// (expected_ucvtf_bits).
6572578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//
6573578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// Where the input value is representable by int32_t or uint32_t, conversions
6574578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// from W registers will also be tested.
6575578645f14e122d2b87d907e298cda7e7d0babf1farmvixlstatic void TestUScvtfHelper(uint64_t in,
6576578645f14e122d2b87d907e298cda7e7d0babf1farmvixl                             uint64_t expected_scvtf_bits,
6577578645f14e122d2b87d907e298cda7e7d0babf1farmvixl                             uint64_t expected_ucvtf_bits) {
6578578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint64_t u64 = in;
6579578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint32_t u32 = u64 & 0xffffffff;
6580578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int64_t s64 = static_cast<int64_t>(in);
6581578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int32_t s32 = s64 & 0x7fffffff;
6582578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6583578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  bool cvtf_s32 = (s64 == s32);
6584578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  bool cvtf_u32 = (u64 == u32);
6585578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6586578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double results_scvtf_x[65];
6587578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double results_ucvtf_x[65];
6588578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double results_scvtf_w[33];
6589578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double results_ucvtf_w[33];
6590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6591578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  SETUP();
6592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6593578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6594578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x0, reinterpret_cast<int64_t>(results_scvtf_x));
6595578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x1, reinterpret_cast<int64_t>(results_ucvtf_x));
6596578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x2, reinterpret_cast<int64_t>(results_scvtf_w));
6597578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x3, reinterpret_cast<int64_t>(results_ucvtf_w));
6598578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6599578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x10, s64);
6600578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6601578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Corrupt the top word, in case it is accidentally used during W-register
6602578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // conversions.
6603578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x11, 0x5555555555555555);
6604578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bfi(x11, x10, 0, kWRegSize);
6605578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6606578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test integer conversions.
6607578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Scvtf(d0, x10);
6608578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ucvtf(d1, x10);
6609578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Scvtf(d2, w11);
6610578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ucvtf(d3, w11);
6611578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(d0, MemOperand(x0));
6612578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(d1, MemOperand(x1));
6613578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(d2, MemOperand(x2));
6614578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(d3, MemOperand(x3));
6615578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6616578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test all possible values of fbits.
6617578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 1; fbits <= 32; fbits++) {
6618578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(d0, x10, fbits);
6619578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(d1, x10, fbits);
6620578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(d2, w11, fbits);
6621578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(d3, w11, fbits);
6622578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d0, MemOperand(x0, fbits * kDRegSizeInBytes));
6623578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d1, MemOperand(x1, fbits * kDRegSizeInBytes));
6624578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d2, MemOperand(x2, fbits * kDRegSizeInBytes));
6625578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d3, MemOperand(x3, fbits * kDRegSizeInBytes));
6626578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6627578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6628578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Conversions from W registers can only handle fbits values <= 32, so just
6629578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // test conversions from X registers for 32 < fbits <= 64.
6630578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
6631578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(d0, x10, fbits);
6632578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(d1, x10, fbits);
6633578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d0, MemOperand(x0, fbits * kDRegSizeInBytes));
6634578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d1, MemOperand(x1, fbits * kDRegSizeInBytes));
6635578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6636578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6637578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  END();
6638578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  RUN();
6639578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6640578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check the results.
6641578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double expected_scvtf_base = rawbits_to_double(expected_scvtf_bits);
6642578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double expected_ucvtf_base = rawbits_to_double(expected_ucvtf_bits);
6643578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6644578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 0; fbits <= 32; fbits++) {
6645578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double expected_scvtf = expected_scvtf_base / pow(2, fbits);
6646578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double expected_ucvtf = expected_ucvtf_base / pow(2, fbits);
6647578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]);
6648578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]);
6649578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (cvtf_s32) ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_w[fbits]);
6650578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (cvtf_u32) ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_w[fbits]);
6651578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6652578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
6653578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double expected_scvtf = expected_scvtf_base / pow(2, fbits);
6654578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double expected_ucvtf = expected_ucvtf_base / pow(2, fbits);
6655578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]);
6656578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]);
6657578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6663578645f14e122d2b87d907e298cda7e7d0babf1farmvixlTEST(scvtf_ucvtf_double) {
6664578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Simple conversions of positive numbers which require no rounding; the
6665578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // results should not depened on the rounding mode, and ucvtf and scvtf should
6666578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // produce the same result.
6667578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000000000000, 0x0000000000000000, 0x0000000000000000);
6668578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000000000001, 0x3ff0000000000000, 0x3ff0000000000000);
6669578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000040000000, 0x41d0000000000000, 0x41d0000000000000);
6670578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000100000000, 0x41f0000000000000, 0x41f0000000000000);
6671578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x4000000000000000, 0x43d0000000000000, 0x43d0000000000000);
6672578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test mantissa extremities.
6673578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x4000000000000400, 0x43d0000000000001, 0x43d0000000000001);
6674578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The largest int32_t that fits in a double.
6675578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x000000007fffffff, 0x41dfffffffc00000, 0x41dfffffffc00000);
6676578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Values that would be negative if treated as an int32_t.
6677578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x00000000ffffffff, 0x41efffffffe00000, 0x41efffffffe00000);
6678578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000080000000, 0x41e0000000000000, 0x41e0000000000000);
6679578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000080000001, 0x41e0000000200000, 0x41e0000000200000);
6680578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The largest int64_t that fits in a double.
6681578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x7ffffffffffffc00, 0x43dfffffffffffff, 0x43dfffffffffffff);
6682578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check for bit pattern reproduction.
6683578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0123456789abcde0, 0x43723456789abcde, 0x43723456789abcde);
6684578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000012345678, 0x41b2345678000000, 0x41b2345678000000);
6685578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6686578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Simple conversions of negative int64_t values. These require no rounding,
6687578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // and the results should not depend on the rounding mode.
6688578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xffffffffc0000000, 0xc1d0000000000000, 0x43effffffff80000);
6689578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xffffffff00000000, 0xc1f0000000000000, 0x43efffffffe00000);
6690578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xc000000000000000, 0xc3d0000000000000, 0x43e8000000000000);
6691578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6692578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Conversions which require rounding.
6693578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000000, 0x43b0000000000000, 0x43b0000000000000);
6694578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000001, 0x43b0000000000000, 0x43b0000000000000);
6695578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000080, 0x43b0000000000000, 0x43b0000000000000);
6696578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000081, 0x43b0000000000001, 0x43b0000000000001);
6697578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000100, 0x43b0000000000001, 0x43b0000000000001);
6698578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000101, 0x43b0000000000001, 0x43b0000000000001);
6699578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000180, 0x43b0000000000002, 0x43b0000000000002);
6700578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000181, 0x43b0000000000002, 0x43b0000000000002);
6701578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000200, 0x43b0000000000002, 0x43b0000000000002);
6702578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000201, 0x43b0000000000002, 0x43b0000000000002);
6703578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000280, 0x43b0000000000002, 0x43b0000000000002);
6704578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000281, 0x43b0000000000003, 0x43b0000000000003);
6705578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000300, 0x43b0000000000003, 0x43b0000000000003);
6706578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check rounding of negative int64_t values (and large uint64_t values).
6707578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000000, 0xc3e0000000000000, 0x43e0000000000000);
6708578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000001, 0xc3e0000000000000, 0x43e0000000000000);
6709578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000200, 0xc3e0000000000000, 0x43e0000000000000);
6710578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000201, 0xc3dfffffffffffff, 0x43e0000000000000);
6711578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000400, 0xc3dfffffffffffff, 0x43e0000000000000);
6712578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000401, 0xc3dfffffffffffff, 0x43e0000000000001);
6713578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000600, 0xc3dffffffffffffe, 0x43e0000000000001);
6714578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000601, 0xc3dffffffffffffe, 0x43e0000000000001);
6715578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000800, 0xc3dffffffffffffe, 0x43e0000000000001);
6716578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000801, 0xc3dffffffffffffe, 0x43e0000000000001);
6717578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000a00, 0xc3dffffffffffffe, 0x43e0000000000001);
6718578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000a01, 0xc3dffffffffffffd, 0x43e0000000000001);
6719578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000c00, 0xc3dffffffffffffd, 0x43e0000000000002);
6720578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Round up to produce a result that's too big for the input to represent.
6721578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x7ffffffffffffe00, 0x43e0000000000000, 0x43e0000000000000);
6722578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x7fffffffffffffff, 0x43e0000000000000, 0x43e0000000000000);
6723578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xfffffffffffffc00, 0xc090000000000000, 0x43f0000000000000);
6724578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xffffffffffffffff, 0xbff0000000000000, 0x43f0000000000000);
6725578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
6726578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6728578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// The same as TestUScvtfHelper, but convert to floats.
6729578645f14e122d2b87d907e298cda7e7d0babf1farmvixlstatic void TestUScvtf32Helper(uint64_t in,
6730578645f14e122d2b87d907e298cda7e7d0babf1farmvixl                               uint32_t expected_scvtf_bits,
6731578645f14e122d2b87d907e298cda7e7d0babf1farmvixl                               uint32_t expected_ucvtf_bits) {
6732578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint64_t u64 = in;
6733578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint32_t u32 = u64 & 0xffffffff;
6734578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int64_t s64 = static_cast<int64_t>(in);
6735578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int32_t s32 = s64 & 0x7fffffff;
6736578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6737578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  bool cvtf_s32 = (s64 == s32);
6738578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  bool cvtf_u32 = (u64 == u32);
6739578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6740578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float results_scvtf_x[65];
6741578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float results_ucvtf_x[65];
6742578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float results_scvtf_w[33];
6743578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float results_ucvtf_w[33];
6744578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6745578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  SETUP();
6746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6748578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x0, reinterpret_cast<int64_t>(results_scvtf_x));
6749578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x1, reinterpret_cast<int64_t>(results_ucvtf_x));
6750578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x2, reinterpret_cast<int64_t>(results_scvtf_w));
6751578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x3, reinterpret_cast<int64_t>(results_ucvtf_w));
6752578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6753578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x10, s64);
6754578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6755578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Corrupt the top word, in case it is accidentally used during W-register
6756578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // conversions.
6757578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x11, 0x5555555555555555);
6758578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bfi(x11, x10, 0, kWRegSize);
6759578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6760578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test integer conversions.
6761578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Scvtf(s0, x10);
6762578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ucvtf(s1, x10);
6763578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Scvtf(s2, w11);
6764578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ucvtf(s3, w11);
6765578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(s0, MemOperand(x0));
6766578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(s1, MemOperand(x1));
6767578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(s2, MemOperand(x2));
6768578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(s3, MemOperand(x3));
6769578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6770578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test all possible values of fbits.
6771578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 1; fbits <= 32; fbits++) {
6772578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(s0, x10, fbits);
6773578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(s1, x10, fbits);
6774578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(s2, w11, fbits);
6775578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(s3, w11, fbits);
6776578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s0, MemOperand(x0, fbits * kSRegSizeInBytes));
6777578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s1, MemOperand(x1, fbits * kSRegSizeInBytes));
6778578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s2, MemOperand(x2, fbits * kSRegSizeInBytes));
6779578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s3, MemOperand(x3, fbits * kSRegSizeInBytes));
6780578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6782578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Conversions from W registers can only handle fbits values <= 32, so just
6783578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // test conversions from X registers for 32 < fbits <= 64.
6784578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
6785578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(s0, x10, fbits);
6786578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(s1, x10, fbits);
6787578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s0, MemOperand(x0, fbits * kSRegSizeInBytes));
6788578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s1, MemOperand(x1, fbits * kSRegSizeInBytes));
6789578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6790578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6791578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  END();
6792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6794578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check the results.
6795578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float expected_scvtf_base = rawbits_to_float(expected_scvtf_bits);
6796578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float expected_ucvtf_base = rawbits_to_float(expected_ucvtf_bits);
6797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6798578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 0; fbits <= 32; fbits++) {
6799f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float expected_scvtf = expected_scvtf_base / powf(2, fbits);
6800f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float expected_ucvtf = expected_ucvtf_base / powf(2, fbits);
6801578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]);
6802578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]);
6803578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (cvtf_s32) ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_w[fbits]);
6804578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (cvtf_u32) ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_w[fbits]);
6805578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    break;
6806578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6807578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
6808578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    break;
6809f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float expected_scvtf = expected_scvtf_base / powf(2, fbits);
6810f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float expected_ucvtf = expected_ucvtf_base / powf(2, fbits);
6811578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]);
6812578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]);
6813578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6819578645f14e122d2b87d907e298cda7e7d0babf1farmvixlTEST(scvtf_ucvtf_float) {
6820578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Simple conversions of positive numbers which require no rounding; the
6821578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // results should not depened on the rounding mode, and ucvtf and scvtf should
6822578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // produce the same result.
6823578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000000000000, 0x00000000, 0x00000000);
6824578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000000000001, 0x3f800000, 0x3f800000);
6825578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000040000000, 0x4e800000, 0x4e800000);
6826578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000100000000, 0x4f800000, 0x4f800000);
6827578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x4000000000000000, 0x5e800000, 0x5e800000);
6828578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test mantissa extremities.
6829578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000000800001, 0x4b000001, 0x4b000001);
6830578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x4000008000000000, 0x5e800001, 0x5e800001);
6831578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The largest int32_t that fits in a float.
6832578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x000000007fffff80, 0x4effffff, 0x4effffff);
6833578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Values that would be negative if treated as an int32_t.
6834578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x00000000ffffff00, 0x4f7fffff, 0x4f7fffff);
6835578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000080000000, 0x4f000000, 0x4f000000);
6836578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000080000100, 0x4f000001, 0x4f000001);
6837578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The largest int64_t that fits in a float.
6838578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x7fffff8000000000, 0x5effffff, 0x5effffff);
6839578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check for bit pattern reproduction.
6840578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000000876543, 0x4b076543, 0x4b076543);
6841578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6842578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Simple conversions of negative int64_t values. These require no rounding,
6843578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // and the results should not depend on the rounding mode.
6844578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0xfffffc0000000000, 0xd4800000, 0x5f7ffffc);
6845578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0xc000000000000000, 0xde800000, 0x5f400000);
6846578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6847578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Conversions which require rounding.
6848578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800000000000, 0x57000000, 0x57000000);
6849578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800000000001, 0x57000000, 0x57000000);
6850578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800000800000, 0x57000000, 0x57000000);
6851578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800000800001, 0x57000001, 0x57000001);
6852578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800001000000, 0x57000001, 0x57000001);
6853578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800001000001, 0x57000001, 0x57000001);
6854578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800001800000, 0x57000002, 0x57000002);
6855578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800001800001, 0x57000002, 0x57000002);
6856578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800002000000, 0x57000002, 0x57000002);
6857578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800002000001, 0x57000002, 0x57000002);
6858578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800002800000, 0x57000002, 0x57000002);
6859578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800002800001, 0x57000003, 0x57000003);
6860578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800003000000, 0x57000003, 0x57000003);
6861578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check rounding of negative int64_t values (and large uint64_t values).
6862578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000000000000000, 0xdf000000, 0x5f000000);
6863578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000000000000001, 0xdf000000, 0x5f000000);
6864578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000004000000000, 0xdf000000, 0x5f000000);
6865578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000004000000001, 0xdeffffff, 0x5f000000);
6866578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000008000000000, 0xdeffffff, 0x5f000000);
6867578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000008000000001, 0xdeffffff, 0x5f000001);
6868578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x800000c000000000, 0xdefffffe, 0x5f000001);
6869578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x800000c000000001, 0xdefffffe, 0x5f000001);
6870578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000010000000000, 0xdefffffe, 0x5f000001);
6871578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000010000000001, 0xdefffffe, 0x5f000001);
6872578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000014000000000, 0xdefffffe, 0x5f000001);
6873578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000014000000001, 0xdefffffd, 0x5f000001);
6874578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000018000000000, 0xdefffffd, 0x5f000002);
6875578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Round up to produce a result that's too big for the input to represent.
6876578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x000000007fffffc0, 0x4f000000, 0x4f000000);
6877578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x000000007fffffff, 0x4f000000, 0x4f000000);
6878578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x00000000ffffff80, 0x4f800000, 0x4f800000);
6879578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x00000000ffffffff, 0x4f800000, 0x4f800000);
6880578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x7fffffc000000000, 0x5f000000, 0x5f000000);
6881578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x7fffffffffffffff, 0x5f000000, 0x5f000000);
6882578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0xffffff8000000000, 0xd3000000, 0x5f800000);
6883578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0xffffffffffffffff, 0xbf800000, 0x5f800000);
6884578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
6885578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6886578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(system_mrs) {
6888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
6892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 1);
6893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, 0x80000000);
6894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the Z and C flags.
6896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, w0);
6897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
6898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the N flag.
6900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, w1);
6901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
6902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the Z, C and V flags.
6904f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(w0, w2, w2);
6905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
6906578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6907578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Read the default FPCR.
6908578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x6, FPCR);
6909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6913578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // NZCV
6914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w3);
6915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w4);
6916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCVFlag, w5);
6917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6918578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // FPCR
6919578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The default FPCR on Linux-based platforms is 0.
6920578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(0, w6);
6921578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(system_msr) {
6927578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // All FPCR fields that must be implemented: AHP, DN, FZ, RMode
6928578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  const uint64_t fpcr_core = 0x07c00000;
6929578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6930578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // All FPCR fields (including fields which may be read-as-zero):
6931578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  Stride, Len
6932578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  IDE, IXE, UFE, OFE, DZE, IOE
6933578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  const uint64_t fpcr_all = fpcr_core | 0x00379f00;
6934578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
6939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0x7fffffff);
6940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x7, 0);
6942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, NVFlag);
6944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, w0);     // Set Z and C.
6945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msr(NZCV, x10);  // Set N and V.
6946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The Msr should have overwritten every flag set by the Cmp.
6947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, mi);  // N
6948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, ne);  // !Z
6949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, lo);  // !C
6950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, vs);  // V
6951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, ZCFlag);
6953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(w1, w1);     // Set N and V.
6954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msr(NZCV, x10);  // Set Z and C.
6955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The Msr should have overwritten every flag set by the Cmn.
6956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, pl);  // !N
6957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, eq);  // Z
6958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, hs);  // C
6959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, vc);  // !V
6960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6961578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // All core FPCR fields must be writable.
6962578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x8, fpcr_core);
6963578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Msr(FPCR, x8);
6964578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x8, FPCR);
6965578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6966578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // All FPCR fields, including optional ones. This part of the test doesn't
6967578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // achieve much other than ensuring that supported fields can be cleared by
6968578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // the next test.
6969578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x9, fpcr_all);
6970578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Msr(FPCR, x9);
6971578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x9, FPCR);
6972578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ And(x9, x9, fpcr_core);
6973578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6974578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The undefined bits must ignore writes.
6975578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // It's conceivable that a future version of the architecture could use these
6976578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // fields (making this test fail), but in the meantime this is a useful test
6977578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // for the simulator.
6978578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x10, ~fpcr_all);
6979578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Msr(FPCR, x10);
6980578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x10, FPCR);
6981578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We should have incremented x7 (from 0) exactly 8 times.
6987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(8, x7);
6988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6989578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(fpcr_core, x8);
6990578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(fpcr_core, x9);
6991578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(0, x10);
6992578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(system_nop) {
6998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump before;
7000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  before.Dump(&masm);
7003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Nop();
7004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_REGISTERS(before);
7009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(before.flags_nzcv());
7010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(zero_dest) {
7016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump before;
7018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Preserve the stack pointer, in case we clobber it.
7021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x30, sp);
7022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the other registers used in this test.
7023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
7025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, literal_base);
7026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (unsigned i = 2; i < x30.code(); i++) {
7027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Add(Register::XRegFromCode(i), Register::XRegFromCode(i-1), x1);
7028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  before.Dump(&masm);
7030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // All of these instructions should be NOPs in these forms, but have
7032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // alternate forms which can write into the stack pointer.
7033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ add(xzr, x0, x1);
7034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ add(xzr, x1, xzr);
7035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ add(xzr, xzr, x1);
7036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ and_(xzr, x0, x2);
7038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ and_(xzr, x2, xzr);
7039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ and_(xzr, xzr, x2);
7040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bic(xzr, x0, x3);
7042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bic(xzr, x3, xzr);
7043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bic(xzr, xzr, x3);
7044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eon(xzr, x0, x4);
7046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eon(xzr, x4, xzr);
7047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eon(xzr, xzr, x4);
7048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eor(xzr, x0, x5);
7050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eor(xzr, x5, xzr);
7051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eor(xzr, xzr, x5);
7052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ orr(xzr, x0, x6);
7054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ orr(xzr, x6, xzr);
7055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ orr(xzr, xzr, x6);
7056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sub(xzr, x0, x7);
7058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sub(xzr, x7, xzr);
7059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sub(xzr, xzr, x7);
7060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Swap the saved stack pointer with the real one. If sp was written
7062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // during the test, it will show up in x30. This is done because the test
7063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // framework assumes that sp will be valid at the end of the test.
7064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, x30);
7065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x30, sp);
7066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x29);
7067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We used x29 as a scratch register, so reset it to make sure it doesn't
7068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // trigger a test failure.
7069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x29, x28, x1);
7070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_REGISTERS(before);
7075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(before.flags_nzcv());
7076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(zero_dest_setflags) {
7082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump before;
7084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Preserve the stack pointer, in case we clobber it.
7087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x30, sp);
7088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the other registers used in this test.
7089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
7091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, literal_base);
7092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 2; i < 30; i++) {
7093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Add(Register::XRegFromCode(i), Register::XRegFromCode(i-1), x1);
7094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  before.Dump(&masm);
7096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // All of these instructions should only write to the flags in these forms,
7098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // but have alternate forms which can write into the stack pointer.
7099f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x0, Operand(x1, UXTX));
7100f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x1, Operand(xzr, UXTX));
7101f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x1, 1234);
7102f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x0, x1);
7103f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x1, xzr);
7104f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, xzr, x1);
7105f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
7106f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, x2, ~0xf);
7107f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, xzr, ~0xf);
7108f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, x0, x2);
7109f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, x2, xzr);
7110f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, xzr, x2);
7111f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
7112f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, x3, ~0xf);
7113f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, xzr, ~0xf);
7114f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, x0, x3);
7115f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, x3, xzr);
7116f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, xzr, x3);
7117f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
7118f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x0, Operand(x3, UXTX));
7119f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x3, Operand(xzr, UXTX));
7120f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x3, 1234);
7121f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x0, x3);
7122f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x3, xzr);
7123f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, xzr, x3);
7124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Swap the saved stack pointer with the real one. If sp was written
7126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // during the test, it will show up in x30. This is done because the test
7127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // framework assumes that sp will be valid at the end of the test.
7128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, x30);
7129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x30, sp);
7130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x29);
7131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We used x29 as a scratch register, so reset it to make sure it doesn't
7132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // trigger a test failure.
7133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x29, x28, x1);
7134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_REGISTERS(before);
7139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(register_bit) {
7145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // No code generation takes place in this test, so no need to setup and
7146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // teardown.
7147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Simple tests.
7149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x0.Bit() == (1UL << 0));
7150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x1.Bit() == (1UL << 1));
7151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x10.Bit() == (1UL << 10));
7152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // AAPCS64 definitions.
7154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(lr.Bit() == (1UL << kLinkRegCode));
7155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Fixed (hardware) definitions.
7157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(xzr.Bit() == (1UL << kZeroRegCode));
7158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Internal ABI definitions.
7160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Bit() == (1UL << kSPRegInternalCode));
7161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Bit() != xzr.Bit());
7162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // xn.Bit() == wn.Bit() at all times, for the same n.
7164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x0.Bit() == w0.Bit());
7165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x1.Bit() == w1.Bit());
7166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x10.Bit() == w10.Bit());
7167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(xzr.Bit() == wzr.Bit());
7168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Bit() == wsp.Bit());
7169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(stack_pointer_override) {
7173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test generates some stack maintenance code, but the test only checks
7174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // the reported state.
7175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The default stack pointer in VIXL is sp.
7179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Is(__ StackPointer()));
7180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(x0);
7181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x0.Is(__ StackPointer()));
7182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(x28);
7183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x28.Is(__ StackPointer()));
7184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(sp);
7185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Is(__ StackPointer()));
7186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(peek_poke_simple) {
7194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static const RegList x0_to_x3 = x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit();
7198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static const RegList x10_to_x13 = x10.Bit() | x11.Bit() |
7199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    x12.Bit() | x13.Bit();
7200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the registers.
7209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, literal_base);
7210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x1, x0, x0);
7211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x2, x1, x0);
7212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x3, x2, x0);
7213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(32);
7215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Simple exchange.
7217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  After this test:
7218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x0-x3 should be unchanged.
7219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    w10-w13 should contain the lower words of x0-x3.
7220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 0);
7221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x1, 8);
7222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x2, 16);
7223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x3, 24);
7224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x0_to_x3);
7225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x0, 0);
7226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x1, 8);
7227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x2, 16);
7228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x3, 24);
7229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w0, 0);
7231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w1, 4);
7232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w2, 8);
7233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w3, 12);
7234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x10_to_x13);
7235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w10, 0);
7236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w11, 4);
7237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w12, 8);
7238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w13, 12);
7239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Drop(32);
7241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 1, x0);
7246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 2, x1);
7247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 3, x2);
7248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 4, x3);
7249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 1) & 0xffffffff, x10);
7251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 2) & 0xffffffff, x11);
7252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 3) & 0xffffffff, x12);
7253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 4) & 0xffffffff, x13);
7254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(peek_poke_unaligned) {
7260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the registers.
7271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, literal_base);
7272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x1, x0, x0);
7273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x2, x1, x0);
7274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x3, x2, x0);
7275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x4, x3, x0);
7276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x5, x4, x0);
7277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x6, x5, x0);
7278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(32);
7280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Unaligned exchanges.
7282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  After this test:
7283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x0-x6 should be unchanged.
7284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    w10-w12 should contain the lower words of x0-x2.
7285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 1);
7286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x0.Bit());
7287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x0, 1);
7288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x1, 2);
7289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x1.Bit());
7290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x1, 2);
7291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x2, 3);
7292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x2.Bit());
7293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x2, 3);
7294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x3, 4);
7295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x3.Bit());
7296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x3, 4);
7297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x4, 5);
7298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x4.Bit());
7299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x4, 5);
7300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x5, 6);
7301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x5.Bit());
7302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x5, 6);
7303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x6, 7);
7304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x6.Bit());
7305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x6, 7);
7306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w0, 1);
7308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, w10.Bit());
7309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w10, 1);
7310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w1, 2);
7311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, w11.Bit());
7312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w11, 2);
7313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w2, 3);
7314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, w12.Bit());
7315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w12, 3);
7316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Drop(32);
7318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 1, x0);
7323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 2, x1);
7324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 3, x2);
7325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 4, x3);
7326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 5, x4);
7327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 6, x5);
7328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 7, x6);
7329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 1) & 0xffffffff, x10);
7331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 2) & 0xffffffff, x11);
7332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 3) & 0xffffffff, x12);
7333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(peek_poke_endianness) {
7339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the registers.
7350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, literal_base);
7351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x1, x0, x0);
7352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(32);
7354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Endianness tests.
7356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  After this section:
7357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x4 should match x0[31:0]:x0[63:32]
7358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    w5 should match w1[15:0]:w1[31:16]
7359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 0);
7360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 8);
7361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x4, 4);
7362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w1, 0);
7364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w1, 4);
7365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w5, 2);
7366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Drop(32);
7368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x0_expected = literal_base * 1;
7373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x1_expected = literal_base * 2;
7374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x4_expected = (x0_expected << 32) | (x0_expected >> 32);
7375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x5_expected = ((x1_expected << 16) & 0xffff0000) |
7376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                         ((x1_expected >> 16) & 0x0000ffff);
7377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x0_expected, x0);
7379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x1_expected, x1);
7380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x4_expected, x4);
7381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x5_expected, x5);
7382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(peek_poke_mixed) {
7388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the registers.
7399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, literal_base);
7400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x1, x0, x0);
7401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x2, x1, x0);
7402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x3, x2, x0);
7403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(32);
7405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Mix with other stack operations.
7407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  After this section:
7408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x0-x3 should be unchanged.
7409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x6 should match x1[31:0]:x0[63:32]
7410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    w7 should match x1[15:0]:x0[63:48]
7411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x1, 8);
7412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 0);
7413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
7414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT(__ StackPointer().Is(sp));
7415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x4, __ StackPointer());
7416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(x4);
7417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Poke(wzr, 0);    // Clobber the space we're about to drop.
7419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(4);
7420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Peek(x6, 0);
7421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(8);
7422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Peek(w7, 10);
7423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Poke(x3, 28);
7424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Poke(xzr, 0);    // Clobber the space we're about to drop.
7425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(8);
7426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Poke(x2, 12);
7427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Push(w0);
7428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
7430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
7431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(x0, x1, x2, x3);
7434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x0_expected = literal_base * 1;
7439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x1_expected = literal_base * 2;
7440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x2_expected = literal_base * 3;
7441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x3_expected = literal_base * 4;
7442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x6_expected = (x1_expected << 32) | (x0_expected >> 32);
7443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x7_expected = ((x1_expected << 16) & 0xffff0000) |
7444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                         ((x0_expected >> 48) & 0x0000ffff);
7445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x0_expected, x0);
7447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x1_expected, x1);
7448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x2_expected, x2);
7449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x3_expected, x3);
7450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x6_expected, x6);
7451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x7_expected, x7);
7452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// This enum is used only as an argument to the push-pop test helpers.
7458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlenum PushPopMethod {
7459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Push or Pop using the Push and Pop methods, with blocks of up to four
7460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // registers. (Smaller blocks will be used if necessary.)
7461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  PushPopByFour,
7462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Use Push<Size>RegList and Pop<Size>RegList to transfer the registers.
7464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  PushPopRegList
7465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl};
7466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// The maximum number of registers that can be used by the PushPopXReg* tests,
7469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// where a reg_count field is provided.
7470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic int const kPushPopXRegMaxRegCount = -1;
7471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Test a simple push-pop pattern:
7473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Claim <claim> bytes to set the stack alignment.
7474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Push <reg_count> registers with size <reg_size>.
7475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Clobber the register contents.
7476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Pop <reg_count> registers to restore the original contents.
7477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Drop <claim> bytes to restore the original stack pointer.
7478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
7479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Different push and pop methods can be specified independently to test for
7480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// proper word-endian behaviour.
7481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void PushPopXRegSimpleHelper(int reg_count,
7482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    int claim,
7483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    int reg_size,
7484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    PushPopMethod push_method,
7485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    PushPopMethod pop_method) {
7486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Arbitrarily pick a register to use as a stack pointer.
7491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register& stack_pointer = x20;
7492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const RegList allowed = ~stack_pointer.Bit();
7493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (reg_count == kPushPopXRegMaxRegCount) {
7494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    reg_count = CountSetBits(allowed, kNumberOfRegisters);
7495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Work out which registers to use, based on reg_size.
7497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register r[kNumberOfRegisters];
7498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register x[kNumberOfRegisters];
7499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList list = PopulateRegisterArray(NULL, x, r, reg_size, reg_count,
7500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                       allowed);
7501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
7510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT(__ StackPointer().Is(sp));
7511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(stack_pointer, __ StackPointer());
7512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(stack_pointer);
7513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    int i;
7515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Initialize the registers.
7517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (i = 0; i < reg_count; i++) {
7518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Always write into the X register, to ensure that the upper word is
7519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // properly ignored by Push when testing W registers.
7520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Mov(x[i], literal_base * i);
7521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Claim memory first, as requested.
7524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(claim);
7525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    switch (push_method) {
7527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopByFour:
7528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Push high-numbered registers first (to the highest addresses).
7529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (i = reg_count; i >= 4; i -= 4) {
7530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          __ Push(r[i-1], r[i-2], r[i-3], r[i-4]);
7531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Finish off the leftovers.
7533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        switch (i) {
7534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 3:  __ Push(r[2], r[1], r[0]); break;
7535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 2:  __ Push(r[1], r[0]);       break;
7536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 1:  __ Push(r[0]);             break;
7537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          default: ASSERT(i == 0);            break;
7538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopRegList:
7541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PushSizeRegList(list, reg_size);
7542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Clobber all the registers, to ensure that they get repopulated by Pop.
7546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, list);
7547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    switch (pop_method) {
7549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopByFour:
7550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Pop low-numbered registers first (from the lowest addresses).
7551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (i = 0; i <= (reg_count-4); i += 4) {
7552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          __ Pop(r[i], r[i+1], r[i+2], r[i+3]);
7553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Finish off the leftovers.
7555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        switch (reg_count - i) {
7556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 3:  __ Pop(r[i], r[i+1], r[i+2]); break;
7557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 2:  __ Pop(r[i], r[i+1]);         break;
7558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 1:  __ Pop(r[i]);                 break;
7559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          default: ASSERT(i == reg_count);       break;
7560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopRegList:
7563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PopSizeRegList(list, reg_size);
7564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Drop memory to restore stack_pointer.
7568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(claim);
7569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
7571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
7572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that the register contents were preserved.
7579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Always use ASSERT_EQUAL_64, even when testing W registers, so we can test
7580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // that the upper word was properly cleared by Pop.
7581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  literal_base &= (0xffffffffffffffffUL >> (64-reg_size));
7582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i < reg_count; i++) {
7583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (x[i].Is(xzr)) {
7584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT_EQUAL_64(0, x[i]);
7585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    } else {
7586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT_EQUAL_64(literal_base * i, x[i]);
7587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_simple_32) {
7595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
7596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 0; count <= 8; count++) {
7597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
7598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopByFour);
7599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
7600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopRegList);
7601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
7602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopByFour);
7603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
7604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopRegList);
7605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
7607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kWRegSize, PushPopByFour, PushPopByFour);
7609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kWRegSize, PushPopByFour, PushPopRegList);
7611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kWRegSize, PushPopRegList, PushPopByFour);
7613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kWRegSize, PushPopRegList, PushPopRegList);
7615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_simple_64) {
7620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
7621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 0; count <= 8; count++) {
7622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
7623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopByFour);
7624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
7625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopRegList);
7626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
7627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopByFour);
7628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
7629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopRegList);
7630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
7632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kXRegSize, PushPopByFour, PushPopByFour);
7634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kXRegSize, PushPopByFour, PushPopRegList);
7636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kXRegSize, PushPopRegList, PushPopByFour);
7638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kXRegSize, PushPopRegList, PushPopRegList);
7640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// The maximum number of registers that can be used by the PushPopFPXReg* tests,
7645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// where a reg_count field is provided.
7646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic int const kPushPopFPXRegMaxRegCount = -1;
7647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Test a simple push-pop pattern:
7649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Claim <claim> bytes to set the stack alignment.
7650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Push <reg_count> FP registers with size <reg_size>.
7651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Clobber the register contents.
7652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Pop <reg_count> FP registers to restore the original contents.
7653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Drop <claim> bytes to restore the original stack pointer.
7654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
7655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Different push and pop methods can be specified independently to test for
7656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// proper word-endian behaviour.
7657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void PushPopFPXRegSimpleHelper(int reg_count,
7658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                      int claim,
7659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                      int reg_size,
7660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                      PushPopMethod push_method,
7661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                      PushPopMethod pop_method) {
7662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We can use any floating-point register. None of them are reserved for
7667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // debug code, for example.
7668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static RegList const allowed = ~0;
7669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (reg_count == kPushPopFPXRegMaxRegCount) {
7670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    reg_count = CountSetBits(allowed, kNumberOfFPRegisters);
7671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Work out which registers to use, based on reg_size.
7673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  FPRegister v[kNumberOfRegisters];
7674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  FPRegister d[kNumberOfRegisters];
7675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList list = PopulateFPRegisterArray(NULL, d, v, reg_size, reg_count,
7676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                         allowed);
7677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Arbitrarily pick a register to use as a stack pointer.
7679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register& stack_pointer = x10;
7680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied (using an integer) by small values (such as a register
7683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    index), this value is clearly readable in the result.
7684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * It is never a floating-point NaN, and will therefore always compare
7687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    equal to itself.
7688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
7691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT(__ StackPointer().Is(sp));
7692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(stack_pointer, __ StackPointer());
7693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(stack_pointer);
7694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    int i;
7696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Initialize the registers, using X registers to load the literal.
7698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x0, 0);
7699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x1, literal_base);
7700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (i = 0; i < reg_count; i++) {
7701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Always write into the D register, to ensure that the upper word is
7702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // properly ignored by Push when testing S registers.
7703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Fmov(d[i], x0);
7704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Calculate the next literal.
7705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Add(x0, x0, x1);
7706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Claim memory first, as requested.
7709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(claim);
7710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    switch (push_method) {
7712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopByFour:
7713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Push high-numbered registers first (to the highest addresses).
7714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (i = reg_count; i >= 4; i -= 4) {
7715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          __ Push(v[i-1], v[i-2], v[i-3], v[i-4]);
7716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Finish off the leftovers.
7718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        switch (i) {
7719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 3:  __ Push(v[2], v[1], v[0]); break;
7720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 2:  __ Push(v[1], v[0]);       break;
7721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 1:  __ Push(v[0]);             break;
7722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          default: ASSERT(i == 0);            break;
7723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopRegList:
7726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PushSizeRegList(list, reg_size, CPURegister::kFPRegister);
7727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Clobber all the registers, to ensure that they get repopulated by Pop.
7731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ClobberFP(&masm, list);
7732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    switch (pop_method) {
7734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopByFour:
7735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Pop low-numbered registers first (from the lowest addresses).
7736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (i = 0; i <= (reg_count-4); i += 4) {
7737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          __ Pop(v[i], v[i+1], v[i+2], v[i+3]);
7738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Finish off the leftovers.
7740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        switch (reg_count - i) {
7741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 3:  __ Pop(v[i], v[i+1], v[i+2]); break;
7742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 2:  __ Pop(v[i], v[i+1]);         break;
7743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 1:  __ Pop(v[i]);                 break;
7744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          default: ASSERT(i == reg_count);       break;
7745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopRegList:
7748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PopSizeRegList(list, reg_size, CPURegister::kFPRegister);
7749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Drop memory to restore the stack pointer.
7753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(claim);
7754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
7756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
7757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that the register contents were preserved.
7764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Always use ASSERT_EQUAL_FP64, even when testing S registers, so we can
7765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // test that the upper word was properly cleared by Pop.
7766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  literal_base &= (0xffffffffffffffffUL >> (64-reg_size));
7767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i < reg_count; i++) {
7768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    uint64_t literal = literal_base * i;
7769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    double expected;
7770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    memcpy(&expected, &literal, sizeof(expected));
7771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT_EQUAL_FP64(expected, d[i]);
7772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_fp_xreg_simple_32) {
7779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
7780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 0; count <= 8; count++) {
7781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
7782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopByFour, PushPopByFour);
7783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
7784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopByFour, PushPopRegList);
7785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
7786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopRegList, PushPopByFour);
7787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
7788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopRegList, PushPopRegList);
7789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
7791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
7792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopByFour);
7793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
7794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopRegList);
7795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
7796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopByFour);
7797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
7798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopRegList);
7799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_fp_xreg_simple_64) {
7804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
7805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 0; count <= 8; count++) {
7806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
7807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopByFour, PushPopByFour);
7808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
7809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopByFour, PushPopRegList);
7810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
7811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopRegList, PushPopByFour);
7812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
7813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopRegList, PushPopRegList);
7814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
7816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
7817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopByFour);
7818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
7819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopRegList);
7820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
7821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopByFour);
7822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
7823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopRegList);
7824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Push and pop data using an overlapping combination of Push/Pop and
7829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// RegList-based methods.
7830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void PushPopXRegMixedMethodsHelper(int claim, int reg_size) {
7831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Arbitrarily pick a register to use as a stack pointer.
7834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register& stack_pointer = x5;
7835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const RegList allowed = ~stack_pointer.Bit();
7836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Work out which registers to use, based on reg_size.
7837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register r[10];
7838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register x[10];
7839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  PopulateRegisterArray(NULL, x, r, reg_size, 10, allowed);
7840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Calculate some handy register lists.
7842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList r0_to_r3 = 0;
7843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i <= 3; i++) {
7844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    r0_to_r3 |= x[i].Bit();
7845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList r4_to_r5 = 0;
7847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 4; i <= 5; i++) {
7848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    r4_to_r5 |= x[i].Bit();
7849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList r6_to_r9 = 0;
7851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 6; i <= 9; i++) {
7852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    r6_to_r9 |= x[i].Bit();
7853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t literal_base = 0x0100001000100101UL;
7861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
7864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT(__ StackPointer().Is(sp));
7865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(stack_pointer, __ StackPointer());
7866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(stack_pointer);
7867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Claim memory first, as requested.
7869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(claim);
7870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x[3], literal_base * 3);
7872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x[2], literal_base * 2);
7873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x[1], literal_base * 1);
7874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x[0], literal_base * 0);
7875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ PushSizeRegList(r0_to_r3, reg_size);
7877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Push(r[3], r[2]);
7878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, r0_to_r3);
7880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ PopSizeRegList(r0_to_r3, reg_size);
7881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Push(r[2], r[1], r[3], r[0]);
7883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, r4_to_r5);
7885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Pop(r[4], r[5]);
7886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, r6_to_r9);
7887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Pop(r[6], r[7], r[8], r[9]);
7888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Drop memory to restore stack_pointer.
7890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(claim);
7891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
7893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
7894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Always use ASSERT_EQUAL_64, even when testing W registers, so we can test
7901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // that the upper word was properly cleared by Pop.
7902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  literal_base &= (0xffffffffffffffffUL >> (64-reg_size));
7903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 3, x[9]);
7905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 2, x[8]);
7906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 0, x[7]);
7907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 3, x[6]);
7908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 1, x[5]);
7909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 2, x[4]);
7910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_mixed_methods_64) {
7916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
7917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegMixedMethodsHelper(claim, kXRegSize);
7918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_mixed_methods_32) {
7923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
7924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegMixedMethodsHelper(claim, kWRegSize);
7925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Push and pop data using overlapping X- and W-sized quantities.
7930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void PushPopXRegWXOverlapHelper(int reg_count, int claim) {
7931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Arbitrarily pick a register to use as a stack pointer.
7934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register& stack_pointer = x10;
7935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const RegList allowed = ~stack_pointer.Bit();
7936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (reg_count == kPushPopXRegMaxRegCount) {
7937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    reg_count = CountSetBits(allowed, kNumberOfRegisters);
7938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Work out which registers to use, based on reg_size.
7940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register w[kNumberOfRegisters];
7941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register x[kNumberOfRegisters];
7942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList list = PopulateRegisterArray(w, x, NULL, 0, reg_count, allowed);
7943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The number of W-sized slots we expect to pop. When we pop, we alternate
7945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // between W and X registers, so we need reg_count*1.5 W-sized slots.
7946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int const requested_w_slots = reg_count + reg_count / 2;
7947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Track what _should_ be on the stack, using W-sized slots.
7949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static int const kMaxWSlots = kNumberOfRegisters + kNumberOfRegisters / 2;
7950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t stack[kMaxWSlots];
7951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i < kMaxWSlots; i++) {
7952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    stack[i] = 0xdeadbeef;
7953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static uint64_t const literal_base = 0x0100001000100101UL;
7961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static uint64_t const literal_base_hi = literal_base >> 32;
7962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static uint64_t const literal_base_lo = literal_base & 0xffffffff;
7963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static uint64_t const literal_base_w = literal_base & 0xffffffff;
7964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
7967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT(__ StackPointer().Is(sp));
7968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(stack_pointer, __ StackPointer());
7969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(stack_pointer);
7970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Initialize the registers.
7972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int i = 0; i < reg_count; i++) {
7973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Always write into the X register, to ensure that the upper word is
7974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // properly ignored by Push when testing W registers.
7975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Mov(x[i], literal_base * i);
7976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Claim memory first, as requested.
7979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(claim);
7980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // The push-pop pattern is as follows:
7982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Push:           Pop:
7983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[0](hi)   ->   w[0]
7984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[0](lo)   ->   x[1](hi)
7985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[1]       ->   x[1](lo)
7986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[1]       ->   w[2]
7987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](hi)   ->   x[2](hi)
7988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](lo)   ->   x[2](lo)
7989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](hi)   ->   w[3]
7990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](lo)   ->   x[4](hi)
7991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](hi)   ->   x[4](lo)
7992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](lo)   ->   w[5]
7993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[3]       ->   x[5](hi)
7994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[3]       ->   x[6](lo)
7995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[3]       ->   w[7]
7996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[3]       ->   x[8](hi)
7997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[4](hi)   ->   x[8](lo)
7998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[4](lo)   ->   w[9]
7999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // ... pattern continues ...
8000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //
8001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // That is, registers are pushed starting with the lower numbers,
8002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // alternating between x and w registers, and pushing i%4+1 copies of each,
8003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // where i is the register number.
8004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Registers are popped starting with the higher numbers one-by-one,
8005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // alternating between x and w registers, but only popping one at a time.
8006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //
8007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // This pattern provides a wide variety of alignment effects and overlaps.
8008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // ---- Push ----
8010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    int active_w_slots = 0;
8012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int i = 0; active_w_slots < requested_w_slots; i++) {
8013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT(i < reg_count);
8014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // In order to test various arguments to PushMultipleTimes, and to try to
8015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // exercise different alignment and overlap effects, we push each
8016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // register a different number of times.
8017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      int times = i % 4 + 1;
8018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      if (i & 1) {
8019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Push odd-numbered registers as W registers.
8020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PushMultipleTimes(times, w[i]);
8021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Fill in the expected stack slots.
8022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (int j = 0; j < times; j++) {
8023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          if (w[i].Is(wzr)) {
8024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            // The zero register always writes zeroes.
8025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = 0;
8026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          } else {
8027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = literal_base_w * i;
8028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          }
8029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
8030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      } else {
8031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Push even-numbered registers as X registers.
8032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PushMultipleTimes(times, x[i]);
8033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Fill in the expected stack slots.
8034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (int j = 0; j < times; j++) {
8035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          if (x[i].Is(xzr)) {
8036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            // The zero register always writes zeroes.
8037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = 0;
8038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = 0;
8039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          } else {
8040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = literal_base_hi * i;
8041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = literal_base_lo * i;
8042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          }
8043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
8044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      }
8045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Because we were pushing several registers at a time, we probably pushed
8047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // more than we needed to.
8048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (active_w_slots > requested_w_slots) {
8049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Drop((active_w_slots - requested_w_slots) * kWRegSizeInBytes);
8050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Bump the number of active W-sized slots back to where it should be,
8051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // and fill the empty space with a dummy value.
8052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      do {
8053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        stack[active_w_slots--] = 0xdeadbeef;
8054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      } while (active_w_slots > requested_w_slots);
8055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // ---- Pop ----
8058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, list);
8060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // If popping an even number of registers, the first one will be X-sized.
8062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Otherwise, the first one will be W-sized.
8063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    bool next_is_64 = !(reg_count & 1);
8064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int i = reg_count-1; i >= 0; i--) {
8065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      if (next_is_64) {
8066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ Pop(x[i]);
8067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        active_w_slots -= 2;
8068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      } else {
8069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ Pop(w[i]);
8070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        active_w_slots -= 1;
8071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      }
8072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      next_is_64 = !next_is_64;
8073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT(active_w_slots == 0);
8075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Drop memory to restore stack_pointer.
8077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(claim);
8078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
8080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
8081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int slot = 0;
8088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i < reg_count; i++) {
8089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Even-numbered registers were written as W registers.
8090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Odd-numbered registers were written as X registers.
8091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    bool expect_64 = (i & 1);
8092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    uint64_t expected;
8093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (expect_64) {
8095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      uint64_t hi = stack[slot++];
8096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      uint64_t lo = stack[slot++];
8097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      expected = (hi << 32) | lo;
8098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    } else {
8099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      expected = stack[slot++];
8100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Always use ASSERT_EQUAL_64, even when testing W registers, so we can
8103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // test that the upper word was properly cleared by Pop.
8104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (x[i].Is(xzr)) {
8105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT_EQUAL_64(0, x[i]);
8106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    } else {
8107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT_EQUAL_64(expected, x[i]);
8108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT(slot == requested_w_slots);
8111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_wx_overlap) {
8117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
8118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 1; count <= 8; count++) {
8119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegWXOverlapHelper(count, claim);
8120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
8122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegWXOverlapHelper(kPushPopXRegMaxRegCount, claim);
8123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_sp) {
8128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT(sp.Is(__ StackPointer()));
8133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0x3333333333333333UL);
8135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0x2222222222222222UL);
8136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1111111111111111UL);
8137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0000000000000000UL);
8138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit());
8140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(x3, x2);
8141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit());
8142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(x2, x1, x3, x0);
8143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(x4, x5);
8144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(x6, x7, x8, x9);
8145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushWRegList(w0.Bit() | w1.Bit() | w2.Bit() | w3.Bit());
8148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(w3, w1, w2, w0);
8149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopWRegList(w10.Bit() | w11.Bit() | w12.Bit() | w13.Bit());
8150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(w14, w15, w16, w17);
8151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(w2, w2, w1, w1);
8154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(x3, x3);
8155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(w18, w19, w20, w21);
8156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(x22, x23);
8157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushXRegList(x1.Bit() | x22.Bit());
8160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopXRegList(x24.Bit() | x26.Bit());
8161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushWRegList(w1.Bit() | w2.Bit() | w4.Bit() | w22.Bit());
8164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopWRegList(w25.Bit() | w27.Bit() | w28.Bit() | w29.Bit());
8165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushXRegList(0);
8168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopXRegList(0);
8169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushXRegList(0xffffffff);
8170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopXRegList(0xffffffff);
8171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Drop(12 * kXRegSizeInBytes);
8172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1111111111111111UL, x3);
8177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000000000UL, x2);
8178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3333333333333333UL, x1);
8179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x2222222222222222UL, x0);
8180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3333333333333333UL, x9);
8181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x2222222222222222UL, x8);
8182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000000000UL, x7);
8183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3333333333333333UL, x6);
8184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1111111111111111UL, x5);
8185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x2222222222222222UL, x4);
8186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w13);
8188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x33333333U, w12);
8189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00000000U, w11);
8190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x22222222U, w10);
8191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w17);
8192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00000000U, w16);
8193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x33333333U, w15);
8194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x22222222U, w14);
8195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w18);
8197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w19);
8198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w20);
8199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w21);
8200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3333333333333333UL, x22);
8201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000000000000UL, x23);
8202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3333333333333333UL, x24);
8204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3333333333333333UL, x26);
8205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x33333333U, w25);
8207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00000000U, w27);
8208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x22222222U, w28);
8209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x33333333U, w29);
8210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(noreg) {
8215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test doesn't generate any code, but it verifies some invariants
8216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // related to NoReg.
8217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoReg.Is(NoFPReg));
8218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoFPReg.Is(NoReg));
8219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoReg.Is(NoCPUReg));
8220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoCPUReg.Is(NoReg));
8221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoFPReg.Is(NoCPUReg));
8222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoCPUReg.Is(NoFPReg));
8223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoReg.IsNone());
8225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoFPReg.IsNone());
8226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(NoCPUReg.IsNone());
8227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(isvalid) {
8231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test doesn't generate any code, but it verifies some invariants
8232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // related to IsValid().
8233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!NoReg.IsValid());
8234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!NoFPReg.IsValid());
8235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!NoCPUReg.IsValid());
8236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(x0.IsValid());
8238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(w0.IsValid());
8239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(x30.IsValid());
8240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(w30.IsValid());
8241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(xzr.IsValid());
8242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(wzr.IsValid());
8243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(sp.IsValid());
8245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(wsp.IsValid());
8246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(d0.IsValid());
8248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(s0.IsValid());
8249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(d31.IsValid());
8250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(s31.IsValid());
8251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(x0.IsValidRegister());
8253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(w0.IsValidRegister());
8254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(xzr.IsValidRegister());
8255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(wzr.IsValidRegister());
8256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(sp.IsValidRegister());
8257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(wsp.IsValidRegister());
8258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!x0.IsValidFPRegister());
8259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!w0.IsValidFPRegister());
8260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!xzr.IsValidFPRegister());
8261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!wzr.IsValidFPRegister());
8262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!sp.IsValidFPRegister());
8263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!wsp.IsValidFPRegister());
8264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(d0.IsValidFPRegister());
8266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(s0.IsValidFPRegister());
8267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!d0.IsValidRegister());
8268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!s0.IsValidRegister());
8269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test the same as before, but using CPURegister types. This shouldn't make
8271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // any difference.
8272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(x0).IsValid());
8273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(w0).IsValid());
8274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(x30).IsValid());
8275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(w30).IsValid());
8276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(xzr).IsValid());
8277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(wzr).IsValid());
8278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(sp).IsValid());
8280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(wsp).IsValid());
8281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(d0).IsValid());
8283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(s0).IsValid());
8284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(d31).IsValid());
8285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(s31).IsValid());
8286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(x0).IsValidRegister());
8288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(w0).IsValidRegister());
8289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(xzr).IsValidRegister());
8290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(wzr).IsValidRegister());
8291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(sp).IsValidRegister());
8292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(wsp).IsValidRegister());
8293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!static_cast<CPURegister>(x0).IsValidFPRegister());
8294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!static_cast<CPURegister>(w0).IsValidFPRegister());
8295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!static_cast<CPURegister>(xzr).IsValidFPRegister());
8296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!static_cast<CPURegister>(wzr).IsValidFPRegister());
8297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!static_cast<CPURegister>(sp).IsValidFPRegister());
8298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!static_cast<CPURegister>(wsp).IsValidFPRegister());
8299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(d0).IsValidFPRegister());
8301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(static_cast<CPURegister>(s0).IsValidFPRegister());
8302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!static_cast<CPURegister>(d0).IsValidRegister());
8303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(!static_cast<CPURegister>(s0).IsValidRegister());
8304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(printf) {
8308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifdef USE_SIMULATOR
8309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // These tests only run when the debugger is requested.
8310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (Cctest::run_debugger()) {
8311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif
8312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  char const * test_plain_string = "Printf with no arguments.\n";
8316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  char const * test_substring = "'This is a substring.'";
8317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump before;
8318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize x29 to the value of the stack pointer. We will use x29 as a
8320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // temporary stack pointer later, and initializing it in this way allows the
8321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // RegisterDump check to pass.
8322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, __ StackPointer());
8323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test simple integer arguments.
8325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1234);
8326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1234);
8327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test simple floating-point arguments.
8329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d0, 1.234);
8330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test pointer (string) arguments.
8332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(test_substring));
8333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test the maximum number of arguments, and sign extension.
8335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, 0xffffffff);
8336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, 0xffffffff);
8337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 0xffffffffffffffff);
8338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x6, 0xffffffffffffffff);
8339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.234);
8340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 2.345);
8341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d3, 3.456);
8342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d4, 4.567);
8343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test printing callee-saved registers.
8345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, 0x123456789abcdef);
8346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 42.0);
8347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test with three arguments.
8349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, 3);
8350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x11, 40);
8351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x12, 500);
8352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that we don't clobber any registers, except those that we explicitly
8354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // write results into.
8355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  before.Dump(&masm);
8356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf(test_plain_string);   // NOLINT(runtime/printf)
8358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("x0: %" PRId64", x1: 0x%08" PRIx64 "\n", x0, x1);
8359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("d0: %f\n", d0);
8360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("Test %%s: %s\n", x2);
8361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n"
8362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n",
8363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            w3, w4, x5, x6);
8364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4);
8365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("0x%08" PRIx32 ", 0x%016" PRIx64 "\n", x28, x28);
8366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("%g\n", d10);
8367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test with a different stack pointer.
8369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register old_stack_pointer = __ StackPointer();
8370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ mov(x29, old_stack_pointer);
8371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(x29);
8372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("old_stack_pointer: 0x%016" PRIx64 "\n", old_stack_pointer);
8373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ mov(old_stack_pointer, __ StackPointer());
8374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(old_stack_pointer);
8375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("3=%u, 4=%u, 5=%u\n", x10, x11, x12);
8377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We cannot easily test the output of the Printf sequences, and because
8382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Printf preserves all registers by default, we can't look at the number of
8383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // bytes that were printed. However, the printf_no_preserve test should check
8384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // that, and here we just test that we didn't clobber any registers.
8385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_REGISTERS(before);
8386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifdef USE_SIMULATOR
8389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif
8391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(printf_no_preserve) {
8395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifdef USE_SIMULATOR
8396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // These tests only run when the debugger is requested.
8397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (Cctest::run_debugger()) {
8398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif
8399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  char const * test_plain_string = "Printf with no arguments.\n";
8403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  char const * test_substring = "'This is a substring.'";
8404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve(test_plain_string);
8406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, x0);
8407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test simple integer arguments.
8409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1234);
8410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1234);
8411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("x0: %" PRId64", x1: 0x%08" PRIx64 "\n", x0, x1);
8412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, x0);
8413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test simple floating-point arguments.
8415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d0, 1.234);
8416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("d0: %f\n", d0);
8417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, x0);
8418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test pointer (string) arguments.
8420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(test_substring));
8421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("Test %%s: %s\n", x2);
8422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, x0);
8423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test the maximum number of arguments, and sign extension.
8425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, 0xffffffff);
8426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, 0xffffffff);
8427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 0xffffffffffffffff);
8428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x6, 0xffffffffffffffff);
8429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n"
8430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                      "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n",
8431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                      w3, w4, x5, x6);
8432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, x0);
8433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.234);
8435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 2.345);
8436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d3, 3.456);
8437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d4, 4.567);
8438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4);
8439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, x0);
8440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test printing callee-saved registers.
8442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, 0x123456789abcdef);
8443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("0x%08" PRIx32 ", 0x%016" PRIx64 "\n", x28, x28);
8444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, x0);
8445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 42.0);
8447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("%g\n", d10);
8448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, x0);
8449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test with a different stack pointer.
8451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register old_stack_pointer = __ StackPointer();
8452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, old_stack_pointer);
8453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(x29);
8454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("old_stack_pointer: 0x%016" PRIx64 "\n",
8456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                      old_stack_pointer);
8457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, x0);
8458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(old_stack_pointer, __ StackPointer());
8460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(old_stack_pointer);
8461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test with three arguments.
8463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 3);
8464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 40);
8465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 500);
8466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("3=%u, 4=%u, 5=%u\n", x3, x4, x5);
8467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, x0);
8468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We cannot easily test the exact output of the Printf sequences, but we can
8473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // use the return code to check that the string length was correct.
8474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Printf with no arguments.
8476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(strlen(test_plain_string), x19);
8477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // x0: 1234, x1: 0x00001234
8478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(25, x20);
8479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // d0: 1.234000
8480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(13, x21);
8481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test %s: 'This is a substring.'
8482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(32, x22);
8483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // w3(uint32): 4294967295
8484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // w4(int32): -1
8485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // x5(uint64): 18446744073709551615
8486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // x6(int64): -1
8487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(23 + 14 + 33 + 14, x23);
8488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // %f: 1.234000
8489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // %g: 2.345
8490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // %e: 3.456000e+00
8491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // %E: 4.567000E+00
8492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(13 + 10 + 17 + 17, x24);
8493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // 0x89abcdef, 0x0123456789abcdef
8494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(31, x25);
8495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // 42
8496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x26);
8497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // old_stack_pointer: 0x00007fb037ae2370
8498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Note: This is an example value, but the field width is fixed here so the
8499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // string length is still predictable.
8500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(38, x27);
8501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // 3=3, 4=40, 5=500
8502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(17, x28);
8503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifdef USE_SIMULATOR
8506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif
8508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifndef USE_SIMULATOR
8512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(trace) {
8513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The Trace helper should not generate any code unless the simulator (or
8514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // debugger) is being used.
8515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label start;
8519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&start);
8520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Trace(LOG_ALL, TRACE_ENABLE);
8521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Trace(LOG_ALL, TRACE_DISABLE);
8522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
8523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif
8528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifndef USE_SIMULATOR
8531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(log) {
8532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The Log helper should not generate any code unless the simulator (or
8533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // debugger) is being used.
8534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label start;
8538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&start);
8539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Log(LOG_ALL);
8540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
8541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif
8546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(instruction_accurate_scope) {
8549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // By default macro instructions are allowed.
8553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT(masm.AllowMacroInstructions());
8554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
8555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    InstructionAccurateScope scope1(&masm);
8556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT(!masm.AllowMacroInstructions());
8557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    {
8558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      InstructionAccurateScope scope2(&masm);
8559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT(!masm.AllowMacroInstructions());
8560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT(!masm.AllowMacroInstructions());
8562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT(masm.AllowMacroInstructions());
8564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
8566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    InstructionAccurateScope scope(&masm, 2);
8567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ add(x0, x0, x0);
8568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ sub(x0, x0, x0);
8569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(blr_lr) {
8578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // A simple test to check that the simulator correcty handle "blr lr".
8579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label target;
8583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label end;
8584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
8586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(lr, &target);
8587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Blr(lr);
8589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xdeadbeef);
8590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&end);
8591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&target);
8593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xc001c0de);
8594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&end);
8596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xc001c0de, x0);
8601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8605f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8606f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(barriers) {
8607f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Generate all supported barriers, this is just a smoke test
8608f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
8609f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8610f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
8611f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8612f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // DMB
8613f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(FullSystem, BarrierAll);
8614f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(FullSystem, BarrierReads);
8615f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(FullSystem, BarrierWrites);
8616f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(FullSystem, BarrierOther);
8617f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8618f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(InnerShareable, BarrierAll);
8619f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(InnerShareable, BarrierReads);
8620f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(InnerShareable, BarrierWrites);
8621f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(InnerShareable, BarrierOther);
8622f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8623f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(NonShareable, BarrierAll);
8624f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(NonShareable, BarrierReads);
8625f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(NonShareable, BarrierWrites);
8626f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(NonShareable, BarrierOther);
8627f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8628f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(OuterShareable, BarrierAll);
8629f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(OuterShareable, BarrierReads);
8630f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(OuterShareable, BarrierWrites);
8631f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(OuterShareable, BarrierOther);
8632f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8633f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // DSB
8634f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(FullSystem, BarrierAll);
8635f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(FullSystem, BarrierReads);
8636f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(FullSystem, BarrierWrites);
8637f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(FullSystem, BarrierOther);
8638f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8639f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(InnerShareable, BarrierAll);
8640f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(InnerShareable, BarrierReads);
8641f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(InnerShareable, BarrierWrites);
8642f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(InnerShareable, BarrierOther);
8643f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8644f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(NonShareable, BarrierAll);
8645f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(NonShareable, BarrierReads);
8646f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(NonShareable, BarrierWrites);
8647f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(NonShareable, BarrierOther);
8648f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8649f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(OuterShareable, BarrierAll);
8650f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(OuterShareable, BarrierReads);
8651f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(OuterShareable, BarrierWrites);
8652f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(OuterShareable, BarrierOther);
8653f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8654f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // ISB
8655f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Isb();
8656f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8657f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
8658f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8659f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
8660f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8661f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
8662f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
8663f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}  // namespace vixl
8665