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.
1541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl#define SETUP_SIZE(size)                                                       \
1551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  size_t buf_size = size;                                                      \
156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  byte* buf = new byte[buf_size];                                              \
157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  MacroAssembler masm(buf, buf_size);                                          \
158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump core;                                                           \
159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CPU::SetUp()
160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define START()                                                                \
162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.Reset();                                                                \
163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushCalleeSavedRegisters()
164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define END()                                                                  \
166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  core.Dump(&masm);                                                            \
167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopCalleeSavedRegisters();                                                \
168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ret();                                                                    \
169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.FinalizeCode()
170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define RUN()                                                                  \
1721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  CPU::EnsureIAndDCacheCoherency(buf, buf_size);                               \
173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {                                                                            \
174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    void (*test_function)(void);                                               \
1751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(sizeof(buf) == sizeof(test_function));                         \
176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    memcpy(&test_function, &buf, sizeof(buf));                                 \
177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    test_function();                                                           \
178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define TEARDOWN()                                                             \
181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  delete[] buf;
182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif  // ifdef USE_SIMULATOR.
184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_NZCV(expected)                                            \
186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualNzcv(expected, core.flags_nzcv()))
187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_REGISTERS(expected)                                       \
189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualRegisters(&expected, &core))
190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_32(expected, result)                                      \
192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(Equal32(static_cast<uint32_t>(expected), &core, result))
193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_FP32(expected, result)                                    \
195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualFP32(expected, &core, result))
196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_64(expected, result)                                      \
198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(Equal64(expected, &core, result))
199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_FP64(expected, result)                                    \
201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualFP64(expected, &core, result))
202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_LITERAL_POOL_SIZE(expected)                                     \
204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert((expected) == (__ LiteralPoolSize()))
205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(stack_ops) {
208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // save sp.
212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, sp);
213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the sp to a known value.
215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, 0x1004);
216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, sp);
217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Add immediate to the sp, and move the result to a normal register.
2191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Add(sp, sp, 0x50);
220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, sp);
221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Add extended to the sp, and move the result to a normal register.
223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 0xfff);
224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(sp, sp, Operand(x17, SXTB));
225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, sp);
226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Create an sp using a logical instruction, and move to normal register.
2281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(sp, xzr, 0x1fff);
229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, sp);
230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Write wsp using a logical instruction.
2321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(wsp, wzr, 0xfffffff8);
233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, sp);
234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Write sp, and read back wsp.
2361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(sp, xzr, 0xfffffff8);
237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, wsp);
238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  restore sp.
240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x29);
241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1004, x0);
246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1054, x1);
247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1053, x2);
248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1fff, x3);
249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff8, x4);
250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff8, x5);
251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mvn) {
257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w0, 0xfff);
261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x1, 0xfff);
262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w2, Operand(w0, LSL, 1));
263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x3, Operand(x1, LSL, 2));
264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w4, Operand(w0, LSR, 3));
265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x5, Operand(x1, LSR, 4));
266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w6, Operand(w0, ASR, 11));
267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x7, Operand(x1, ASR, 12));
268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w8, Operand(w0, ROR, 13));
269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x9, Operand(x1, ROR, 14));
270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w10, Operand(w2, UXTB));
271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x11, Operand(x2, SXTB, 1));
272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w12, Operand(w2, UXTH, 2));
273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x13, Operand(x2, SXTH, 3));
274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x14, Operand(w2, UXTW, 4));
275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x15, Operand(w2, SXTW, 4));
276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff000, x0);
2811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffff000, x1);
282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00001fff, x2);
2831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000003fff, x3);
284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xe00001ff, x4);
2851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0000000000000ff, x5);
286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x6);
2871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x7);
288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ff80000, x8);
2891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3ffc000000000000, x9);
290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff00, x10);
2911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000001, x11);
292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff8003, x12);
2931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff0007, x13);
2941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffe000f, x14);
2951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffe000f, x15);
296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
301f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(mov_imm_w) {
302f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
303f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
304f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w0, 0xffffffff);
3061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w1, 0xffff1234);
3071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w2, 0x1234ffff);
3081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w3, 0x00000000);
3091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w4, 0x00001234);
3101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w5, 0x12340000);
3111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w6, 0x12345678);
312f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
313f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
314f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
315f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff, x0);
3171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff1234, x1);
3181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffff, x2);
3191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000, x3);
3201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00001234, x4);
3211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x12340000, x5);
3221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x12345678, x6);
323f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
324f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
325f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
326f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
327f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
328f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(mov_imm_x) {
329f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
330f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
331f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
3331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffff1234);
3341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xffffffff12345678);
3351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, 0xffff1234ffff5678);
3361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x4, 0x1234ffffffff5678);
3371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x5, 0x1234ffff5678ffff);
3381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x6, 0x12345678ffffffff);
3391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x7, 0x1234ffffffffffff);
3401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x8, 0x123456789abcffff);
3411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x9, 0x12345678ffff9abc);
3421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x10, 0x1234ffff56789abc);
3431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x11, 0xffff123456789abc);
3441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x12, 0x0000000000000000);
3451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x13, 0x0000000000001234);
3461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x14, 0x0000000012345678);
3471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x15, 0x0000123400005678);
3481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0x1234000000005678);
3491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0x1234000056780000);
3501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x20, 0x1234567800000000);
3511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, 0x1234000000000000);
3521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, 0x123456789abc0000);
3531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x23, 0x1234567800009abc);
3541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0x1234000056789abc);
3551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x25, 0x0000123456789abc);
3561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x26, 0x123456789abcdef0);
3571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x27, 0xffff000000000001);
3581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x28, 0x8000ffff00000000);
3591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
3601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
3611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
3621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
3631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff1234, x1);
3641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff12345678, x2);
3651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff1234ffff5678, x3);
3661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffffffff5678, x4);
3671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffff5678ffff, x5);
3681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x12345678ffffffff, x6);
3691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffffffffffff, x7);
3701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x123456789abcffff, x8);
3711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x12345678ffff9abc, x9);
3721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffff56789abc, x10);
3731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff123456789abc, x11);
3741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x12);
3751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000001234, x13);
3761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000012345678, x14);
3771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000123400005678, x15);
3781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234000000005678, x18);
3791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234000056780000, x19);
3801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567800000000, x20);
3811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234000000000000, x21);
3821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x123456789abc0000, x22);
3831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567800009abc, x23);
3841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234000056789abc, x24);
3851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000123456789abc, x25);
3861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x123456789abcdef0, x26);
3871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff000000000001, x27);
3881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000ffff00000000, x28);
389f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
390f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
391f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
392f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
393f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
394f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mov) {
396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
4001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffffffff);
4011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xffffffffffffffff);
4021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, 0xffffffffffffffff);
403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x0123456789abcdef);
405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ movz(x1, UINT64_C(0xabcd) << 16);
4071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ movk(x2, UINT64_C(0xabcd) << 32);
4081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ movn(x3, UINT64_C(0xabcd) << 48);
409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x4, 0x0123456789abcdef);
411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, x4);
412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, -1);
414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test that moves back to the same register have the desired effect. This
416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // is a no-op for X registers, and a truncation for W registers.
4171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x7, 0x0123456789abcdef);
418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x7, x7);
4191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x8, 0x0123456789abcdef);
420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w8, w8);
4211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x9, 0x0123456789abcdef);
422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x9, Operand(x9));
4231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x10, 0x0123456789abcdef);
424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w10, Operand(w10));
425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w11, 0xfff);
427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x12, 0xfff);
428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w13, Operand(w11, LSL, 1));
429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x14, Operand(x12, LSL, 2));
430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w15, Operand(w11, LSR, 3));
431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, Operand(x12, LSR, 4));
432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w19, Operand(w11, ASR, 11));
433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, Operand(x12, ASR, 12));
434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, Operand(w11, ROR, 13));
435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, Operand(x12, ROR, 14));
436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w23, Operand(w13, UXTB));
437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, Operand(x13, SXTB, 1));
438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w25, Operand(w13, UXTH, 2));
439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, Operand(x13, SXTH, 3));
440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, Operand(w13, UXTW, 4));
441f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x28, 0x0123456789abcdef);
443f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w28, w28, kDiscardForSameWReg);
444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x0);
4491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000abcd0000, x1);
4501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffabcdffffffff, x2);
4511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x5432ffffffffffff, x3);
452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x4, x5);
453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(-1, w6);
4541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x7);
4551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_32(0x89abcdef, w8);
4561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x9);
4571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_32(0x89abcdef, w10);
458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000fff, x11);
4591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000fff, x12);
460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00001ffe, x13);
4611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000003ffc, x14);
462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000001ff, x15);
4631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000000000ff, x18);
464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x19);
4651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x20);
466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ff80000, x21);
4671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3ffc000000000000, x22);
468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000fe, x23);
4691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffc, x24);
470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00007ff8, x25);
4711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000fff0, x26);
4721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000001ffe0, x27);
4731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x28);
474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orr) {
480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xf0f0);
484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x2, x0, Operand(x1));
487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w3, w0, Operand(w1, LSL, 28));
488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x4, x0, Operand(x1, LSL, 32));
489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x5, x0, Operand(x1, LSR, 4));
490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w6, w0, Operand(w1, ASR, 4));
491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x7, x0, Operand(x1, ASR, 4));
492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w8, w0, Operand(w1, ROR, 12));
493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x9, x0, Operand(x1, ROR, 12));
4941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(w10, w0, 0xf);
4951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(x11, x0, 0xf0000000f0000000);
496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000f000f0ff, x2);
501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf000f0f0, x3);
5021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf00000ff0000f0f0, x4);
5031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000f00f0ff, x5);
504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff00f0ff, x6);
5051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000f00f0ff, x7);
506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0ffff0f0, x8);
5071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0ff00000000ff0f0, x9);
5081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000f0ff, x10);
5091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0000000f000f0f0, x11);
510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orr_extend) {
516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
5201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008080);
521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w6, w0, Operand(w1, UXTB));
522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x7, x0, Operand(x1, UXTH, 1));
523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w8, w0, Operand(w1, UXTW, 2));
524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x9, x0, Operand(x1, UXTX, 3));
525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w10, w0, Operand(w1, SXTB));
526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x11, x0, Operand(x1, SXTH, 1));
527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x12, x0, Operand(x1, SXTW, 2));
528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x13, x0, Operand(x1, SXTX, 3));
529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000081, x6);
5341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000010101, x7);
535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00020201, x8);
5361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000400040401, x9);
5371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffff81, x10);
5381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff0101, x11);
5391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00020201, x12);
5401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000400040401, x13);
541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bitwise_wide_imm) {
547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
5511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xf0f0f0f0f0f0f0f0);
552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(x10, x0, 0x1234567890abcdef);
5541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(w11, w1, 0x90abcdef);
555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
5601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0f0f0f0f0f0f0f0, x1);
5611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x10);
5621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000f0fbfdff, x11);
563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orn) {
569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xf0f0);
573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x2, x0, Operand(x1));
576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w3, w0, Operand(w1, LSL, 4));
577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x4, x0, Operand(x1, LSL, 4));
578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x5, x0, Operand(x1, LSR, 1));
579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w6, w0, Operand(w1, ASR, 1));
580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x7, x0, Operand(x1, ASR, 1));
581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w8, w0, Operand(w1, ROR, 16));
582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x9, x0, Operand(x1, ROR, 16));
5831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orn(w10, w0, 0x0000ffff);
5841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orn(x11, x0, 0x0000ffff0000ffff);
585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff0ffffff0, x2);
590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff0ff, x3);
5911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffff0fffff0ff, x4);
5921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff87fffff0, x5);
593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x07fffff0, x6);
5941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff87fffff0, x7);
595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff00ffff, x8);
5961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xff00ffffffffffff, x9);
597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff0f0, x10);
5981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff0000fffff0f0, x11);
599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orn_extend) {
605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
6091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w6, w0, Operand(w1, UXTB));
611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x7, x0, Operand(x1, UXTH, 1));
612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w8, w0, Operand(w1, UXTW, 2));
613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x9, x0, Operand(x1, UXTX, 3));
614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w10, w0, Operand(w1, SXTB));
615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x11, x0, Operand(x1, SXTH, 1));
616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x12, x0, Operand(x1, SXTW, 2));
617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x13, x0, Operand(x1, SXTX, 3));
618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff7f, x6);
6231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffefefd, x7);
624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffdfdfb, x8);
6251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7, x9);
626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007f, x10);
6271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000fefd, x11);
6281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001fffdfdfb, x12);
6291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7, x13);
630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(and_) {
636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x2, x0, Operand(x1));
643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w3, w0, Operand(w1, LSL, 4));
644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x4, x0, Operand(x1, LSL, 4));
645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x5, x0, Operand(x1, LSR, 1));
646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w6, w0, Operand(w1, ASR, 20));
647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x7, x0, Operand(x1, ASR, 20));
648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w8, w0, Operand(w1, ROR, 28));
649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x9, x0, Operand(x1, ROR, 28));
650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w10, w0, Operand(0xff00));
651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x11, x0, Operand(0xff));
652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x2);
657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x3);
658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x4);
659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000070, x5);
660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x6);
661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000f00, x7);
662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x8);
663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x9);
664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x10);
665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x11);
666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(and_extend) {
672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
6761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w6, w0, Operand(w1, UXTB));
678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x7, x0, Operand(x1, UXTH, 1));
679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w8, w0, Operand(w1, UXTW, 2));
680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x9, x0, Operand(x1, UXTX, 3));
681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w10, w0, Operand(w1, SXTB));
682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x11, x0, Operand(x1, SXTH, 1));
683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x12, x0, Operand(x1, SXTW, 2));
684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x13, x0, Operand(x1, SXTX, 3));
685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000081, x6);
6901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000010102, x7);
691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00020204, x8);
6921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000400040408, x9);
693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff81, x10);
6941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff0102, x11);
6951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00020204, x12);
6961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000400040408, x13);
697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ands) {
703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
707f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w1, Operand(w1));
708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf00000ff, x0);
714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
718f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(w1, LSR, 4));
719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x8000000000000000);
728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x00000001);
729f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(x0, x0, Operand(x1, ROR, 1));
730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
7351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x0);
736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
739f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(0xf));
740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xff000000);
749f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(0x80000000));
750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x0);
756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bic) {
762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x2, x0, Operand(x1));
769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w3, w0, Operand(w1, LSL, 4));
770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x4, x0, Operand(x1, LSL, 4));
771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x5, x0, Operand(x1, LSR, 1));
772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w6, w0, Operand(w1, ASR, 20));
773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x7, x0, Operand(x1, ASR, 20));
774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w8, w0, Operand(w1, ROR, 28));
775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x9, x0, Operand(x1, ROR, 24));
776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x10, x0, Operand(0x1f));
777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x11, x0, Operand(0x100));
778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test bic into sp when the constant cannot be encoded in the immediate
780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // field.
781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Use x20 to preserve sp. We check for the result via x21 because the
782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // test infrastructure requires that sp be restored to its original value.
783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, sp);
784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffff);
785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(sp, x0, Operand(0xabcdef));
786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, sp);
787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x20);
788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x2);
793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x3);
794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x4);
795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff80, x5);
796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x6);
797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f0f0, x7);
798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x8);
799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x9);
800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ffe0, x10);
801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000fef0, x11);
802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x543210, x21);
804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bic_extend) {
810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
8141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w6, w0, Operand(w1, UXTB));
816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x7, x0, Operand(x1, UXTH, 1));
817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w8, w0, Operand(w1, UXTW, 2));
818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x9, x0, Operand(x1, UXTX, 3));
819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w10, w0, Operand(w1, SXTB));
820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x11, x0, Operand(x1, SXTH, 1));
821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x12, x0, Operand(x1, SXTW, 2));
822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x13, x0, Operand(x1, SXTX, 3));
823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff7e, x6);
8281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffefefd, x7);
829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffdfdfb, x8);
8301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7, x9);
831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007e, x10);
8321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000fefd, x11);
8331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001fffdfdfb, x12);
8341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7, x13);
835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bics) {
841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xffff);
845f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(w0, w1, Operand(w1));
846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffffff);
855f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(w0, w0, Operand(w0, LSR, 1));
856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x0);
862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x8000000000000000);
865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x00000001);
866f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(x0, x0, Operand(x1, ROR, 1));
867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
8761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bics(x0, x0, 0x7fffffffffffffff);
877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
8821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x0);
883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0xffff0000);
8861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bics(w0, w0, 0xfffffff0);
887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eor) {
899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x2, x0, Operand(x1));
906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w3, w0, Operand(w1, LSL, 4));
907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x4, x0, Operand(x1, LSL, 4));
908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x5, x0, Operand(x1, LSR, 1));
909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w6, w0, Operand(w1, ASR, 20));
910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x7, x0, Operand(x1, ASR, 20));
911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w8, w0, Operand(w1, ROR, 28));
912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x9, x0, Operand(x1, ROR, 28));
9131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Eor(w10, w0, 0xff00ff00);
9141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Eor(x11, x0, 0xff00ff00ff00ff00);
915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
9191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000f000ff0f, x2);
920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x3);
9211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000f0000f000, x4);
9221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000007800ff8f, x5);
923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff00f0, x6);
9241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000f0f0, x7);
925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f00f, x8);
9261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000ff00000ffff, x9);
927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff0000f0, x10);
9281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xff00ff00ff0000f0, x11);
929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eor_extend) {
934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
9371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x1111111111111111);
9381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w6, w0, Operand(w1, UXTB));
940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x7, x0, Operand(x1, UXTH, 1));
941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w8, w0, Operand(w1, UXTW, 2));
942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x9, x0, Operand(x1, UXTX, 3));
943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w10, w0, Operand(w1, SXTB));
944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x11, x0, Operand(x1, SXTH, 1));
945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x12, x0, Operand(x1, SXTW, 2));
946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x13, x0, Operand(x1, SXTX, 3));
947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x11111190, x6);
9521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1111111111101013, x7);
953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x11131315, x8);
9541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1111111511151519, x9);
955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeee90, x10);
9561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeeeeeee1013, x11);
9571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeef11131315, x12);
9581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1111111511151519, x13);
959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eon) {
965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x2, x0, Operand(x1));
972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w3, w0, Operand(w1, LSL, 4));
973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x4, x0, Operand(x1, LSL, 4));
974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x5, x0, Operand(x1, LSR, 1));
975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w6, w0, Operand(w1, ASR, 20));
976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x7, x0, Operand(x1, ASR, 20));
977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w8, w0, Operand(w1, ROR, 28));
978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x9, x0, Operand(x1, ROR, 28));
9791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Eon(w10, w0, 0x03c003c0);
9801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Eon(x11, x0, 0x0000100000001000);
981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
9851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff0fff00f0, x2);
986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff0fff, x3);
9871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffff0ffff0fff, x4);
9881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff87ff0070, x5);
989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff0f, x6);
9901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff0f0f, x7);
991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff0ff0, x8);
9921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffff00fffff0000, x9);
993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfc3f03cf, x10);
9941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffefffffff100f, x11);
995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eon_extend) {
1001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
10041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x1111111111111111);
10051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
1006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w6, w0, Operand(w1, UXTB));
1007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x7, x0, Operand(x1, UXTH, 1));
1008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w8, w0, Operand(w1, UXTW, 2));
1009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x9, x0, Operand(x1, UXTX, 3));
1010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w10, w0, Operand(w1, SXTB));
1011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x11, x0, Operand(x1, SXTH, 1));
1012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x12, x0, Operand(x1, SXTW, 2));
1013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x13, x0, Operand(x1, SXTX, 3));
1014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeee6f, x6);
10191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeeeeeefefec, x7);
1020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeececea, x8);
10211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeeaeeeaeae6, x9);
1022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1111116f, x10);
10231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x111111111111efec, x11);
10241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x11111110eeececea, x12);
10251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeeaeeeaeae6, x13);
1026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mul) {
1032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
10381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w0, w16, w16);
1041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w1, w16, w17);
1042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w2, w17, w18);
1043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w3, w18, w19);
1044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x4, x16, x16);
1045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x5, x17, x18);
1046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x6, x18, x19);
1047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x7, x19, x19);
1048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smull(x8, w17, w18);
1049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smull(x9, w18, w18);
1050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smull(x10, w19, w19);
1051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w11, w16, w16);
1052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w12, w16, w17);
1053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w13, w17, w18);
1054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w14, w18, w19);
1055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x20, x16, x16);
1056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x21, x17, x18);
1057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x22, x18, x19);
1058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x23, x19, x19);
1059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x3);
1067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x4);
1068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x5);
10691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000001, x6);
1070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
10711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x8);
1072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
1073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
1074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
1075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
1077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x14);
1078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x20);
10791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000001, x21);
1080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x22);
10811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x23);
1082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1087f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void SmullHelper(int64_t expected, int64_t a, int64_t b) {
1088f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
1089f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
1090f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w0, a);
1091f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w1, b);
1092f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Smull(x2, w0, w1);
1093f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
1094f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
1095f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(expected, x2);
1096f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
1097f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
1098f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1099f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1100f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(smull) {
1101f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0, 0, 0);
1102f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(1, 1, 1);
1103f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(-1, -1, 1);
1104f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(1, -1, -1);
1105f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0xffffffff80000000, 0x80000000, 1);
1106f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0x0000000080000000, 0x00010000, 0x00008000);
1107f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
1108f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1109f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(madd) {
1111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
11171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w0, w16, w16, w16);
1120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w1, w16, w16, w17);
1121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w2, w16, w16, w18);
1122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w3, w16, w16, w19);
1123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w4, w16, w17, w17);
1124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w5, w17, w17, w18);
1125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w6, w17, w17, w19);
1126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w7, w17, w18, w16);
1127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w8, w17, w18, w18);
1128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w9, w18, w18, w17);
1129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w10, w18, w19, w18);
1130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w11, w19, w19, w19);
1131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x12, x16, x16, x16);
1133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x13, x16, x16, x17);
1134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x14, x16, x16, x18);
1135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x15, x16, x16, x19);
1136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x20, x16, x17, x17);
1137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x21, x17, x17, x18);
1138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x22, x17, x17, x19);
1139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x23, x17, x18, x16);
1140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x24, x17, x18, x18);
1141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x25, x18, x18, x17);
1142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x26, x18, x19, x18);
1143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x27, x19, x19, x19);
1144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
1151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
1155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x6);
1156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x7);
1157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x8);
1158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x9);
1159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x10);
1160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
1161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
11641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000ffffffff, x14);
1165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x15);
1166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x20);
11671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000100000000, x21);
1168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x22);
11691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000ffffffff, x23);
11701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001fffffffe, x24);
11711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00000002, x25);
1172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x26);
1173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x27);
1174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(msub) {
1180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
11861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w0, w16, w16, w16);
1189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w1, w16, w16, w17);
1190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w2, w16, w16, w18);
1191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w3, w16, w16, w19);
1192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w4, w16, w17, w17);
1193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w5, w17, w17, w18);
1194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w6, w17, w17, w19);
1195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w7, w17, w18, w16);
1196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w8, w17, w18, w18);
1197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w9, w18, w18, w17);
1198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w10, w18, w19, w18);
1199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w11, w19, w19, w19);
1200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x12, x16, x16, x16);
1202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x13, x16, x16, x17);
1203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x14, x16, x16, x18);
1204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x15, x16, x16, x19);
1205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x20, x16, x17, x17);
1206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x21, x17, x17, x18);
1207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x22, x17, x17, x19);
1208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x23, x17, x18, x16);
1209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x24, x17, x18, x18);
1210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x25, x18, x18, x17);
1211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x26, x18, x19, x18);
1212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x27, x19, x19, x19);
1213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
1220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x5);
1224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x6);
1225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
1226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
1227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x9);
1228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x10);
1229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
1230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
12331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000ffffffff, x14);
12341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x15);
1235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x20);
12361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000fffffffe, x21);
12371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x22);
12381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000001, x23);
1239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x24);
12401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000200000000, x25);
12411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001fffffffe, x26);
12421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x27);
1243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(smulh) {
1249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 0);
1253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 1);
12541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, 0x0000000100000000);
12551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x23, 0x0000000012345678);
12561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0x0123456789abcdef);
12571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x25, 0x0000000200000000);
12581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x26, 0x8000000000000000);
12591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x27, 0xffffffffffffffff);
12601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x28, 0x5555555555555555);
12611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x29, 0xaaaaaaaaaaaaaaaa);
1262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x0, x20, x24);
1264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x1, x21, x24);
1265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x2, x22, x23);
1266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x3, x22, x24);
1267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x4, x24, x25);
1268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x5, x23, x27);
1269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x6, x26, x26);
1270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x7, x26, x27);
1271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x8, x27, x27);
1272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x9, x28, x28);
1273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x10, x28, x29);
1274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x11, x29, x29);
1275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x2);
12821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000001234567, x3);
12831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000002468acf, x4);
12841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x5);
12851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x4000000000000000, x6);
1286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x7);
1287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
12881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1c71c71c71c71c71, x9);
12891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xe38e38e38e38e38e, x10);
12901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1c71c71c71c71c72, x11);
1291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(smaddl_umaddl) {
1297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
13011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0x00000000ffffffff);
13021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 4);
13041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, 0x0000000200000000);
1305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x9, w17, w18, x20);
1307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x10, w18, w18, x20);
1308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x11, w19, w19, x20);
1309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x12, w19, w19, x21);
1310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x13, w17, w18, x20);
1311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x14, w18, w18, x20);
1312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x15, w19, w19, x20);
1313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x22, w19, w19, x21);
1314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x9);
1319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x10);
1320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x11);
13211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000200000001, x12);
13221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000100000003, x13);
13231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00000005, x14);
13241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00000005, x15);
13251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(1, x22);
1326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(smsubl_umsubl) {
1332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
13361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0x00000000ffffffff);
13371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 4);
13391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, 0x0000000200000000);
1340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x9, w17, w18, x20);
1342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x10, w18, w18, x20);
1343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x11, w19, w19, x20);
1344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x12, w19, w19, x21);
1345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x13, w17, w18, x20);
1346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x14, w18, w18, x20);
1347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x15, w19, w19, x20);
1348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x22, w19, w19, x21);
1349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x9);
1354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x10);
1355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x11);
13561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001ffffffff, x12);
13571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000005, x13);
13581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000200000003, x14);
13591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000200000003, x15);
13601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000003ffffffff, x22);
1361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(div) {
1367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 1);
1371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 0xffffffff);
13721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0xffffffffffffffff);
1373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0x80000000);
13741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x20, 0x8000000000000000);
1375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 2);
1376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w0, w16, w16);
1378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w1, w17, w16);
1379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w2, w16, w16);
1380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w3, w16, w17);
1381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w4, w17, w18);
1382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x5, x16, x16);
1384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x6, x17, x18);
1385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x7, x16, x16);
1386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x8, x16, x17);
1387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x9, x17, x18);
1388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w10, w19, w21);
1390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w11, w19, w21);
1391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x12, x19, x21);
1392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x13, x19, x21);
1393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x14, x20, x21);
1394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x15, x20, x21);
1395f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1396f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(w22, w19, w17);
1397f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(w23, w19, w17);
1398f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x24, x20, x18);
1399f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x25, x20, x18);
1400f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1401f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x26, x16, x21);
1402f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x27, x16, x21);
1403f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x28, x18, x21);
1404f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x29, x18, x21);
1405f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1406f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x17, 0);
1407f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(w18, w16, w17);
1408f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(w19, w16, w17);
1409f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x20, x16, x17);
1410f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x21, x16, x17);
1411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
1416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x1);
1417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
1418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x5);
1421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x6);
1422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
1423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
14241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000001, x9);
1425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x40000000, x10);
1426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xC0000000, x11);
14271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000040000000, x12);
14281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000040000000, x13);
14291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x4000000000000000, x14);
14301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xC000000000000000, x15);
1431f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x22);
1432f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x23);
1433f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x24);
14341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x25);
1435f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x26);
1436f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x27);
14371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x28);
1438f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x29);
1439f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x18);
1440f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x19);
1441f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x20);
1442f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x21);
1443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(rbit_rev) {
1449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
14521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0xfedcba9876543210);
1453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rbit(w0, w24);
1454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rbit(x1, x24);
1455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev16(w2, w24);
1456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev16(x3, x24);
1457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev(w4, w24);
1458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev32(x5, x24);
1459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev(x6, x24);
1460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x084c2a6e, x0);
14651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x084c2a6e195d3b7f, x1);
1466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x54761032, x2);
14671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xdcfe98ba54761032, x3);
1468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x10325476, x4);
14691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x98badcfe10325476, x5);
14701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1032547698badcfe, x6);
1471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(clz_cls) {
1477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
14801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0x0008000000800000);
14811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x25, 0xff800000fff80000);
1482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, 0);
1483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w0, w24);
1484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x1, x24);
1485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w2, w25);
1486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x3, x25);
1487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w4, w26);
1488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x5, x26);
1489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w6, w24);
1490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x7, x24);
1491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w8, w25);
1492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x9, x25);
1493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w10, w26);
1494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x11, x26);
1495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(8, x0);
1500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(12, x1);
1501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x2);
1502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
1503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(32, x4);
1504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(64, x5);
1505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(7, x6);
1506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(11, x7);
1507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(12, x8);
1508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(8, x9);
1509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(31, x10);
1510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(63, x11);
1511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(label) {
1517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label label_1, label_2, label_3, label_4;
1520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x1);
1523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0);
1524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, lr);    // Save lr.
1525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);
1527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);
1528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);     // Multiple branches to the same label.
1529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_2);
1531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_3);     // Forward branch.
1532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_1);
1534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_2);     // Backward branch.
1535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_3);
1537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&label_4);
1538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_4);
1541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1);
1542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(lr, x22);
1543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x0);
1548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x1);
1549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adr) {
1555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label label_1, label_2, label_3, label_4;
1558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);        // Set to non-zero to indicate failure.
1561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x1, &label_3);   // Set to zero to indicate success.
1562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_1);   // Multiple forward references to the same label.
1564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x3, &label_1);
1565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x4, &label_1);
1566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_2);
1568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x5, x2, Operand(x3));  // Ensure that x2,x3 and x4 are identical.
1569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x6, x2, Operand(x4));
1570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x0, x0, Operand(x5));
1571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x0, x0, Operand(x6));
1572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x2);  // label_1, label_3
1573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_3);
1575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_3);   // Self-reference (offset 0).
1576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x1, x1, Operand(x2));
1577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_4);   // Simple forward reference.
1578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x2);  // label_4
1579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_1);
1581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_3);   // Multiple reverse references to the same label.
1582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x3, &label_3);
1583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x4, &label_3);
1584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x5, &label_2);   // Simple reverse reference.
1585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x5);  // label_2
1586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_4);
1588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x0);
1593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x1);
1594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(branch_cond) {
1600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label wrong;
1603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x1);
1606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1);
16071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0x8000000000000000);
1608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // For each 'cmp' instruction below, condition codes other than the ones
1610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // following it would branch.
1611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1612578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 0);
1613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
1614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
1615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
1616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ls);
1618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lt);
1619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, le);
1620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_1;
1621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_1, ne);
1622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_1);
1624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1625578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 1);
1626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ne);
1627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
1628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
1629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hi);
1631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lt);
1632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
1633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_2;
1634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_2, pl);
1635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_2);
1637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1638578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 2);
1639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
1640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hs);
1641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, pl);
1642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hi);
1644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ge);
1645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
1646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_3;
1647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_3, vc);
1648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_3);
1650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1651578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x2, 1);
1652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
1653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
1654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
1655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vc);
1656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ls);
1657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ge);
1658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
1659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_4;
1660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_4, le);
1661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_4);
1663578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1664578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Label ok_5;
1665578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ b(&ok_5, al);
1666578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x0, 0x0);
1667578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bind(&ok_5);
1668578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1669578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Label ok_6;
1670578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ b(&ok_6, nv);
1671578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x0, 0x0);
1672578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bind(&ok_6);
1673578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&wrong);
1677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x0);
1683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(branch_to_reg) {
1689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test br.
1692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label fn1, after_fn1;
1693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, lr);
1696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
1698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&after_fn1);
1699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&fn1);
1701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, lr);
1702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 42);
1703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x0);
1704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&after_fn1);
1706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&fn1);
1707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test blr.
1709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label fn2, after_fn2;
1710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
1712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&after_fn2);
1713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&fn2);
1715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, lr);
1716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 84);
1717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Blr(x0);
1718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&after_fn2);
1720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&fn2);
1721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, lr);
1722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(lr, x29);
1724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(core.xreg(3) + kInstructionSize, x0);
1729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(42, x1);
1730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(84, x2);
1731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(compare_branch) {
1737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
1741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
1742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
1743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0);
1744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 0);
1745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 0);
1746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 42);
1748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label zt, zt_end;
1750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(w16, &zt);
1751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&zt_end);
1752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zt);
1753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
1754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zt_end);
1755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label zf, zf_end;
1757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(x17, &zf);
1758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&zf_end);
1759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zf);
1760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
1761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zf_end);
1762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nzt, nzt_end;
1764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(w17, &nzt);
1765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nzt_end);
1766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzt);
1767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 1);
1768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzt_end);
1769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nzf, nzf_end;
1771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(x16, &nzf);
1772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nzf_end);
1773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzf);
1774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 1);
1775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzf_end);
1776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0xffffffff00000000);
1778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label a, a_end;
1780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(w18, &a);
1781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&a_end);
1782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&a);
1783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 1);
1784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&a_end);
1785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label b, b_end;
1787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(w18, &b);
1788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&b_end);
1789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&b);
1790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 1);
1791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&b_end);
1792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
1798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
1800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
1801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
1803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(test_branch) {
1809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
1813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
1814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
1815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0);
18161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x16, 0xaaaaaaaaaaaaaaaa);
1817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label bz, bz_end;
1819f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Tbz(w16, 0, &bz);
1820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&bz_end);
1821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bz);
1822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
1823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bz_end);
1824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label bo, bo_end;
1826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Tbz(x16, 63, &bo);
1827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&bo_end);
1828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bo);
1829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
1830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bo_end);
1831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nbz, nbz_end;
1833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Tbnz(x16, 61, &nbz);
1834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nbz_end);
1835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbz);
1836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 1);
1837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbz_end);
1838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nbo, nbo_end;
1840f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Tbnz(w16, 2, &nbo);
1841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nbo_end);
1842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbo);
1843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 1);
1844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbo_end);
1845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
1850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
1852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
1853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(branch_type) {
18591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
18601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
18611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  Label fail, done;
18621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
18631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
18641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x0);
18651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x10, 0x7);
18661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x11, 0x0);
18671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
18681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Test non taken branches.
18691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Cmp(x10, 0x7);
18701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, ne);
18711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, never);
18721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, reg_zero, x10);
18731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, reg_not_zero, x11);
18741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, reg_bit_clear, x10, 0);
18751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, reg_bit_set, x10, 3);
18761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
18771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Test taken branches.
18781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  Label l1, l2, l3, l4, l5;
18791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Cmp(x10, 0x7);
18801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l1, eq);
18811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
18821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l1);
18831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l2, always);
18841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
18851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l2);
18861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l3, reg_not_zero, x10);
18871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
18881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l3);
18891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l4, reg_bit_clear, x10, 15);
18901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
18911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l4);
18921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l5, reg_bit_set, x10, 1);
18931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
18941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l5);
18951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
18961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&done);
18971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
18981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&fail);
18991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x1);
19001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
19011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&done);
19021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
19031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
19041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
19051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
19061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
19071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0, x0);
19081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
19091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
19101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
19111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
19121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
1913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_offset) {
1914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[2] = {0xfedcba9876543210, 0x0123456789abcdef};
1917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
1918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
1919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
1920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
1923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
1924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17));
1925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18));
1926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w1, MemOperand(x17, 4));
1927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w1, MemOperand(x18, 12));
1928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x2, MemOperand(x17, 8));
1929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x2, MemOperand(x18, 16));
1930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x17, 1));
1931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x18, 25));
1932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x17, 2));
1933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x18, 33));
1934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, x0);
1939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, dst[0]);
1940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x1);
19411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfedcba9800000000, dst[1]);
19421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x2);
19431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[2]);
1944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
1945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
1946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7654, x4);
1947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x765400, dst[4]);
1948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
1949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x18);
1950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_wide) {
1956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[8192];
1959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t dst[8192];
1960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
1961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
1962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  memset(src, 0xaa, 8192 * sizeof(src[0]));
1963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  memset(dst, 0xaa, 8192 * sizeof(dst[0]));
1964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[0] = 0;
1965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[6144] = 6144;
1966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[8191] = 8191;
1967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, src_base);
1970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, dst_base);
1971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, src_base);
1972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, dst_base);
1973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, src_base);
1974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, dst_base);
1975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x22, 8191 * sizeof(src[0])));
1977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x23, 8191 * sizeof(dst[0])));
1978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w1, MemOperand(x24, 4096 * sizeof(src[0]), PostIndex));
1979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w1, MemOperand(x25, 4096 * sizeof(dst[0]), PostIndex));
1980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x26, 6144 * sizeof(src[0]), PreIndex));
1981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x27, 6144 * sizeof(dst[0]), PreIndex));
1982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(8191, w0);
1987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(8191, dst[8191]);
1988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x22);
1989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x23);
1990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0, w1);
1991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0, dst[0]);
1992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4096 * sizeof(src[0]), x24);
1993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 4096 * sizeof(dst[0]), x25);
1994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(6144, w2);
1995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(6144, dst[6144]);
1996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 6144 * sizeof(src[0]), x26);
1997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 6144 * sizeof(dst[0]), x27);
1998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_preindex) {
2004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
20061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[2] = {0xfedcba9876543210, 0x0123456789abcdef};
2007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
2008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
2015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
2016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base + 16);
2017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base + 40);
2018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, src_base);
2019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, dst_base);
2020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, src_base);
2021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, dst_base);
2022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17, 4, PreIndex));
2023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18, 12, PreIndex));
2024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x19, 8, PreIndex));
2025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x20, 16, PreIndex));
2026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x21, -4, PreIndex));
2027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x22, -4, PreIndex));
2028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x23, 1, PreIndex));
2029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x24, 25, PreIndex));
2030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x25, 3, PreIndex));
2031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x26, 41, PreIndex));
2032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x0);
20371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfedcba9800000000, dst[1]);
20381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x1);
20391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[2]);
2040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x01234567, x2);
20411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456700000000, dst[4]);
2042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
2043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
2044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x9876, x4);
2045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x987600, dst[5]);
2046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4, x17);
2047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 12, x18);
2048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x19);
2049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 16, x20);
2050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 12, x21);
2051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 36, x22);
2052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 1, x23);
2053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 25, x24);
2054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 3, x25);
2055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 41, x26);
2056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_postindex) {
2062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
20641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[2] = {0xfedcba9876543210, 0x0123456789abcdef};
2065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
2066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base + 4);
2071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base + 12);
2072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base + 8);
2073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base + 16);
2074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base + 8);
2075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base + 32);
2076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, src_base + 1);
2077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, dst_base + 25);
2078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, src_base + 3);
2079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, dst_base + 41);
2080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17, 4, PostIndex));
2081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18, 12, PostIndex));
2082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x19, 8, PostIndex));
2083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x20, 16, PostIndex));
2084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x2, MemOperand(x21, -8, PostIndex));
2085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x2, MemOperand(x22, -32, PostIndex));
2086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x23, 1, PostIndex));
2087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x24, 5, PostIndex));
2088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x25, -3, PostIndex));
2089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x26, -41, PostIndex));
2090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x0);
20951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfedcba9800000000, dst[1]);
20961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x1);
20971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[2]);
20981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x2);
20991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[4]);
2100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
2101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
2102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x9876, x4);
2103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x987600, dst[5]);
2104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x17);
2105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 24, x18);
2106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 16, x19);
2107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 32, x20);
2108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x21);
2109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2, x23);
2111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 30, x24);
2112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x25);
2113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x26);
2114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_largeindex) {
2120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This value won't fit in the immediate offset field of ldr/str instructions.
2123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int largeoffset = 0xabcdef;
2124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int64_t data[3] = { 0x1122334455667788, 0, 0 };
21261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t base_addr = reinterpret_cast<uintptr_t>(data);
21271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t drifted_addr = base_addr - largeoffset;
2128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test checks that we we can use large immediate offsets when
2130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // using PreIndex or PostIndex addressing mode of the MacroAssembler
2131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Ldr/Str instructions.
2132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
21341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, drifted_addr);
21351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ldr(x0, MemOperand(x19, largeoffset, PreIndex));
2136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
21371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x20, base_addr);
21381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ldr(x1, MemOperand(x20, largeoffset, PostIndex));
2139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
21401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, drifted_addr);
21411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Str(x0, MemOperand(x21, largeoffset + 8, PreIndex));
2142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
21431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, base_addr + 16);
21441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Str(x0, MemOperand(x22, largeoffset, PostIndex));
2145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[0]);
2150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[1]);
2151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[2]);
2152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, x0);
2153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, x1);
2154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
21551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(base_addr, x19);
21561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(base_addr + largeoffset, x20);
21571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(base_addr + 8, x21);
21581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(base_addr + 16 + largeoffset, x22);
2159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_signed) {
2165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[2] = {0x80008080, 0x7fff7f7f};
2168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, src_base);
2172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(w0, MemOperand(x24));
2173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(w1, MemOperand(x24, 4));
2174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(w2, MemOperand(x24));
2175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(w3, MemOperand(x24, 4));
2176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(x4, MemOperand(x24));
2177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(x5, MemOperand(x24, 4));
2178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(x6, MemOperand(x24));
2179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(x7, MemOperand(x24, 4));
2180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsw(x8, MemOperand(x24));
2181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsw(x9, MemOperand(x24, 4));
2182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff80, x0);
2187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007f, x1);
2188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff8080, x2);
2189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00007f7f, x3);
21901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffff80, x4);
21911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000007f, x5);
21921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff8080, x6);
21931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000007f7f, x7);
21941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff80008080, x8);
21951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000007fff7f7f, x9);
2196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_regoffset) {
2202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[3] = {1, 2, 3};
2205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t dst[4] = {0, 0, 0, 0};
2206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, src_base + 3 * sizeof(src[0]));
2213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, dst_base + 3 * sizeof(dst[0]));
2214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base + 4 * sizeof(dst[0]));
2215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0);
2216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 4);
2217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, -4);
2218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, 0xfffffffc);  // 32-bit -4.
2219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, 0xfffffffe);  // 32-bit -2.
2220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, 0xffffffff);  // 32-bit -1.
2221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x16, x24));
2223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x16, x25));
2224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x18, x26));
2225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w3, MemOperand(x18, x27, SXTW));
2226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w4, MemOperand(x18, x28, SXTW, 2));
2227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x17, x24));
2228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x17, x25));
2229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x20, x29, SXTW, 2));
2230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
22351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000300000002, x1);
2236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x2);
2237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x3);
2238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x4);
2239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(1, dst[0]);
2240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(2, dst[1]);
2241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(3, dst[2]);
2242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(3, dst[3]);
2243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_float) {
2249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float src[3] = {1.0, 2.0, 3.0};
2252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float dst[3] = {0.0, 0.0, 0.0};
2253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
2260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
2261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base);
2262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base);
2263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s0, MemOperand(x17, sizeof(src[0])));
2264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s0, MemOperand(x18, sizeof(dst[0]), PostIndex));
2265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s1, MemOperand(x19, sizeof(src[0]), PostIndex));
2266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
2267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
2268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s2, MemOperand(x22, sizeof(dst[0])));
2269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s0);
2274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, dst[0]);
2275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
2276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, dst[2]);
2277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(3.0, s2);
2278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(3.0, dst[1]);
2279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[0]), x18);
2281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + sizeof(src[0]), x19);
2282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
2283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
2284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_double) {
2291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double src[3] = {1.0, 2.0, 3.0};
2294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double dst[3] = {0.0, 0.0, 0.0};
2295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
2302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
2303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base);
2304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base);
2305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d0, MemOperand(x17, sizeof(src[0])));
2306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d0, MemOperand(x18, sizeof(dst[0]), PostIndex));
2307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d1, MemOperand(x19, sizeof(src[0]), PostIndex));
2308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
2309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
2310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d2, MemOperand(x22, sizeof(dst[0])));
2311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d0);
2316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, dst[0]);
2317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d1);
2318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, dst[2]);
2319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(3.0, d2);
2320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(3.0, dst[1]);
2321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[0]), x18);
2323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + sizeof(src[0]), x19);
2324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
2325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
2326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_float) {
2333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float src[2] = {1.0, 2.0};
2336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float dst[3] = {0.0, 0.0, 0.0};
2337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(s31, s0, MemOperand(x16, 2 * sizeof(src[0]), PostIndex));
2344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(s0, s31, MemOperand(x17, sizeof(dst[1]), PreIndex));
2345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s31);
2350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s0);
2351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, dst[0]);
2352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, dst[1]);
2353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, dst[2]);
2354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x16);
2355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[1]), x17);
2356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_double) {
2362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double src[2] = {1.0, 2.0};
2365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double dst[3] = {0.0, 0.0, 0.0};
2366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(d31, d0, MemOperand(x16, 2 * sizeof(src[0]), PostIndex));
2373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(d0, d31, MemOperand(x17, sizeof(dst[1]), PreIndex));
2374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d31);
2379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d0);
2380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, dst[0]);
2381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, dst[1]);
2382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, dst[2]);
2383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x16);
2384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[1]), x17);
2385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_offset) {
2391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
23931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff,
23941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                     0xffeeddccbbaa9988};
2395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0};
2396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, src_base + 24);
2403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, dst_base + 56);
2404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w0, w1, MemOperand(x16));
2405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w2, w3, MemOperand(x16, 4));
2406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8));
2407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w6, w7, MemOperand(x18, -12));
2408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x8, x9, MemOperand(x18, -16));
2409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w0, w1, MemOperand(x17));
2410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w2, w3, MemOperand(x17, 8));
2411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x4, x5, MemOperand(x17, 16));
2412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w6, w7, MemOperand(x19, -24));
2413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x8, x9, MemOperand(x19, -16));
2414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
2419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
24201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[0]);
2421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
2422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
24231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xccddeeff00112233, dst[1]);
24241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x4);
24251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[2]);
24261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x5);
24271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[3]);
2428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabb, x6);
2429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xbbaa9988, x7);
24301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xbbaa99888899aabb, dst[4]);
24311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x8);
24321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[5]);
24331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x9);
24341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[6]);
2435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x16);
2436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x17);
2437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 24, x18);
2438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 56, x19);
2439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldnp_stnp_offset) {
2445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
24471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff,
24481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                     0xffeeddccbbaa9988};
2449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0};
2450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, src_base + 24);
2457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, dst_base + 56);
2458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(w0, w1, MemOperand(x16));
2459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(w2, w3, MemOperand(x16, 4));
2460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(x4, x5, MemOperand(x16, 8));
2461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(w6, w7, MemOperand(x18, -12));
2462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldnp(x8, x9, MemOperand(x18, -16));
2463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(w0, w1, MemOperand(x17));
2464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(w2, w3, MemOperand(x17, 8));
2465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(x4, x5, MemOperand(x17, 16));
2466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(w6, w7, MemOperand(x19, -24));
2467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stnp(x8, x9, MemOperand(x19, -16));
2468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
2473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
24741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[0]);
2475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
2476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
24771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xccddeeff00112233, dst[1]);
24781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x4);
24791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[2]);
24801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x5);
24811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[3]);
2482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x8899aabb, x6);
2483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xbbaa9988, x7);
24841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xbbaa99888899aabb, dst[4]);
24851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x8);
24861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[5]);
24871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x9);
24881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[6]);
2489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x16);
2490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x17);
2491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 24, x18);
2492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 56, x19);
2493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_preindex) {
2499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
25011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff,
25021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                     0xffeeddccbbaa9988};
2503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
2504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base + 16);
2511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w0, w1, MemOperand(x16, 4, PreIndex));
2512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, x16);
2513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w2, w3, MemOperand(x16, -4, PreIndex));
2514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w2, w3, MemOperand(x17, 4, PreIndex));
2515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, x17);
2516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w0, w1, MemOperand(x17, -4, PreIndex));
2517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8, PreIndex));
2518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, x16);
2519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x6, x7, MemOperand(x16, -8, PreIndex));
2520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x7, x6, MemOperand(x18, 8, PreIndex));
2521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, x18);
2522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x5, x4, MemOperand(x18, -8, PreIndex));
2523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x0);
2528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff, x1);
2529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x44556677, x2);
2530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x3);
25311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xccddeeff00112233, dst[0]);
25321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000112233, dst[1]);
25331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x4);
25341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x5);
25351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0011223344556677, x6);
25361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x7);
25371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[2]);
25381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[3]);
25391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[4]);
2540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x16);
2541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x17);
2542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 16, x18);
2543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4, x19);
2544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 4, x20);
2545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x21);
2546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 24, x22);
2547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_stp_postindex) {
2553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
25551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[4] = {0x0011223344556677, 0x8899aabbccddeeff,
25561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                     0xffeeddccbbaa9988, 0x7766554433221100};
2557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
2558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base + 16);
2565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w0, w1, MemOperand(x16, 4, PostIndex));
2566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, x16);
2567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(w2, w3, MemOperand(x16, -4, PostIndex));
2568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w2, w3, MemOperand(x17, 4, PostIndex));
2569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, x17);
2570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(w0, w1, MemOperand(x17, -4, PostIndex));
2571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8, PostIndex));
2572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, x16);
2573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldp(x6, x7, MemOperand(x16, -8, PostIndex));
2574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x7, x6, MemOperand(x18, 8, PostIndex));
2575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, x18);
2576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Stp(x5, x4, MemOperand(x18, -8, PostIndex));
2577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
2582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
2583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
2584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
25851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x4455667700112233, dst[0]);
25861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000112233, dst[1]);
25871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0011223344556677, x4);
25881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x5);
25891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x6);
25901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x7);
25911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[2]);
25921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[3]);
25931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[4]);
2594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x16);
2595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x17);
2596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 16, x18);
2597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4, x19);
2598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 4, x20);
2599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x21);
2600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 24, x22);
2601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldp_sign_extend) {
2607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[2] = {0x80000000, 0x7fffffff};
2610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, src_base);
2614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldpsw(x0, x1, MemOperand(x24));
2615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
26191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff80000000, x0);
26201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000007fffffff, x1);
2621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldur_stur) {
2627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
26291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  int64_t src[2] = {0x0123456789abcdef, 0x0123456789abcdef};
2630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int64_t dst[5] = {0, 0, 0, 0, 0};
2631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base + 16);
2638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base + 32);
2639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, dst_base + 40);
2640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17, 1));
2641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18, 2));
2642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x17, 3));
2643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x18, 9));
2644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x19, -9));
2645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x20, -5));
2646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x19, -1));
2647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x21, -1));
2648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x6789abcd, x0);
26531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00006789abcd0000, dst[0]);
26541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xabcdef0123456789, x1);
26551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xcdef012345678900, dst[1]);
2656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000ab, dst[2]);
2657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xabcdef01, x2);
26581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00abcdef01000000, dst[3]);
2659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x3);
26601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0100000000000000, dst[4]);
2661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x18);
2663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 16, x19);
2664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 32, x20);
2665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal) {
2671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
26741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ldr(x2, 0x1234567890abcdef);
2675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w3, 0xfedcba09);
2676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d13, 1.234);
2677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s25, 2.5);
2678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
26821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x2);
2683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba09, x3);
2684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.234, d13);
2685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.5, s25);
2686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void LdrLiteralRangeHelper(ptrdiff_t range_,
2692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                  LiteralPoolEmitOption option,
2693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                  bool expect_dump) {
26941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(range_ > 0);
2695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP_SIZE(range_ + 1024);
2696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label label_1, label_2;
2698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  size_t range = static_cast<size_t>(range_);
2700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  size_t code_size = 0;
2701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  size_t pool_guard_size;
2702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (option == NoJumpRequired) {
2704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Space for an explicit branch.
2705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    pool_guard_size = sizeof(Instr);
2706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  } else {
2707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    pool_guard_size = 0;
2708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
2709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Force a pool dump so the pool starts off empty.
2712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ EmitLiteralPool(JumpRequired);
2713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(0);
2714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ldr(x0, 0x1234567890abcdef);
2716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w1, 0xfedcba09);
2717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d0, 1.234);
2718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s1, 2.5);
2719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(24);
2720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  code_size += 4 * sizeof(Instr);
2722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that the requested range (allowing space for a branch over the pool)
2724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // can be handled by this test.
27251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT((code_size + pool_guard_size) <= range);
2726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Emit NOPs up to 'range', leaving space for the pool guard.
2728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  while ((code_size + pool_guard_size) < range) {
2729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Nop();
2730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    code_size += sizeof(Instr);
2731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
2732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Emit the guard sequence before the literal pool.
2734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (option == NoJumpRequired) {
2735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ B(&label_1);
2736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    code_size += sizeof(Instr);
2737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
2738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(code_size == range);
2740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(24);
2741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Possibly generate a literal pool.
2743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ CheckLiteralPool(option);
2744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_1);
2745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (expect_dump) {
2746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT_LITERAL_POOL_SIZE(0);
2747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  } else {
2748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT_LITERAL_POOL_SIZE(24);
2749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
2750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Force a pool flush to check that a second pool functions correctly.
2752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ EmitLiteralPool(JumpRequired);
2753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(0);
2754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // These loads should be after the pool (and will require a new one).
27561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ldr(x4, 0x34567890abcdef12);
2757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w5, 0xdcba09fe);
2758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d4, 123.4);
2759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s5, 250.0);
2760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_LITERAL_POOL_SIZE(24);
2761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that the literals loaded correctly.
27661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x0);
2767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba09, x1);
2768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.234, d0);
2769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.5, s1);
27701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x34567890abcdef12, x4);
2771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xdcba09fe, x5);
2772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(123.4, d4);
2773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(250.0, s5);
2774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_1) {
2780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(kRecommendedLiteralPoolRange,
2781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        NoJumpRequired,
2782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        true);
2783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_2) {
2787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(kRecommendedLiteralPoolRange-sizeof(Instr),
2788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        NoJumpRequired,
2789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        false);
2790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_3) {
2794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(2 * kRecommendedLiteralPoolRange,
2795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        JumpRequired,
2796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        true);
2797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_4) {
2801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(2 * kRecommendedLiteralPoolRange-sizeof(Instr),
2802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        JumpRequired,
2803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        false);
2804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_5) {
2808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(kLiteralPoolCheckInterval,
2809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        JumpRequired,
2810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        false);
2811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_literal_range_6) {
2815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  LdrLiteralRangeHelper(kLiteralPoolCheckInterval-sizeof(Instr),
2816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        JumpRequired,
2817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                        false);
2818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_imm) {
2822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
2826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1111);
28271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xffffffffffffffff);
28281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, 0x8000000000000000);
2829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x0, Operand(0x123));
2831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x1, Operand(0x122000));
2832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x12, x0, Operand(0xabc << 12));
2833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x13, x2, Operand(1));
2834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w14, w0, Operand(0x123));
2836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w15, w1, Operand(0x122000));
2837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w16, w0, Operand(0xabc << 12));
2838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w17, w2, Operand(1));
2839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x20, x0, Operand(0x1));
2841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x21, x1, Operand(0x111));
2842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x22, x1, Operand(0x1 << 12));
2843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x23, x3, Operand(1));
2844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w24, w0, Operand(0x1));
2846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w25, w1, Operand(0x111));
2847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w26, w1, Operand(0x1 << 12));
2848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w27, w3, Operand(1));
2849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x123, x10);
2854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x123111, x11);
2855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xabc000, x12);
2856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x13);
2857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x123, w14);
2859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x123111, w15);
2860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xabc000, w16);
2861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x0, w17);
2862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
28631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
2864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1000, x21);
2865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x111, x22);
28661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x23);
2867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffff, w24);
2869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x1000, w25);
2870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x111, w26);
2871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffff, w27);
2872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_wide_imm) {
2878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
2882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1);
2883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
28841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Add(x10, x0, Operand(0x1234567890abcdef));
2885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x1, Operand(0xffffffff));
2886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w12, w0, Operand(0x12345678));
2888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w13, w1, Operand(0xffffffff));
2889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
28901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Sub(x20, x0, Operand(0x1234567890abcdef));
2891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w21, w0, Operand(0x12345678));
2893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
28971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x10);
28981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x100000000, x11);
2899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x12345678, w12);
2901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x13);
2902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
29031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(-0x1234567890abcdef, x20);
2904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(-0x12345678, w21);
2906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_shifted) {
2912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
29161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x0123456789abcdef);
29171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xfedcba9876543210);
29181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, 0xffffffffffffffff);
2919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x1, Operand(x2));
2921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x0, Operand(x1, LSL, 8));
2922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x12, x0, Operand(x1, LSR, 8));
2923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x13, x0, Operand(x1, ASR, 8));
2924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x14, x0, Operand(x2, ASR, 8));
2925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w15, w0, Operand(w1, ASR, 8));
2926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w18, w3, Operand(w1, ROR, 8));
2927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x19, x3, Operand(x1, ROR, 8));
2928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x20, x3, Operand(x2));
2930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x21, x3, Operand(x1, LSL, 8));
2931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x22, x3, Operand(x1, LSR, 8));
2932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x23, x3, Operand(x1, ASR, 8));
2933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x24, x3, Operand(x2, ASR, 8));
2934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w25, w3, Operand(w1, ASR, 8));
2935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w26, w3, Operand(w1, ROR, 8));
2936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x27, x3, Operand(x1, ROR, 8));
2937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
29411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x10);
29421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x23456789abcdef00, x11);
29431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000123456789abcd, x12);
29441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000123456789abcd, x13);
29451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffedcba98765432, x14);
2946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff89abcd, x15);
2947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xef89abcc, x18);
29481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xef0123456789abcc, x19);
2949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
29501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x20);
29511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xdcba9876543210ff, x21);
29521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffedcba98765432, x22);
29531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffedcba98765432, x23);
29541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000123456789abcd, x24);
2955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00765432, x25);
2956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x10765432, x26);
29571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x10fedcba98765432, x27);
2958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_extended) {
2964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
29681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x0123456789abcdef);
29691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xfedcba9876543210);
2970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, 0x80);
2971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x0, Operand(x1, UXTB, 0));
2973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x0, Operand(x1, UXTB, 1));
2974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x12, x0, Operand(x1, UXTH, 2));
2975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x13, x0, Operand(x1, UXTW, 4));
2976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x14, x0, Operand(x1, SXTB, 0));
2978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x15, x0, Operand(x1, SXTB, 1));
2979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x16, x0, Operand(x1, SXTH, 2));
2980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x17, x0, Operand(x1, SXTW, 3));
2981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x18, x0, Operand(x2, SXTB, 0));
2982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x19, x0, Operand(x2, SXTB, 1));
2983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x20, x0, Operand(x2, SXTH, 2));
2984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x21, x0, Operand(x2, SXTW, 3));
2985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x22, x1, Operand(x2, SXTB, 1));
2987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x23, x1, Operand(x2, SXTB, 1));
2988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w24, w1, Operand(w2, UXTB, 2));
2990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w25, w0, Operand(w1, SXTB, 0));
2991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w26, w0, Operand(w1, SXTB, 1));
2992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w27, w2, Operand(w1, SXTW, 3));
2993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w28, w0, Operand(w1, SXTW, 3));
2995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x29, x0, Operand(w1, SXTW, 3));
2996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x30, x0, Operand(w3, SXTB, 1));
2998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
30021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xef, x10);
30031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1de, x11);
30041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x337bc, x12);
30051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x89abcdef0, x13);
3006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
30071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffef, x14);
30081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffde, x15);
30091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff37bc, x16);
30101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffc4d5e6f78, x17);
30111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x10, x18);
30121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x20, x19);
30131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xc840, x20);
30141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3b2a19080, x21);
3015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
30161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abce0f, x22);
30171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdcf, x23);
3018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x89abce2f, w24);
3020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffef, w25);
3021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffde, w26);
3022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xc3b2a188, w27);
3023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x4d5e6f78, w28);
30251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffc4d5e6f78, x29);
3026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(256, x30);
3028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(add_sub_negative) {
3034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 4687);
3039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0x1122334455667788);
3040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, 0x11223344);
3041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, 400000);
3042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x10, x0, -42);
3044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x11, x1, -687);
3045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x12, x2, -0x88);
3046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x13, x0, -600);
3048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x14, x1, -313);
3049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(x15, x2, -0x555);
3050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w19, w3, -0x344);
3052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(w20, w4, -2000);
3053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w21, w3, -0xbc);
3055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sub(w22, w4, -2000);
3056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(-42, x10);
3061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(4000, x11);
3062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667700, x12);
3063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(600, x13);
3065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5000, x14);
3066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667cdd, x15);
3067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11223000, w19);
3069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(398000, w20);
3070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11223400, w21);
3072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(402000, w22);
3073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3078f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(add_sub_zero) {
3079f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
3080f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3081f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3082f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3083f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x1, 0);
3084f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x2, 0);
3085f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3086f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  Label blob1;
3087f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bind(&blob1);
3088f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Add(x0, x0, 0);
3089f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sub(x1, x1, 0);
3090f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sub(x2, x2, xzr);
30911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&blob1) == 0);
3092f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3093f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  Label blob2;
3094f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bind(&blob2);
3095f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Add(w3, w3, 0);
30961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&blob2) != 0);
3097f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3098f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  Label blob3;
3099f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bind(&blob3);
3100f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sub(w3, w3, wzr);
31011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&blob3) != 0);
3102f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3103f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3104f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3105f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3106f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3107f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x0);
3108f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x1);
3109f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x2);
3110f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3111f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
3112f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
3113f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3114f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3115f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(claim_drop_zero) {
3116f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
3117f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3118f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3119f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3120f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  Label start;
3121f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bind(&start);
3122f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Claim(Operand(0));
3123f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Drop(Operand(0));
3124f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Claim(Operand(xzr));
3125f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Drop(Operand(xzr));
31261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
3127f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3128f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3129f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3130f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3131f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3132f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
3133f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
3134f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3135f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(neg) {
3137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
31401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xf123456789abcdef);
3141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Immediate.
3143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x1, 0x123);
3144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w2, 0x123);
3145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Shifted.
3147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x3, Operand(x0, LSL, 1));
3148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w4, Operand(w0, LSL, 2));
3149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x5, Operand(x0, LSR, 3));
3150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w6, Operand(w0, LSR, 4));
3151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x7, Operand(x0, ASR, 5));
3152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w8, Operand(w0, ASR, 6));
3153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Extended.
3155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w9, Operand(w0, UXTB));
3156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x10, Operand(x0, SXTB, 1));
3157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w11, Operand(w0, UXTH, 2));
3158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x12, Operand(x0, SXTH, 3));
3159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w13, Operand(w0, UXTW, 4));
3160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x14, Operand(x0, SXTW, 4));
3161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
31651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffedd, x1);
3166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffedd, x2);
31671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1db97530eca86422, x3);
3168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xd950c844, x4);
31691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xe1db97530eca8643, x5);
3170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf7654322, x6);
31711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0076e5d4c3b2a191, x7);
3172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x01d950c9, x8);
3173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff11, x9);
31741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000022, x10);
3175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffcc844, x11);
31761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000019088, x12);
3177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x65432110, x13);
31781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000765432110, x14);
3179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adc_sbc_shift) {
3185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
31901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0x0123456789abcdef);
31911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, 0xfedcba9876543210);
31921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x4, 0xffffffffffffffff);
3193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3195f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x5, x2, Operand(x3));
3198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x6, x0, Operand(x1, LSL, 60));
3199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(x7, x4, Operand(x3, LSR, 4));
3200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x8, x2, Operand(x3, ASR, 4));
3201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x9, x2, Operand(x3, ROR, 8));
3202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w10, w2, Operand(w3));
3204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w11, w0, Operand(w1, LSL, 30));
3205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(w12, w4, Operand(w3, LSR, 4));
3206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w13, w2, Operand(w3, ASR, 4));
3207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w14, w2, Operand(w3, ROR, 8));
3208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x18, x2, Operand(x3));
3213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x19, x0, Operand(x1, LSL, 60));
3214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(x20, x4, Operand(x3, LSR, 4));
3215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x21, x2, Operand(x3, ASR, 4));
3216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x22, x2, Operand(x3, ROR, 8));
3217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w23, w2, Operand(w3));
3219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w24, w0, Operand(w1, LSL, 30));
3220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(w25, w4, Operand(w3, LSR, 4));
3221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w26, w2, Operand(w3, ASR, 4));
3222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w27, w2, Operand(w3, ROR, 8));
3223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x5);
32281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(INT64_C(1) << 60, x6);
32291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0123456789abcdd, x7);
32301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0111111111111110, x8);
32311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1222222222222221, x9);
3232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffff, w10);
32341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_32(INT32_C(1) << 30, w11);
3235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xf89abcdd, w12);
3236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x91111110, w13);
3237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x9a222221, w14);
3238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff + 1, x18);
32401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64((INT64_C(1) << 60) + 1, x19);
32411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0123456789abcdd + 1, x20);
32421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0111111111111110 + 1, x21);
32431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1222222222222221 + 1, x22);
3244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffff + 1, w23);
32461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_32((INT32_C(1) << 30) + 1, w24);
3247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xf89abcdd + 1, w25);
3248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x91111110 + 1, w26);
3249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x9a222221 + 1, w27);
3250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that adc correctly sets the condition flags.
3252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
32541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffffffff);
3255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3256f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3257f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1));
3258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3263f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
32671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000000000000);
3268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3269f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3270f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1, ASR, 63));
3271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3276f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x10);
32801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x07ffffffffffffff);
3281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3282f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3283f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1, LSL, 4));
3284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
32891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x10);
3290f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3291f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Check that sbc correctly sets the condition flags.
3292f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3293f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
32941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffffffff);
3295f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3296f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3297f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbcs(x10, x0, Operand(x1));
3298f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3299f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3300f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3301f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3302f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
3303f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3304f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3305f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3306f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 1);
33071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffffffff);
3308f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3309f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3310f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbcs(x10, x0, Operand(x1, LSR, 1));
3311f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3312f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3313f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3314f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3315f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
33161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000001, x10);
3317f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3318f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3319f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3320f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3321f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
33221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Sbcs(x10, x0, Operand(0xffffffffffffffff));
3323f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3324f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3325f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3326f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3327f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
3328f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3329f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
33301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
3331f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w0, 0x7fffffff);
3332f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3333f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3334f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngcs(w10, w0);
3335f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3336f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3337f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3338f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3339f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3340f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x10);
3341f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3342f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3343f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Clear the C flag.
3344f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
33451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ngcs(x10, 0x7fffffffffffffff);
3346f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3347f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3348f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3349f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3350f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
33511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x10);
3352f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
33531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
3354f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3355f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Set the C flag.
3356f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Cmp(x0, Operand(x0));
3357f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbcs(x10, x0, Operand(1));
3358f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3359f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3360f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3361f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3362f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
33631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x10);
3364f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
33651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
3366f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x0, 0);
3367f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Set the C flag.
3368f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Cmp(x0, Operand(x0));
33691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ngcs(x10, 0x7fffffffffffffff);
3370f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3371f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3372f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3373f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3374f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_NZCV(NFlag);
33751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000001, x10);
3376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adc_sbc_extend) {
3382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3386f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
33901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0x0123456789abcdef);
3391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x10, x1, Operand(w2, UXTB, 1));
3393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x11, x1, Operand(x2, SXTH, 2));
3394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(x12, x1, Operand(w2, UXTW, 4));
3395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x13, x1, Operand(x2, UXTX, 4));
3396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w14, w1, Operand(w2, UXTB, 1));
3398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w15, w1, Operand(w2, SXTH, 2));
3399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w9, w1, Operand(w2, UXTW, 4));
3400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x20, x1, Operand(w2, UXTB, 1));
3405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x21, x1, Operand(x2, SXTH, 2));
3406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbc(x22, x1, Operand(w2, UXTW, 4));
3407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(x23, x1, Operand(x2, UXTX, 4));
3408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w24, w1, Operand(w2, UXTB, 1));
3410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w25, w1, Operand(w2, SXTH, 2));
3411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w26, w1, Operand(w2, UXTW, 4));
3412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1df, x10);
34171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff37bd, x11);
34181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffff765432110, x12);
34191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x123456789abcdef1, x13);
3420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x1df, w14);
3422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffff37bd, w15);
3423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x9abcdef1, w9);
3424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1df + 1, x20);
34261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff37bd + 1, x21);
34271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffff765432110 + 1, x22);
34281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x123456789abcdef1 + 1, x23);
3429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x1df + 1, w24);
3431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffff37bd + 1, w25);
3432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x9abcdef1 + 1, w26);
3433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that adc correctly sets the condition flags.
3435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xff);
34371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffffffff);
3438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3439f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3440f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1, SXTX, 1));
3441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(CFlag);
3446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
34481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x7fffffffffffffff);
3449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
3450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3451f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3452f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(x1, UXTB, 2));
3453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
34601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x7fffffffffffffff);
3461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3462f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3463f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adcs(x10, x0, Operand(1));
3464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adc_sbc_wide_imm) {
3475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3481f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
34831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Adc(x7, x0, Operand(0x1234567890abcdef));
3484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adc(w8, w0, Operand(0xffffffff));
34851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Sbc(x9, x0, Operand(0x1234567890abcdef));
3486f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbc(w10, w0, Operand(0xffffffff));
34871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ngc(x11, Operand(0xffffffff00000000));
3488f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngc(w12, Operand(0xffff0000));
3489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
34931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Adc(x18, x0, Operand(0x1234567890abcdef));
3494f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adc(w19, w0, Operand(0xffffffff));
34951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Sbc(x20, x0, Operand(0x1234567890abcdef));
3496f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sbc(w21, w0, Operand(0xffffffff));
34971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ngc(x22, Operand(0xffffffff00000000));
3498f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngc(w23, Operand(0xffff0000));
3499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
35031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x7);
3504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x8);
35051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xedcba9876f543210, x9);
3506f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3507f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff, x11);
3508f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffff, x12);
3509f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
35101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567890abcdef + 1, x18);
3511f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x19);
35121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xedcba9876f543211, x20);
3513f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x21);
35141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000100000000, x22);
35151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000010000, x23);
3516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(flags) {
3521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
35251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x1111111111111111);
3526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x10, Operand(x0));
3527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(x11, Operand(x1));
3528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Neg(w12, Operand(w1));
3529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3530f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(x0, x0, Operand(0));
3531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ngc(x13, Operand(x0));
3532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x0, Operand(x0));
3534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ngc(w14, Operand(w0));
3535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x10);
35401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(-0x1111111111111111, x11);
3541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(-0x11111111, w12);
35421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(-1, x13);
3543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0, w14);
3544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
3547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x0, Operand(x0));
3548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
3556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
35651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x1111111111111111);
3566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x0, Operand(x1));
3567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
3575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0x11111111);
3576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w1));
3577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
35841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x1111111111111111);
3585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x1, Operand(0));
3586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(CFlag);
3591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0x11111111);
3594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w1, Operand(0));
3595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(CFlag);
3600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
36031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x7fffffffffffffff);
3604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(x1, Operand(x0));
3605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 1);
3613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0x7fffffff);
3614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(w1, Operand(w0));
3615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
3620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
36231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffffffff);
3624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(x1, Operand(x0));
3625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 1);
3633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0xffffffff);
3634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(w1, Operand(w0));
3635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
3643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 1);
3644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Clear the C flag.
3645f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(w0, w0, Operand(0));
3646f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngcs(w0, Operand(w1));
3647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
3652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
3655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0);
3656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the C flag.
3657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, Operand(w0));
3658f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ngcs(w0, Operand(w1));
3659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
3664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(cmp_shift) {
3670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xf0000000);
36741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xf000000010000000);
36751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x20, 0xf0000000f0000000);
36761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, 0x7800000078000000);
36771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, 0x3c0000003c000000);
36781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x23, 0x8000000780000000);
36791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0x0000000f00000000);
36801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x25, 0x00000003c0000000);
36811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x26, 0x8000000780000000);
3682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, 0xc0000003);
3683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w21, LSL, 1));
3685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x20, Operand(x22, LSL, 2));
3688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w19, Operand(w23, LSR, 3));
3691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
3692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x18, Operand(x24, LSR, 4));
3694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
3695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w25, ASR, 2));
3697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
3698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x20, Operand(x26, ASR, 3));
3700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
3701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w27, Operand(w22, ROR, 28));
3703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x6, NZCV);
3704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x20, Operand(x21, ROR, 31));
3706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x7, NZCV);
3707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
3712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
3713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
3714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w3);
3715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
3716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
3717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w6);
3718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w7);
3719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(cmp_extend) {
3725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w20, 0x2);
3729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, 0x1);
37301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, 0xffffffffffffffff);
3731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, 0xff);
37321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0xfffffffffffffffe);
3733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 0xffff);
3734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, 0xffffffff);
3735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w21, LSL, 1));
3737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x22, Operand(x23, SXTB, 0));
3740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x24, Operand(x23, SXTB, 1));
3743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
3744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x24, Operand(x23, UXTB, 1));
3746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
3747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w22, Operand(w25, UXTH));
3749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
3750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x22, Operand(x25, SXTH));
3752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
3753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x22, Operand(x26, UXTW));
3755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x6, NZCV);
3756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x24, Operand(x26, SXTW, 1));
3758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x7, NZCV);
3759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
3764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
3765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
3766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w3);
3767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w4);
3768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
3769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w6);
3770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w7);
3771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ccmp) {
3777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w16, 0);
3781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w17, 1);
3782578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(w16, w16);
3783578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ccmp(w16, w17, NCFlag, eq);
3784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3786578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(w16, w16);
3787578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ccmp(w16, w17, NCFlag, ne);
3788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3790578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x16, x16);
3791578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ccmn(x16, 2, NZCVFlag, eq);
3792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
3793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3794578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x16, x16);
3795578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ccmn(x16, 2, NZCVFlag, ne);
3796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
3797578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3798578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ ccmp(x16, x16, NZCVFlag, al);
3799578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x4, NZCV);
3800578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3801578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ ccmp(x16, x16, NZCVFlag, nv);
3802578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x5, NZCV);
3803578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w0);
3809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w1);
3810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NoFlag, w2);
3811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NZCVFlag, w3);
3812578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
3813578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
3814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ccmp_wide_imm) {
3820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w20, 0);
3824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(w20, Operand(0x12345678), NZCVFlag, eq);
3827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
38301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ccmp(x20, Operand(0xffffffffffffffff), NZCVFlag, eq);
3831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w0);
3837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NoFlag, w1);
3838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ccmp_shift_extend) {
3844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w20, 0x2);
3848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, 0x1);
38491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, 0xffffffffffffffff);
3850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, 0xff);
38511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0xfffffffffffffffe);
3852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(w20, Operand(w21, LSL, 1), NZCVFlag, eq);
3855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
3856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x22, Operand(x23, SXTB, 0), NZCVFlag, eq);
3859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
3860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x24, Operand(x23, SXTB, 1), NZCVFlag, eq);
3863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
3864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x24, Operand(x23, UXTB, 1), NZCVFlag, eq);
3867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
3868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w20, Operand(w20));
3870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ccmp(x24, Operand(x23, UXTB, 1), NZCVFlag, ne);
3871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
3872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
3877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
3878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
3879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NCFlag, w3);
3880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NZCVFlag, w4);
3881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(csel) {
3887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
38911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0x0000000f0000000f);
38921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x25, 0x0000001f0000001f);
3893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w16, Operand(0));
3895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csel(w0, w24, w25, eq);
3896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csel(w1, w24, w25, ne);
3897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csinc(w2, w24, w25, mi);
3898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csinc(w3, w24, w25, pl);
3899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3900578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ csel(w13, w24, w25, al);
3901578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ csel(x14, x24, x25, nv);
3902578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(x16, Operand(1));
3904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csinv(x4, x24, x25, gt);
3905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csinv(x5, x24, x25, le);
3906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csneg(x6, x24, x25, hs);
3907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csneg(x7, x24, x25, lo);
3908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cset(w8, ne);
3910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Csetm(w9, ne);
3911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x10, x25, ne);
3912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinv(x11, x24, ne);
3913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cneg(x12, x24, ne);
3914578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3915578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ csel(w15, w24, w25, al);
3916578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ csel(x17, x24, x25, nv);
3917578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
3918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000f, x0);
3923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000001f, x1);
3924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000020, x2);
3925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000000f, x3);
39261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffe0ffffffe0, x4);
39271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000f0000000f, x5);
39281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffe0ffffffe1, x6);
39291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000f0000000f, x7);
3930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x8);
3931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x9);
39321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000001f00000020, x10);
39331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffff0fffffff0, x11);
39341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffff0fffffff1, x12);
3935578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(0x0000000f, x13);
39361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000f0000000f, x14);
3937578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(0x0000000f, x15);
39381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000f0000000f, x17);
3939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3944f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(csel_imm) {
3945f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
3946f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3947f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3948f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x18, 0);
3949f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x19, 0x80000000);
39501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x20, 0x8000000000000000);
3951f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3952f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Cmp(x18, Operand(0));
3953f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w0, w19, -2, ne);
3954f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w1, w19, -1, ne);
3955f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w2, w19, 0, ne);
3956f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w3, w19, 1, ne);
3957f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w4, w19, 2, ne);
3958f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w5, w19, Operand(w19, ASR, 31), ne);
3959f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w6, w19, Operand(w19, ROR, 1), ne);
3960f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(w7, w19, 3, eq);
3961f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3962f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x8, x20, -2, ne);
3963f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x9, x20, -1, ne);
3964f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x10, x20, 0, ne);
3965f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x11, x20, 1, ne);
3966f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x12, x20, 2, ne);
3967f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x13, x20, Operand(x20, ASR, 63), ne);
3968f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x14, x20, Operand(x20, ROR, 1), ne);
3969f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Csel(x15, x20, 3, eq);
3970f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3971f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
3972f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3973f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
3974f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3975f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(-2, w0);
3976f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(-1, w1);
3977f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(0, w2);
3978f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(1, w3);
3979f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(2, w4);
3980f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(-1, w5);
3981f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(0x40000000, w6);
3982f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_32(0x80000000, w7);
3983f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3984f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(-2, x8);
3985f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(-1, x9);
3986f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x10);
3987f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x11);
3988f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(2, x12);
3989f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(-1, x13);
39901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x4000000000000000, x14);
39911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x15);
3992f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3993f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
3994f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
3995f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3996f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(lslv) {
3998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
40001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t value = 0x0123456789abcdef;
4001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
4002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, value);
4005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, shift[0]);
4006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, shift[1]);
4007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, shift[2]);
4008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, shift[3]);
4009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, shift[4]);
4010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, shift[5]);
4011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ lslv(x0, x0, xzr);
4013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x16, x0, x1);
4015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x17, x0, x2);
4016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x18, x0, x3);
4017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x19, x0, x4);
4018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x20, x0, x5);
4019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x21, x0, x6);
4020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w22, w0, w1);
4022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w23, w0, w2);
4023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w24, w0, w3);
4024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w25, w0, w4);
4025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w26, w0, w5);
4026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(w27, w0, w6);
4027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value, x0);
4032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[0] & 63), x16);
4033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[1] & 63), x17);
4034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[2] & 63), x18);
4035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[3] & 63), x19);
4036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[4] & 63), x20);
4037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value << (shift[5] & 63), x21);
4038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[0] & 31), w22);
4039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[1] & 31), w23);
4040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[2] & 31), w24);
4041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[3] & 31), w25);
4042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[4] & 31), w26);
4043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value << (shift[5] & 31), w27);
4044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(lsrv) {
4050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
40521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t value = 0x0123456789abcdef;
4053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
4054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, value);
4057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, shift[0]);
4058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, shift[1]);
4059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, shift[2]);
4060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, shift[3]);
4061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, shift[4]);
4062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, shift[5]);
4063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ lsrv(x0, x0, xzr);
4065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x16, x0, x1);
4067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x17, x0, x2);
4068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x18, x0, x3);
4069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x19, x0, x4);
4070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x20, x0, x5);
4071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x21, x0, x6);
4072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w22, w0, w1);
4074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w23, w0, w2);
4075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w24, w0, w3);
4076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w25, w0, w4);
4077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w26, w0, w5);
4078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(w27, w0, w6);
4079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value, x0);
4084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[0] & 63), x16);
4085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[1] & 63), x17);
4086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[2] & 63), x18);
4087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[3] & 63), x19);
4088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[4] & 63), x20);
4089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[5] & 63), x21);
4090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
40911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  value &= 0xffffffff;
4092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[0] & 31), w22);
4093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[1] & 31), w23);
4094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[2] & 31), w24);
4095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[3] & 31), w25);
4096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[4] & 31), w26);
4097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value >> (shift[5] & 31), w27);
4098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(asrv) {
4104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
41061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  int64_t value = 0xfedcba98fedcba98;
4107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
4108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, value);
4111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, shift[0]);
4112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, shift[1]);
4113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, shift[2]);
4114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, shift[3]);
4115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, shift[4]);
4116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, shift[5]);
4117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ asrv(x0, x0, xzr);
4119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x16, x0, x1);
4121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x17, x0, x2);
4122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x18, x0, x3);
4123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x19, x0, x4);
4124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x20, x0, x5);
4125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x21, x0, x6);
4126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w22, w0, w1);
4128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w23, w0, w2);
4129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w24, w0, w3);
4130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w25, w0, w4);
4131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w26, w0, w5);
4132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(w27, w0, w6);
4133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value, x0);
4138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[0] & 63), x16);
4139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[1] & 63), x17);
4140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[2] & 63), x18);
4141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[3] & 63), x19);
4142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[4] & 63), x20);
4143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value >> (shift[5] & 63), x21);
4144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
41451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  int32_t value32 = static_cast<int32_t>(value & 0xffffffff);
4146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[0] & 31), w22);
4147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[1] & 31), w23);
4148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[2] & 31), w24);
4149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[3] & 31), w25);
4150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[4] & 31), w26);
4151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(value32 >> (shift[5] & 31), w27);
4152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(rorv) {
4158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
41601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t value = 0x0123456789abcdef;
4161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int shift[] = {4, 8, 12, 16, 24, 36};
4162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, value);
4165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, shift[0]);
4166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, shift[1]);
4167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, shift[2]);
4168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, shift[3]);
4169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, shift[4]);
4170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, shift[5]);
4171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ rorv(x0, x0, xzr);
4173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x16, x0, x1);
4175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x17, x0, x2);
4176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x18, x0, x3);
4177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x19, x0, x4);
4178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x20, x0, x5);
4179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x21, x0, x6);
4180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w22, w0, w1);
4182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w23, w0, w2);
4183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w24, w0, w3);
4184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w25, w0, w4);
4185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w26, w0, w5);
4186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w27, w0, w6);
4187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(value, x0);
41921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0123456789abcde, x16);
41931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xef0123456789abcd, x17);
41941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xdef0123456789abc, x18);
41951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xcdef0123456789ab, x19);
41961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xabcdef0123456789, x20);
41971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x789abcdef0123456, x21);
4198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xf89abcde, w22);
4199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xef89abcd, w23);
4200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xdef89abc, w24);
4201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xcdef89ab, w25);
4202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xabcdef89, w26);
4203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xf89abcde, w27);
4204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bfm) {
4210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
42131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x0123456789abcdef);
4214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
42151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x10, 0x8888888888888888);
42161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x11, 0x8888888888888888);
42171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x12, 0x8888888888888888);
42181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x13, 0x8888888888888888);
4219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w20, 0x88888888);
4220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, 0x88888888);
4221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bfm(x10, x1, 16, 31);
4223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bfm(x11, x1, 32, 15);
4224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bfm(w20, w1, 16, 23);
4226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bfm(w21, w1, 24, 15);
4227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Aliases.
4229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bfi(x12, x1, 16, 8);
4230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bfxil(x13, x1, 16, 8);
4231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
42361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x88888888888889ab, x10);
42371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8888cdef88888888, x11);
4238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x888888ab, w20);
4240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x88cdef88, w21);
4241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
42421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8888888888ef8888, x12);
42431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x88888888888888ab, x13);
4244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(sbfm) {
4250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
42531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x0123456789abcdef);
42541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xfedcba9876543210);
4255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(x10, x1, 16, 31);
4257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(x11, x1, 32, 15);
4258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(x12, x1, 32, 47);
4259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(x13, x1, 48, 35);
4260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(w14, w1, 16, 23);
4262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(w15, w1, 24, 15);
4263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(w16, w2, 16, 23);
4264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sbfm(w17, w2, 24, 15);
4265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Aliases.
4267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x18, x1, 32);
4268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Asr(x19, x2, 32);
4269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbfiz(x20, x1, 8, 16);
4270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbfiz(x21, x2, 8, 16);
4271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbfx(x22, x1, 8, 16);
4272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sbfx(x23, x2, 8, 16);
4273f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sxtb(x24, w1);
4274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sxtb(x25, x2);
4275f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sxth(x26, w1);
4276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sxth(x27, x2);
4277f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sxtw(x28, w1);
4278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sxtw(x29, x2);
4279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
42841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff89ab, x10);
42851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffcdef00000000, x11);
42861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000004567, x12);
42871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000789abcdef0000, x13);
4288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffffffab, w14);
4290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0xffcdef00, w15);
42911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_32(0x00000054, w16);
4292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00321000, w17);
4293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
42941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000001234567, x18);
42951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffedcba98, x19);
42961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffcdef00, x20);
42971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000321000, x21);
42981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffabcd, x22);
42991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000005432, x23);
43001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffef, x24);
43011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000010, x25);
43021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffcdef, x26);
43031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000003210, x27);
43041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff89abcdef, x28);
43051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000076543210, x29);
4306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ubfm) {
4312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
43151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x0123456789abcdef);
43161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xfedcba9876543210);
4317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x10, 0x8888888888888888);
43191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x11, 0x8888888888888888);
4320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(x10, x1, 16, 31);
4322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(x11, x1, 32, 15);
4323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(x12, x1, 32, 47);
4324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(x13, x1, 48, 35);
4325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(w25, w1, 16, 23);
4327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(w26, w1, 24, 15);
4328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(w27, w2, 16, 23);
4329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ ubfm(w28, w2, 24, 15);
4330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Aliases
4332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x15, x1, 63);
4333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsl(x16, x1, 0);
4334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Lsr(x17, x1, 32);
4335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ubfiz(x18, x1, 8, 16);
4336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ubfx(x19, x1, 8, 16);
4337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Uxtb(x20, x1);
4338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Uxth(x21, x1);
4339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Uxtw(x22, x1);
4340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000000089ab, x10);
43451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000cdef00000000, x11);
43461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000004567, x12);
43471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000789abcdef0000, x13);
4348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x000000ab, w25);
4350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00cdef00, w26);
43511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_32(0x00000054, w27);
4352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00321000, w28);
4353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x15);
43551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x16);
43561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000001234567, x17);
43571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000cdef00, x18);
43581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000abcd, x19);
43591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000000000ef, x20);
43601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000cdef, x21);
43611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000089abcdef, x22);
4362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(extr) {
4368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
43711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x0123456789abcdef);
43721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xfedcba9876543210);
4373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Extr(w10, w1, w2, 0);
4375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Extr(w11, w1, w2, 1);
4376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Extr(x12, x2, x1, 2);
4377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w13, w1, 0);
4379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w14, w2, 17);
4380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(w15, w1, 31);
4381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x18, x2, 1);
4382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ror(x19, x1, 63);
4383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, x10);
4388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xbb2a1908, x11);
43891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0048d159e26af37b, x12);
4390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x89abcdef, x13);
4391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x19083b2a, x14);
4392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x13579bdf, x15);
43931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7f6e5d4c3b2a1908, x18);
43941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x02468acf13579bde, x19);
4395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fmov_imm) {
4401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s11, 1.0);
4405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d22, -13.0);
4406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 255.0);
4407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d2, 12.34567);
4408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, 0.0);
4409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d4, 0.0);
4410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32PositiveInfinity);
4411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d6, kFP64NegativeInfinity);
4412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s11);
4417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-13.0, d22);
4418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(255.0, s1);
4419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(12.34567, d2);
4420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s3);
4421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d4);
4422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
4423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d6);
4424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fmov_reg) {
4430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, 1.0);
4434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(w10, s20);
4435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s30, w10);
4436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, s20);
4437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d1, -13.0);
4438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(x1, d1);
4439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d2, x1);
4440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d4, d1);
44411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d6, rawbits_to_double(0x0123456789abcdef));
4442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, s6);
4443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(float_to_rawbits(1.0), w10);
4448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s30);
4449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s5);
4450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(double_to_rawbits(-13.0), x1);
4451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-13.0, d2);
4452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-13.0, d4);
4453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(0x89abcdef), s6);
4454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fadd) {
4460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
44631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s14, -0.0f);
44641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s15, kFP32PositiveInfinity);
44651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s16, kFP32NegativeInfinity);
44661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s17, 3.25f);
44671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s18, 1.0f);
44681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s19, 0.0f);
4469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
4471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
4472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
44731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0.0);
4474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d30, -2.0);
4475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d31, 2.25);
4476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(s0, s17, s18);
44781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(s1, s18, s19);
44791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(s2, s14, s18);
44801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(s3, s15, s18);
44811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(s4, s16, s18);
44821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(s5, s15, s16);
44831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(s6, s16, s15);
4484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(d7, d30, d31);
44861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(d8, d29, d31);
44871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(d9, d26, d31);
44881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(d10, d27, d31);
44891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(d11, d28, d31);
44901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(d12, d27, d28);
44911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(d13, d28, d27);
4492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(4.25, s0);
4497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
4498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s2);
4499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s3);
4500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s4);
45011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s5);
45021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
45031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(0.25, d7);
45041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(2.25, d8);
45051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(2.25, d9);
45061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d10);
45071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d11);
45081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d12);
45091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
4510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fsub) {
4516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
45191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s14, -0.0f);
45201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s15, kFP32PositiveInfinity);
45211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s16, kFP32NegativeInfinity);
45221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s17, 3.25f);
45231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s18, 1.0f);
45241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s19, 0.0f);
4525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
4527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
4528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
45291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0.0);
4530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d30, -2.0);
4531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d31, 2.25);
4532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
45331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(s0, s17, s18);
45341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(s1, s18, s19);
45351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(s2, s14, s18);
45361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(s3, s18, s15);
45371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(s4, s18, s16);
45381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(s5, s15, s15);
45391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(s6, s16, s16);
4540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
45411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(d7, d30, d31);
45421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(d8, d29, d31);
45431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(d9, d26, d31);
45441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(d10, d31, d27);
45451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(d11, d31, d28);
45461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(d12, d27, d27);
45471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(d13, d28, d28);
4548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.25, s0);
4553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
4554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-1.0, s2);
4555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s3);
4556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s4);
45571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s5);
45581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
45591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(-4.25, d7);
45601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(-2.25, d8);
45611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(-2.25, d9);
45621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d10);
45631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d11);
45641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d12);
45651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
4566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fmul) {
4572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
45751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s14, -0.0f);
45761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s15, kFP32PositiveInfinity);
45771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s16, kFP32NegativeInfinity);
45781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s17, 3.25f);
45791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s18, 2.0f);
45801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s19, 0.0f);
45811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s20, -2.0f);
4582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
4584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
4585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
45861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0.0);
4587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d30, -2.0);
4588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d31, 2.25);
4589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
45901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(s0, s17, s18);
45911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(s1, s18, s19);
45921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(s2, s14, s14);
45931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(s3, s15, s20);
45941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(s4, s16, s20);
45951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(s5, s15, s19);
45961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(s6, s19, s16);
4597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
45981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(d7, d30, d31);
45991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(d8, d29, d31);
46001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(d9, d26, d26);
46011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(d10, d27, d30);
46021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(d11, d28, d30);
46031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(d12, d27, d29);
46041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(d13, d29, d28);
4605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(6.5, s0);
4610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s1);
4611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s2);
4612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s3);
4613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s4);
46141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s5);
46151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
46161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(-4.5, d7);
46171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(0.0, d8);
46181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(0.0, d9);
46191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d10);
46201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d11);
46211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d12);
46221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
4623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlstatic void FmaddFmsubHelper(double n, double m, double a,
46291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                             double fmadd, double fmsub,
46301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                             double fnmadd, double fnmsub) {
4631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4632f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
4633f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4634f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d0, n);
4635f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d1, m);
4636f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d2, a);
4637f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmadd(d28, d0, d1, d2);
4638f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmsub(d29, d0, d1, d2);
4639f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fnmadd(d30, d0, d1, d2);
4640f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fnmsub(d31, d0, d1, d2);
4641f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4642f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
4643f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
4644f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4645f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(fmadd, d28);
4646f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(fmsub, d29);
46471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(fnmadd, d30);
46481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(fnmsub, d31);
4649f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4650f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
4651f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4652f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4654f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmadd_fmsub_double) {
46551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // It's hard to check the result of fused operations because the only way to
46561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // calculate the result is using fma, which is what the simulator uses anyway.
46571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // TODO(jbramley): Add tests to check behaviour against a hardware trace.
46581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
46591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Basic operation.
46601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(1.0, 2.0, 3.0, 5.0, 1.0, -5.0, -1.0);
46611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-1.0, 2.0, 3.0, 1.0, 5.0, -1.0, -5.0);
46621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
46631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Check the sign of exact zeroes.
46641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //               n     m     a     fmadd  fmsub  fnmadd fnmsub
46651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-0.0, +0.0, -0.0, -0.0,  +0.0,  +0.0,  +0.0);
46661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(+0.0, +0.0, -0.0, +0.0,  -0.0,  +0.0,  +0.0);
46671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(+0.0, +0.0, +0.0, +0.0,  +0.0,  -0.0,  +0.0);
46681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-0.0, +0.0, +0.0, +0.0,  +0.0,  +0.0,  -0.0);
46691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(+0.0, -0.0, -0.0, -0.0,  +0.0,  +0.0,  +0.0);
46701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-0.0, -0.0, -0.0, +0.0,  -0.0,  +0.0,  +0.0);
46711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-0.0, -0.0, +0.0, +0.0,  +0.0,  -0.0,  +0.0);
46721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(+0.0, -0.0, +0.0, +0.0,  +0.0,  +0.0,  -0.0);
46731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
46741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Check NaN generation.
46751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP64PositiveInfinity, 0.0, 42.0,
46761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
46771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
46781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0.0, kFP64PositiveInfinity, 42.0,
46791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
46801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
46811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP64PositiveInfinity, 1.0, kFP64PositiveInfinity,
46821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64PositiveInfinity,   //  inf + ( inf * 1) = inf
46831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN,         //  inf + (-inf * 1) = NaN
46841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64NegativeInfinity,   // -inf + (-inf * 1) = -inf
46851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN);        // -inf + ( inf * 1) = NaN
46861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP64NegativeInfinity, 1.0, kFP64PositiveInfinity,
46871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN,         //  inf + (-inf * 1) = NaN
46881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64PositiveInfinity,   //  inf + ( inf * 1) = inf
46891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN,         // -inf + ( inf * 1) = NaN
46901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64NegativeInfinity);  // -inf + (-inf * 1) = -inf
46911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
46921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
46931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
46941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlstatic void FmaddFmsubHelper(float n, float m, float a,
46951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                             float fmadd, float fmsub,
46961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                             float fnmadd, float fnmsub) {
4697f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
4698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4700f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s0, n);
4701f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s1, m);
4702f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s2, a);
47031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmadd(s28, s0, s1, s2);
47041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmsub(s29, s0, s1, s2);
47051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fnmadd(s30, s0, s1, s2);
47061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fnmsub(s31, s0, s1, s2);
4707f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4708f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
4709f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
4710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
47111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(fmadd, s28);
47121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(fmsub, s29);
47131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(fnmadd, s30);
47141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(fnmsub, s31);
4715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4720f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmadd_fmsub_float) {
47211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // It's hard to check the result of fused operations because the only way to
47221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // calculate the result is using fma, which is what the simulator uses anyway.
47231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // TODO(jbramley): Add tests to check behaviour against a hardware trace.
47241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
47251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Basic operation.
47261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(1.0f, 2.0f, 3.0f, 5.0f, 1.0f, -5.0f, -1.0f);
47271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-1.0f, 2.0f, 3.0f, 1.0f, 5.0f, -1.0f, -5.0f);
47281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
47291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Check the sign of exact zeroes.
47301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //               n      m      a      fmadd  fmsub  fnmadd fnmsub
47311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-0.0f, +0.0f, -0.0f, -0.0f, +0.0f, +0.0f, +0.0f);
47321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(+0.0f, +0.0f, -0.0f, +0.0f, -0.0f, +0.0f, +0.0f);
47331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(+0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f, +0.0f);
47341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f);
47351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(+0.0f, -0.0f, -0.0f, -0.0f, +0.0f, +0.0f, +0.0f);
47361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-0.0f, -0.0f, -0.0f, +0.0f, -0.0f, +0.0f, +0.0f);
47371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(-0.0f, -0.0f, +0.0f, +0.0f, +0.0f, -0.0f, +0.0f);
47381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(+0.0f, -0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f);
47391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
47401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Check NaN generation.
47411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP32PositiveInfinity, 0.0f, 42.0f,
47421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
47431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
47441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0.0f, kFP32PositiveInfinity, 42.0f,
47451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
47461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
47471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP32PositiveInfinity, 1.0f, kFP32PositiveInfinity,
47481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32PositiveInfinity,   //  inf + ( inf * 1) = inf
47491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN,         //  inf + (-inf * 1) = NaN
47501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32NegativeInfinity,   // -inf + (-inf * 1) = -inf
47511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN);        // -inf + ( inf * 1) = NaN
47521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP32NegativeInfinity, 1.0f, kFP32PositiveInfinity,
47531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN,         //  inf + (-inf * 1) = NaN
47541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32PositiveInfinity,   //  inf + ( inf * 1) = inf
47551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN,         // -inf + ( inf * 1) = NaN
47561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32NegativeInfinity);  // -inf + (-inf * 1) = -inf
47571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
47581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
47591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
47601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(fmadd_fmsub_double_nans) {
47611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Make sure that NaN propagation works correctly.
47621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double s1 = rawbits_to_double(0x7ff5555511111111);
47631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double s2 = rawbits_to_double(0x7ff5555522222222);
47641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sa = rawbits_to_double(0x7ff55555aaaaaaaa);
47651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double q1 = rawbits_to_double(0x7ffaaaaa11111111);
47661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double q2 = rawbits_to_double(0x7ffaaaaa22222222);
47671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa);
47681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(s1));
47691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(s2));
47701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sa));
47711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(q1));
47721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(q2));
47731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qa));
47741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
47751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // The input NaNs after passing through ProcessNaN.
47761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double s1_proc = rawbits_to_double(0x7ffd555511111111);
47771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double s2_proc = rawbits_to_double(0x7ffd555522222222);
47781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sa_proc = rawbits_to_double(0x7ffd5555aaaaaaaa);
47791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double q1_proc = q1;
47801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double q2_proc = q2;
47811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qa_proc = qa;
47821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(s1_proc));
47831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(s2_proc));
47841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(sa_proc));
47851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(q1_proc));
47861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(q2_proc));
47871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qa_proc));
47881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
4789ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Negated NaNs as it would be done on ARMv8 hardware.
4790ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  double s1_proc_neg = rawbits_to_double(0xfffd555511111111);
4791ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  double sa_proc_neg = rawbits_to_double(0xfffd5555aaaaaaaa);
4792ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  double q1_proc_neg = rawbits_to_double(0xfffaaaaa11111111);
4793ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  double qa_proc_neg = rawbits_to_double(0xfffaaaaaaaaaaaaa);
4794ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  VIXL_ASSERT(IsQuietNaN(s1_proc_neg));
4795ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  VIXL_ASSERT(IsQuietNaN(sa_proc_neg));
4796ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  VIXL_ASSERT(IsQuietNaN(q1_proc_neg));
4797ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  VIXL_ASSERT(IsQuietNaN(qa_proc_neg));
4798ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
47991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Quiet NaNs are propagated.
4800ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
48011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc);
4802ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
4803ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
4804ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
4805ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
4806ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
48071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
48081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Signalling NaNs are propagated, and made quiet.
4809ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, 0, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
48101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0, s2, 0, s2_proc, s2_proc, s2_proc, s2_proc);
4811ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(0, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4812ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
4813ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(0, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4814ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4815ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
48161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
48171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Signalling NaNs take precedence over quiet NaNs.
4818ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, q2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
48191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(q1, s2, qa, s2_proc, s2_proc, s2_proc, s2_proc);
4820ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4821ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
4822ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4823ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4824ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
48251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
48261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // A NaN generated by the intermediate op1 * op2 overrides a quiet NaN in a.
48271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0, kFP64PositiveInfinity, qa,
48281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
48291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
48301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP64PositiveInfinity, 0, qa,
48311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
48321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
48331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0, kFP64NegativeInfinity, qa,
48341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
48351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
48361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP64NegativeInfinity, 0, qa,
48371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
48381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
48391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
48401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
48411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
48421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(fmadd_fmsub_float_nans) {
48431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Make sure that NaN propagation works correctly.
48441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float s1 = rawbits_to_float(0x7f951111);
48451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float s2 = rawbits_to_float(0x7f952222);
48461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sa = rawbits_to_float(0x7f95aaaa);
48471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float q1 = rawbits_to_float(0x7fea1111);
48481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float q2 = rawbits_to_float(0x7fea2222);
48491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qa = rawbits_to_float(0x7feaaaaa);
48501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(s1));
48511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(s2));
48521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sa));
48531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(q1));
48541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(q2));
48551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qa));
48561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
48571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // The input NaNs after passing through ProcessNaN.
48581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float s1_proc = rawbits_to_float(0x7fd51111);
48591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float s2_proc = rawbits_to_float(0x7fd52222);
48601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sa_proc = rawbits_to_float(0x7fd5aaaa);
48611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float q1_proc = q1;
48621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float q2_proc = q2;
48631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qa_proc = qa;
48641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(s1_proc));
48651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(s2_proc));
48661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(sa_proc));
48671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(q1_proc));
48681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(q2_proc));
48691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qa_proc));
48701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
4871ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Negated NaNs as it would be done on ARMv8 hardware.
4872ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  float s1_proc_neg = rawbits_to_float(0xffd51111);
4873ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  float sa_proc_neg = rawbits_to_float(0xffd5aaaa);
4874ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  float q1_proc_neg = rawbits_to_float(0xffea1111);
4875ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  float qa_proc_neg = rawbits_to_float(0xffeaaaaa);
4876ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  VIXL_ASSERT(IsQuietNaN(s1_proc_neg));
4877ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  VIXL_ASSERT(IsQuietNaN(sa_proc_neg));
4878ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  VIXL_ASSERT(IsQuietNaN(q1_proc_neg));
4879ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  VIXL_ASSERT(IsQuietNaN(qa_proc_neg));
4880ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
48811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Quiet NaNs are propagated.
4882ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
48831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc);
4884ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
4885ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
4886ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
4887ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
4888ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
48891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
48901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Signalling NaNs are propagated, and made quiet.
4891ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, 0, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
48921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0, s2, 0, s2_proc, s2_proc, s2_proc, s2_proc);
4893ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(0, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4894ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
4895ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(0, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4896ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4897ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
48981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
48991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Signalling NaNs take precedence over quiet NaNs.
4900ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, q2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
49011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(q1, s2, qa, s2_proc, s2_proc, s2_proc, s2_proc);
4902ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4903ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
4904ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4905ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
4906ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
49071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
49081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // A NaN generated by the intermediate op1 * op2 overrides a quiet NaN in a.
49091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0, kFP32PositiveInfinity, qa,
49101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
49111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
49121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP32PositiveInfinity, 0, qa,
49131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
49141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
49151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(0, kFP32NegativeInfinity, qa,
49161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
49171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
49181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(kFP32NegativeInfinity, 0, qa,
49191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
49201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
4921f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4922f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4923f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fdiv) {
4925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
49281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s14, -0.0f);
49291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s15, kFP32PositiveInfinity);
49301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s16, kFP32NegativeInfinity);
49311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s17, 3.25f);
49321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s18, 2.0f);
49331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s19, 2.0f);
49341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s20, -2.0f);
4935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
4937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
4938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
49391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0.0);
4940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d30, -2.0);
4941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d31, 2.25);
4942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
49431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(s0, s17, s18);
49441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(s1, s18, s19);
49451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(s2, s14, s18);
49461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(s3, s18, s15);
49471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(s4, s18, s16);
49481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(s5, s15, s16);
49491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(s6, s14, s14);
49501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
49511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(d7, d31, d30);
49521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(d8, d29, d31);
49531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(d9, d26, d31);
49541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(d10, d31, d27);
49551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(d11, d31, d28);
49561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(d12, d28, d27);
49571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(d13, d29, d29);
49581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
49591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
49601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
49611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
49621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(1.625f, s0);
49631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(1.0f, s1);
49641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(-0.0f, s2);
49651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(0.0f, s3);
49661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(-0.0f, s4);
49671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s5);
49681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
49691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(-1.125, d7);
4970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d8);
4971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d9);
49721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(0.0, d10);
49731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(-0.0, d11);
49741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d12);
49751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
4976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4981f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic float MinMaxHelper(float n,
4982f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          float m,
4983f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          bool min,
4984f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          float quiet_nan_substitute = 0.0) {
49851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  const uint64_t kFP32QuietNaNMask = 0x00400000;
4986f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint32_t raw_n = float_to_rawbits(n);
4987f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint32_t raw_m = float_to_rawbits(m);
4988f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4989f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  if (isnan(n) && ((raw_n & kFP32QuietNaNMask) == 0)) {
4990f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // n is signalling NaN.
49911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    return rawbits_to_float(raw_n | kFP32QuietNaNMask);
4992f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else if (isnan(m) && ((raw_m & kFP32QuietNaNMask) == 0)) {
4993f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // m is signalling NaN.
49941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    return rawbits_to_float(raw_m | kFP32QuietNaNMask);
4995f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else if (quiet_nan_substitute == 0.0) {
4996f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (isnan(n)) {
4997f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // n is quiet NaN.
4998f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      return n;
4999f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    } else if (isnan(m)) {
5000f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // m is quiet NaN.
5001f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      return m;
5002f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
5003f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else {
5004f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Substitute n or m if one is quiet, but not both.
5005f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (isnan(n) && !isnan(m)) {
5006f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // n is quiet NaN: replace with substitute.
5007f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      n = quiet_nan_substitute;
5008f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    } else if (!isnan(n) && isnan(m)) {
5009f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // m is quiet NaN: replace with substitute.
5010f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      m = quiet_nan_substitute;
5011f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
5012f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
5013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5014f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  if ((n == 0.0) && (m == 0.0) &&
5015f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      (copysign(1.0, n) != copysign(1.0, m))) {
5016f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    return min ? -0.0 : 0.0;
5017f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
5018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5019f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  return min ? fminf(n, m) : fmaxf(n, m);
5020f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
5021f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5022f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5023f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic double MinMaxHelper(double n,
5024f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           double m,
5025f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           bool min,
5026f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           double quiet_nan_substitute = 0.0) {
50271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  const uint64_t kFP64QuietNaNMask = 0x0008000000000000;
5028f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint64_t raw_n = double_to_rawbits(n);
5029f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  uint64_t raw_m = double_to_rawbits(m);
5030f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5031f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  if (isnan(n) && ((raw_n & kFP64QuietNaNMask) == 0)) {
5032f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // n is signalling NaN.
50331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    return rawbits_to_double(raw_n | kFP64QuietNaNMask);
5034f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else if (isnan(m) && ((raw_m & kFP64QuietNaNMask) == 0)) {
5035f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // m is signalling NaN.
50361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    return rawbits_to_double(raw_m | kFP64QuietNaNMask);
5037f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else if (quiet_nan_substitute == 0.0) {
5038f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (isnan(n)) {
5039f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // n is quiet NaN.
5040f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      return n;
5041f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    } else if (isnan(m)) {
5042f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // m is quiet NaN.
5043f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      return m;
5044f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
5045f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  } else {
5046f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    // Substitute n or m if one is quiet, but not both.
5047f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    if (isnan(n) && !isnan(m)) {
5048f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // n is quiet NaN: replace with substitute.
5049f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      n = quiet_nan_substitute;
5050f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    } else if (!isnan(n) && isnan(m)) {
5051f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      // m is quiet NaN: replace with substitute.
5052f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      m = quiet_nan_substitute;
5053f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
5054f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
5055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5056f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  if ((n == 0.0) && (m == 0.0) &&
5057f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      (copysign(1.0, n) != copysign(1.0, m))) {
5058f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    return min ? -0.0 : 0.0;
5059f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
5060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5061f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  return min ? fmin(n, m) : fmax(n, m);
5062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5065f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void FminFmaxDoubleHelper(double n, double m, double min, double max,
5066f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                                 double minnm, double maxnm) {
5067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5070f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d0, n);
5071f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d1, m);
5072f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmin(d28, d0, d1);
5073f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmax(d29, d0, d1);
5074f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fminnm(d30, d0, d1);
5075f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmaxnm(d31, d0, d1);
5076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5080f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(min, d28);
5081f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(max, d29);
5082f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(minnm, d30);
5083f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(maxnm, d31);
5084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5085f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
5086f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
5087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5089f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmax_fmin_d) {
50901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Use non-standard NaNs to check that the payload bits are preserved.
50911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double snan = rawbits_to_double(0x7ff5555512345678);
50921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qnan = rawbits_to_double(0x7ffaaaaa87654321);
50931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
50941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double snan_processed = rawbits_to_double(0x7ffd555512345678);
50951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qnan_processed = qnan;
50961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
50971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(snan));
50981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qnan));
50991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(snan_processed));
51001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qnan_processed));
51011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
5102f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Bootstrap tests.
5103f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(0, 0, 0, 0, 0, 0);
5104f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(0, 1, 0, 1, 0, 1);
5105f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxDoubleHelper(kFP64PositiveInfinity, kFP64NegativeInfinity,
5106f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64NegativeInfinity, kFP64PositiveInfinity,
5107f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       kFP64NegativeInfinity, kFP64PositiveInfinity);
51081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxDoubleHelper(snan, 0,
51091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       snan_processed, snan_processed,
51101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       snan_processed, snan_processed);
51111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxDoubleHelper(0, snan,
51121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       snan_processed, snan_processed,
51131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       snan_processed, snan_processed);
51141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxDoubleHelper(qnan, 0,
51151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       qnan_processed, qnan_processed,
5116f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                       0, 0);
51171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxDoubleHelper(0, qnan,
51181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       qnan_processed, qnan_processed,
51191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       0, 0);
51201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxDoubleHelper(qnan, snan,
51211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       snan_processed, snan_processed,
51221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       snan_processed, snan_processed);
51231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxDoubleHelper(snan, qnan,
51241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       snan_processed, snan_processed,
51251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                       snan_processed, snan_processed);
5126f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5127f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Iterate over all combinations of inputs.
5128f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  double inputs[] = { DBL_MAX, DBL_MIN, 1.0, 0.0,
5129f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      -DBL_MAX, -DBL_MIN, -1.0, -0.0,
5130f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP64PositiveInfinity, kFP64NegativeInfinity,
5131f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP64QuietNaN, kFP64SignallingNaN };
5132f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5133f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const int count = sizeof(inputs) / sizeof(inputs[0]);
5134f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5135f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  for (int in = 0; in < count; in++) {
5136f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    double n = inputs[in];
5137f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    for (int im = 0; im < count; im++) {
5138f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      double m = inputs[im];
5139f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      FminFmaxDoubleHelper(n, m,
5140f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           MinMaxHelper(n, m, true),
5141f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           MinMaxHelper(n, m, false),
5142f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           MinMaxHelper(n, m, true, kFP64PositiveInfinity),
5143f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                           MinMaxHelper(n, m, false, kFP64NegativeInfinity));
5144f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
5145f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
5146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5149f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void FminFmaxFloatHelper(float n, float m, float min, float max,
5150f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                                float minnm, float maxnm) {
5151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
51541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s0, n);
51551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s1, m);
5156f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmin(s28, s0, s1);
5157f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmax(s29, s0, s1);
5158f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fminnm(s30, s0, s1);
5159f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmaxnm(s31, s0, s1);
5160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5164f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(min, s28);
5165f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(max, s29);
5166f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(minnm, s30);
5167f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(maxnm, s31);
5168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5173f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fmax_fmin_s) {
51741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Use non-standard NaNs to check that the payload bits are preserved.
51751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float snan = rawbits_to_float(0x7f951234);
51761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qnan = rawbits_to_float(0x7fea8765);
51771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
51781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float snan_processed = rawbits_to_float(0x7fd51234);
51791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qnan_processed = qnan;
51801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
51811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(snan));
51821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qnan));
51831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(snan_processed));
51841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qnan_processed));
51851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
5186f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Bootstrap tests.
5187f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(0, 0, 0, 0, 0, 0);
5188f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(0, 1, 0, 1, 0, 1);
5189f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  FminFmaxFloatHelper(kFP32PositiveInfinity, kFP32NegativeInfinity,
5190f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32NegativeInfinity, kFP32PositiveInfinity,
5191f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      kFP32NegativeInfinity, kFP32PositiveInfinity);
51921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxFloatHelper(snan, 0,
51931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      snan_processed, snan_processed,
51941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      snan_processed, snan_processed);
51951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxFloatHelper(0, snan,
51961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      snan_processed, snan_processed,
51971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      snan_processed, snan_processed);
51981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxFloatHelper(qnan, 0,
51991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      qnan_processed, qnan_processed,
5200f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                      0, 0);
52011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxFloatHelper(0, qnan,
52021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      qnan_processed, qnan_processed,
52031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      0, 0);
52041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxFloatHelper(qnan, snan,
52051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      snan_processed, snan_processed,
52061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      snan_processed, snan_processed);
52071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FminFmaxFloatHelper(snan, qnan,
52081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      snan_processed, snan_processed,
52091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl                      snan_processed, snan_processed);
5210f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5211f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Iterate over all combinations of inputs.
5212f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  float inputs[] = { FLT_MAX, FLT_MIN, 1.0, 0.0,
5213f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                     -FLT_MAX, -FLT_MIN, -1.0, -0.0,
5214f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                     kFP32PositiveInfinity, kFP32NegativeInfinity,
5215f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                     kFP32QuietNaN, kFP32SignallingNaN };
5216f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5217f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  const int count = sizeof(inputs) / sizeof(inputs[0]);
5218f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5219f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  for (int in = 0; in < count; in++) {
5220f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float n = inputs[in];
5221f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    for (int im = 0; im < count; im++) {
5222f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      float m = inputs[im];
5223f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl      FminFmaxFloatHelper(n, m,
5224f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          MinMaxHelper(n, m, true),
5225f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          MinMaxHelper(n, m, false),
5226f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          MinMaxHelper(n, m, true, kFP32PositiveInfinity),
5227f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl                          MinMaxHelper(n, m, false, kFP32NegativeInfinity));
5228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
5229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
5230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fccmp) {
5234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 0.0);
5238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 0.5);
5239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d18, -0.5);
5240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, -1.0);
5241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 0);
5242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5243578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(s16, s16, NoFlag, eq);
5245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x0, NZCV);
5246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5247578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(s16, s16, VFlag, ne);
5249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x1, NZCV);
5250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5251578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(s16, s17, CFlag, ge);
5253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x2, NZCV);
5254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5255578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(s16, s17, CVFlag, lt);
5257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
5258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5259578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(d18, d18, ZFlag, le);
5261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
5262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5263578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(d18, d18, ZVFlag, gt);
5265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
5266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5267578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(d18, d19, ZCVFlag, ls);
5269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x6, NZCV);
5270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5271578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x20, 0);
5272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fccmp(d18, d19, NFlag, hi);
5273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x7, NZCV);
5274578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5275578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ fccmp(s16, s16, NFlag, al);
5276578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x8, NZCV);
5277578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5278578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ fccmp(d18, d18, NFlag, nv);
5279578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x9, NZCV);
5280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
5285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(VFlag, w1);
5286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w2);
5287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w3);
5288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
5289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZVFlag, w5);
5290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CFlag, w6);
5291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w7);
5292578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(ZCFlag, w8);
5293578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(ZCFlag, w9);
5294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcmp) {
5300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5303f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5304f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Some of these tests require a floating-point scratch register assigned to
5305f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // the macro assembler, but most do not.
53061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  {
53071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    UseScratchRegisterScope temps(&masm);
53081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    temps.ExcludeAll();
53091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    temps.Include(ip0, ip1);
53101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
53111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmov(s8, 0.0);
53121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmov(s9, 0.5);
53131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mov(w18, 0x7f800001);  // Single precision NaN.
53141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmov(s18, w18);
53151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
53161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(s8, s8);
53171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x0, NZCV);
53181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(s8, s9);
53191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x1, NZCV);
53201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(s9, s8);
53211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x2, NZCV);
53221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(s8, s18);
53231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x3, NZCV);
53241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(s18, s18);
53251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x4, NZCV);
53261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(s8, 0.0);
53271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x5, NZCV);
53281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    temps.Include(d0);
53291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(s8, 255.0);
53301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    temps.Exclude(d0);
53311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x6, NZCV);
53321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
53331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmov(d19, 0.0);
53341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmov(d20, 0.5);
53351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mov(x21, 0x7ff0000000000001);  // Double precision NaN.
53361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmov(d21, x21);
53371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
53381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(d19, d19);
53391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x10, NZCV);
53401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(d19, d20);
53411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x11, NZCV);
53421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(d20, d19);
53431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x12, NZCV);
53441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(d19, d21);
53451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x13, NZCV);
53461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(d21, d21);
53471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x14, NZCV);
53481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(d19, 0.0);
53491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x15, NZCV);
53501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    temps.Include(d0);
53511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcmp(d19, 12.3456);
53521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    temps.Exclude(d0);
53531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Mrs(x16, NZCV);
53541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
5355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
5361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w1);
5362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CFlag, w2);
5363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w3);
5364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w4);
5365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
5366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w6);
5367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w10);
5368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w11);
5369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CFlag, w12);
5370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w13);
5371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(CVFlag, w14);
5372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w15);
5373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w16);
5374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcsel) {
5380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
5384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 2.0);
5386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d18, 3.0);
5387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 4.0);
5388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5389578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x16, 0);
5390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcsel(s0, s16, s17, eq);
5391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcsel(s1, s16, s17, ne);
5392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcsel(d2, d18, d19, eq);
5393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcsel(d3, d18, d19, ne);
5394578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ fcsel(s4, s16, s17, al);
5395578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ fcsel(d5, d18, d19, nv);
5396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s1);
5402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(3.0, d2);
5403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(4.0, d3);
5404578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP32(1.0, s4);
5405578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(3.0, d5);
5406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fneg) {
5412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 0.0);
5417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, kFP32PositiveInfinity);
5418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 1.0);
5419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, 0.0);
5420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, kFP64PositiveInfinity);
5421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s0, s16);
5423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s1, s0);
5424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s2, s17);
5425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s3, s2);
5426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s4, s18);
5427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(s5, s4);
5428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d6, d19);
5429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d7, d6);
5430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d8, d20);
5431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d9, d8);
5432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d10, d21);
5433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fneg(d11, d10);
5434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-1.0, s0);
5439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s2);
5441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s3);
5442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s4);
5443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
5444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-1.0, d6);
5445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d7);
5446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d8);
5447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d9);
5448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d10);
5449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d11);
5450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fabs) {
5456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, -1.0);
5460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, -0.0);
5461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, kFP32NegativeInfinity);
5462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, -1.0);
5463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, -0.0);
5464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, kFP64NegativeInfinity);
5465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(s0, s16);
5467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(s1, s0);
5468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(s2, s17);
5469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(s3, s18);
5470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(d4, d19);
5471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(d5, d4);
5472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(d6, d20);
5473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fabs(d7, d21);
5474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s2);
5481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s3);
5482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d4);
5483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d5);
5484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d6);
5485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d7);
5486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fsqrt) {
5492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 0.0);
5496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.0);
5497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 0.25);
5498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, 65536.0);
5499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, -0.0);
5500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32PositiveInfinity);
55011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, -1.0);
55021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d23, 0.0);
55031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d24, 1.0);
55041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d25, 0.25);
55051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d26, 4294967296.0);
55061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d27, -0.0);
55071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d28, kFP64PositiveInfinity);
55081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, -1.0);
5509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s0, s16);
5511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s1, s17);
5512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s2, s18);
5513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s3, s19);
5514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s4, s20);
5515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(s5, s21);
55161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsqrt(s6, s22);
5517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d7, d23);
5518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d8, d24);
5519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d9, d25);
5520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d10, d26);
5521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fsqrt(d11, d27);
55221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsqrt(d12, d28);
55231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsqrt(d13, d29);
5524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s0);
5529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.5, s2);
5531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(256.0, s3);
5532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s4);
5533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
55341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
55351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(0.0, d7);
55361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(1.0, d8);
55371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(0.5, d9);
55381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(65536.0, d10);
55391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(-0.0, d11);
55401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP32PositiveInfinity, d12);
55411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
5542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5547f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(frinta) {
5548f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
5549f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5550f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
5551f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s16, 1.0);
5552f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s17, 1.1);
5553f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s18, 1.5);
5554f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s19, 1.9);
5555f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s20, 2.5);
5556f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s21, -1.5);
5557f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s22, -2.5);
5558f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5559f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5560f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s25, 0.0);
5561f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s26, -0.0);
5562ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s27, -0.2);
5563f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5564f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s0, s16);
5565f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s1, s17);
5566f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s2, s18);
5567f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s3, s19);
5568f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s4, s20);
5569f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s5, s21);
5570f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s6, s22);
5571f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s7, s23);
5572f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s8, s24);
5573f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s9, s25);
5574f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Frinta(s10, s26);
5575ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(s11, s27);
5576f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5577f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d16, 1.0);
5578f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d17, 1.1);
5579f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d18, 1.5);
5580f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d19, 1.9);
5581f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d20, 2.5);
5582f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d21, -1.5);
5583f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d22, -2.5);
5584f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
5585f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
5586f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d25, 0.0);
5587f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d26, -0.0);
5588ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d27, -0.2);
5589f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5590ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d12, d16);
5591ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d13, d17);
5592ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d14, d18);
5593ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d15, d19);
5594ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d16, d20);
5595ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d17, d21);
5596ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d18, d22);
5597ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d19, d23);
5598ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d20, d24);
5599ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d21, d25);
5600ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d22, d26);
5601ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frinta(d23, d27);
5602f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
5603f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5604f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
5605f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5606f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5607f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5608f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
5609f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
5610f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(3.0, s4);
5611f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
5612f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(-3.0, s6);
5613f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
5614f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
5615f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
5616f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
5617ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-0.0, s11);
5618f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
5619ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
5620f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
5621ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
5622ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(3.0, d16);
5623ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
5624ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-3.0, d18);
5625ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
5626ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
5627ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
5628ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
5629ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-0.0, d23);
5630ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5631ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  TEARDOWN();
5632ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl}
5633ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5634ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5635ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixlTEST(frintm) {
5636ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  SETUP();
5637ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5638ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  START();
5639ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s16, 1.0);
5640ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s17, 1.1);
5641ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s18, 1.5);
5642ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s19, 1.9);
5643ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s20, 2.5);
5644ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s21, -1.5);
5645ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s22, -2.5);
5646ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5647ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5648ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s25, 0.0);
5649ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s26, -0.0);
5650ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s27, -0.2);
5651ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5652ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s0, s16);
5653ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s1, s17);
5654ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s2, s18);
5655ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s3, s19);
5656ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s4, s20);
5657ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s5, s21);
5658ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s6, s22);
5659ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s7, s23);
5660ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s8, s24);
5661ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s9, s25);
5662ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s10, s26);
5663ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(s11, s27);
5664ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5665ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d16, 1.0);
5666ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d17, 1.1);
5667ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d18, 1.5);
5668ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d19, 1.9);
5669ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d20, 2.5);
5670ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d21, -1.5);
5671ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d22, -2.5);
5672ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
5673ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
5674ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d25, 0.0);
5675ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d26, -0.0);
5676ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d27, -0.2);
5677ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5678ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d12, d16);
5679ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d13, d17);
5680ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d14, d18);
5681ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d15, d19);
5682ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d16, d20);
5683ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d17, d21);
5684ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d18, d22);
5685ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d19, d23);
5686ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d20, d24);
5687ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d21, d25);
5688ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d22, d26);
5689ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintm(d23, d27);
5690ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  END();
5691ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5692ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  RUN();
5693ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5694ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5695ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5696ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(1.0, s2);
5697ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(1.0, s3);
5698ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
5699ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
5700ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-3.0, s6);
5701ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
5702ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
5703ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
5704ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
5705ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-1.0, s11);
5706ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
5707ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
5708ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(1.0, d14);
5709ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(1.0, d15);
5710ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(2.0, d16);
5711ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
5712ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-3.0, d18);
5713ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
5714ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
5715ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
5716ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
5717ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-1.0, d23);
5718f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5719f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
5720f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
5721f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5722f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(frintn) {
5724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
5729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
5730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, 1.9);
5731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, 2.5);
5732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, -1.5);
5733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, -2.5);
5734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s25, 0.0);
5737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s26, -0.0);
5738ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s27, -0.2);
5739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s0, s16);
5741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s1, s17);
5742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s2, s18);
5743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s3, s19);
5744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s4, s20);
5745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s5, s21);
5746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s6, s22);
5747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s7, s23);
5748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s8, s24);
5749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s9, s25);
5750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintn(s10, s26);
5751ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(s11, s27);
5752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d16, 1.0);
5754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d17, 1.1);
5755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d18, 1.5);
5756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 1.9);
5757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, 2.5);
5758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, -1.5);
5759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d22, -2.5);
5760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
5761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
5762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 0.0);
5763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
5764ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d27, -0.2);
5765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5766ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d12, d16);
5767ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d13, d17);
5768ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d14, d18);
5769ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d15, d19);
5770ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d16, d20);
5771ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d17, d21);
5772ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d18, d22);
5773ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d19, d23);
5774ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d20, d24);
5775ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d21, d25);
5776ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d22, d26);
5777ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Frintn(d23, d27);
5778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
5785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
5786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
5787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
5788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
5789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
5790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
5791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
5792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
5793ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-0.0, s11);
5794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
5795ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
5796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
5797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
5798ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(2.0, d16);
5799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
5800ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-2.0, d18);
5801ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
5802ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
5803ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
5804ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
5805ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP64(-0.0, d23);
5806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(frintz) {
5812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
5817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
5818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, 1.9);
5819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, 2.5);
5820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, -1.5);
5821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, -2.5);
5822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s25, 0.0);
5825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s26, -0.0);
5826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s0, s16);
5828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s1, s17);
5829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s2, s18);
5830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s3, s19);
5831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s4, s20);
5832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s5, s21);
5833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s6, s22);
5834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s7, s23);
5835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s8, s24);
5836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s9, s25);
5837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(s10, s26);
5838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d16, 1.0);
5840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d17, 1.1);
5841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d18, 1.5);
5842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d19, 1.9);
5843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d20, 2.5);
5844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d21, -1.5);
5845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d22, -2.5);
5846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
5847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
5848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 0.0);
5849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -0.0);
5850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d11, d16);
5852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d12, d17);
5853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d13, d18);
5854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d14, d19);
5855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d15, d20);
5856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d16, d21);
5857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d17, d22);
5858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d18, d23);
5859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d19, d24);
5860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d20, d25);
5861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Frintz(d21, d26);
5862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
5867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
5868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s2);
5869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s3);
5870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
5871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-1.0, s5);
5872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
5873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
5874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
5875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
5876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
5877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d11);
5878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
5879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
5880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d14);
5881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
5882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-1.0, d16);
5883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
5884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d18);
5885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d19);
5886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0, d20);
5887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0, d21);
5888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5893578645f14e122d2b87d907e298cda7e7d0babf1farmvixlTEST(fcvt_ds) {
5894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
5897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
5898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
5899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
5900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, 1.9);
5901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, 2.5);
5902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, -1.5);
5903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s22, -2.5);
5904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
5905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
5906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s25, 0.0);
5907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s26, -0.0);
5908578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fmov(s27, FLT_MAX);
5909578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fmov(s28, FLT_MIN);
5910578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fmov(s29, rawbits_to_float(0x7fc12345));   // Quiet NaN.
5911578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fmov(s30, rawbits_to_float(0x7f812345));   // Signalling NaN.
5912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d0, s16);
5914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d1, s17);
5915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d2, s18);
5916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d3, s19);
5917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d4, s20);
5918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d5, s21);
5919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d6, s22);
5920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d7, s23);
5921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d8, s24);
5922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d9, s25);
5923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvt(d10, s26);
5924578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fcvt(d11, s27);
5925578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fcvt(d12, s28);
5926578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fcvt(d13, s29);
5927578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Fcvt(d14, s30);
5928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0f, d0);
5933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.1f, d1);
5934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.5f, d2);
5935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.9f, d3);
5936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.5f, d4);
5937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-1.5f, d5);
5938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-2.5f, d6);
5939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d7);
5940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d8);
5941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(0.0f, d9);
5942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(-0.0f, d10);
5943578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(FLT_MAX, d11);
5944578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(FLT_MIN, d12);
5945578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5946578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check that the NaN payload is preserved according to A64 conversion rules:
5947578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  - The sign bit is preserved.
5948578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  - The top bit of the mantissa is forced to 1 (making it a quiet NaN).
5949578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  - The remaining mantissa bits are copied until they run out.
5950578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  - The low-order bits that haven't already been assigned are set to 0.
5951578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d13);
5952578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d14);
5953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5958578645f14e122d2b87d907e298cda7e7d0babf1farmvixlTEST(fcvt_sd) {
5959ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Test simple conversions here. Complex behaviour (such as rounding
5960ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // specifics) are tested in the simulator tests.
5961ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5962ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  SETUP();
5963ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5964ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  START();
5965ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d16, 1.0);
5966ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d17, 1.1);
5967ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d18, 1.5);
5968ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d19, 1.9);
5969ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d20, 2.5);
5970ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d21, -1.5);
5971ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d22, -2.5);
5972ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
5973ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
5974ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d25, 0.0);
5975ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d26, -0.0);
5976ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d27, FLT_MAX);
5977ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d28, FLT_MIN);
5978ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d29, rawbits_to_double(0x7ff82468a0000000));   // Quiet NaN.
5979ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d30, rawbits_to_double(0x7ff02468a0000000));   // Signalling NaN.
5980ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5981ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s0, d16);
5982ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s1, d17);
5983ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s2, d18);
5984ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s3, d19);
5985ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s4, d20);
5986ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s5, d21);
5987ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s6, d22);
5988ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s7, d23);
5989ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s8, d24);
5990ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s9, d25);
5991ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s10, d26);
5992ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s11, d27);
5993ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s12, d28);
5994ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s13, d29);
5995ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fcvt(s14, d30);
5996ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  END();
5997ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
5998ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  RUN();
5999ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
6000ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(1.0f, s0);
6001ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(1.1f, s1);
6002ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(1.5f, s2);
6003ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(1.9f, s3);
6004ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(2.5f, s4);
6005ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-1.5f, s5);
6006ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-2.5f, s6);
6007ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
6008ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
6009ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(0.0f, s9);
6010ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(-0.0f, s10);
6011ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(FLT_MAX, s11);
6012ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(FLT_MIN, s12);
6013ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
6014ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Check that the NaN payload is preserved according to A64 conversion rules:
6015ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  //  - The sign bit is preserved.
6016ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  //  - The top bit of the mantissa is forced to 1 (making it a quiet NaN).
6017ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  //  - The remaining mantissa bits are copied until they run out.
6018ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  //  - The low-order bits that haven't already been assigned are set to 0.
6019ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(0x7fc12345), s13);
6020ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(0x7fc12345), s14);
6021ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
6022ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  TEARDOWN();
6023578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
6024578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6025578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6026f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fcvtas) {
6027f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
6028f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6029f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
6030f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s0, 1.0);
6031f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s1, 1.1);
6032f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s2, 2.5);
6033f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s3, -2.5);
6034f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6035f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
6036f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s6, 0x7fffff80);  // Largest float < INT32_MAX.
6037f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fneg(s7, s6);          // Smallest float > INT32_MIN.
6038f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d8, 1.0);
6039f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d9, 1.1);
6040f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d10, 2.5);
6041f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d11, -2.5);
6042f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6043f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6044f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d14, kWMaxInt - 1);
6045f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d15, kWMinInt + 1);
6046f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s17, 1.1);
6047f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s18, 2.5);
6048f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s19, -2.5);
6049f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6050f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
60511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, 0x7fffff8000000000);     // Largest float < INT64_MAX.
6052f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fneg(s23, s22);                    // Smallest float > INT64_MIN.
6053f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d24, 1.1);
6054f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d25, 2.5);
6055f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d26, -2.5);
6056f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6057f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
60581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0x7ffffffffffffc00);     // Largest double < INT64_MAX.
6059f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fneg(d30, d29);                    // Smallest double > INT64_MIN.
6060f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6061f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w0, s0);
6062f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w1, s1);
6063f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w2, s2);
6064f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w3, s3);
6065f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w4, s4);
6066f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w5, s5);
6067f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w6, s6);
6068f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w7, s7);
6069f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w8, d8);
6070f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w9, d9);
6071f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w10, d10);
6072f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w11, d11);
6073f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w12, d12);
6074f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w13, d13);
6075f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w14, d14);
6076f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(w15, d15);
6077f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x17, s17);
6078f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x18, s18);
6079f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x19, s19);
6080f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x20, s20);
6081f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x21, s21);
6082f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x22, s22);
6083f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x23, s23);
6084f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x24, d24);
6085f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x25, d25);
6086f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x26, d26);
6087f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x27, d27);
6088f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x28, d28);
6089f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x29, d29);
6090f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtas(x30, d30);
6091f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
6092f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6093f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
6094f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6095f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x0);
6096f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x1);
6097f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x2);
6098f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffd, x3);
6099f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
6100f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
6101f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6102f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
6103f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x8);
6104f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x9);
6105f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x10);
6106f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffd, x11);
6107f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
6108f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
6109f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6110f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
6111f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x17);
6112f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x18);
61131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffd, x19);
61141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x20);
61151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x21);
61161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
61171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000008000000000, x23);
6118f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x24);
6119f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x25);
61201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffd, x26);
61211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x27);
61221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x28);
61231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
61241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000400, x30);
6125f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6126f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
6127f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
6128f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6129f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6130f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(fcvtau) {
6131f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
6132f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6133f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
6134f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s0, 1.0);
6135f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s1, 1.1);
6136f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s2, 2.5);
6137f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s3, -2.5);
6138f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6139f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
6140f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s6, 0xffffff00);  // Largest float < UINT32_MAX.
6141f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d8, 1.0);
6142f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d9, 1.1);
6143f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d10, 2.5);
6144f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d11, -2.5);
6145f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6146f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6147f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d14, 0xfffffffe);
6148f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s16, 1.0);
6149f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s17, 1.1);
6150f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s18, 2.5);
6151f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s19, -2.5);
6152f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6153f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
61541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, 0xffffff0000000000);  // Largest float < UINT64_MAX.
6155f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d24, 1.1);
6156f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d25, 2.5);
6157f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d26, -2.5);
6158f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6159f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
61601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0xfffffffffffff800);  // Largest double < UINT64_MAX.
61611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s30, 0x100000000);
6162f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6163f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w0, s0);
6164f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w1, s1);
6165f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w2, s2);
6166f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w3, s3);
6167f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w4, s4);
6168f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w5, s5);
6169f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w6, s6);
6170f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w8, d8);
6171f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w9, d9);
6172f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w10, d10);
6173f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w11, d11);
6174f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w12, d12);
6175f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w13, d13);
6176f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w14, d14);
6177f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w15, d15);
6178f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x16, s16);
6179f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x17, s17);
6180f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x18, s18);
6181f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x19, s19);
6182f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x20, s20);
6183f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x21, s21);
6184f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x22, s22);
6185f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x24, d24);
6186f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x25, d25);
6187f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x26, d26);
6188f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x27, d27);
6189f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x28, d28);
6190f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(x29, d29);
6191f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Fcvtau(w30, s30);
6192f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
6193f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6194f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
6195f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6196f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x0);
6197f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x1);
6198f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x2);
6199f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x3);
6200f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
6201f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x5);
6202f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffff00, x6);
6203f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x8);
6204f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x9);
6205f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x10);
6206f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x11);
6207f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
6208f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x13);
6209f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xfffffffe, x14);
6210f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x16);
6211f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x17);
6212f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x18);
6213f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x19);
62141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
6215f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x21);
62161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffff0000000000, x22);
6217f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(1, x24);
6218f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(3, x25);
6219f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x26);
62201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x27);
6221f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x28);
62221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffff800, x29);
6223f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0xffffffff, x30);
6224f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6225f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
6226f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
6227f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6228f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtms) {
6230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
62391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
62401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
6241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
62541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
62551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
6256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
62611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
62621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
6263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w0, s0);
6265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w1, s1);
6266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w2, s2);
6267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w3, s3);
6268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w4, s4);
6269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w5, s5);
6270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w6, s6);
6271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w7, s7);
6272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w8, d8);
6273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w9, d9);
6274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w10, d10);
6275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w11, d11);
6276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w12, d12);
6277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w13, d13);
6278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w14, d14);
6279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(w15, d15);
6280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x17, s17);
6281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x18, s18);
6282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x19, s19);
6283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x20, s20);
6284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x21, s21);
6285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x22, s22);
6286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x23, s23);
6287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x24, d24);
6288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x25, d25);
6289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x26, d26);
6290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x27, d27);
6291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x28, d28);
6292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x29, d29);
6293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtms(x30, d30);
6294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
6301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x3);
6302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
6303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
6304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
6306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
6309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
6310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
6311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
6312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
6314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x18);
63161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x19);
63171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x20);
63181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x21);
63191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
63201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000008000000000, x23);
6321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x25);
63231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x26);
63241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x27);
63251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x28);
63261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
63271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000400, x30);
6328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtmu) {
6334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
63431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
63441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
6345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
63581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
63591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
6360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
63651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
63661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
6367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w0, s0);
6369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w1, s1);
6370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w2, s2);
6371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w3, s3);
6372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w4, s4);
6373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w5, s5);
6374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w6, s6);
6375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w7, s7);
6376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w8, d8);
6377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w9, d9);
6378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w10, d10);
6379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w11, d11);
6380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w12, d12);
6381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w13, d13);
6382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(w14, d14);
6383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x17, s17);
6384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x18, s18);
6385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x19, s19);
6386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x20, s20);
6387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x21, s21);
6388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x22, s22);
6389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x23, s23);
6390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x24, d24);
6391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x25, d25);
6392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x26, d26);
6393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x27, d27);
6394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x28, d28);
6395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x29, d29);
6396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtmu(x30, d30);
6397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
6404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
6405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
6406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
6407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x7);
6409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
6412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
6413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
6414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x13);
6415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x18);
64181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x19);
64191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
64201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x21);
64211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
64221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x23);
6423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x25);
64251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x26);
64261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x27);
64271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x28);
64281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
64291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x30);
6430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtns) {
6436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
64451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
64461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
6447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
64601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
64611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
6462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
64671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
64681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
6469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w0, s0);
6471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w1, s1);
6472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w2, s2);
6473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w3, s3);
6474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w4, s4);
6475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w5, s5);
6476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w6, s6);
6477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w7, s7);
6478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w8, d8);
6479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w9, d9);
6480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w10, d10);
6481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w11, d11);
6482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w12, d12);
6483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w13, d13);
6484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w14, d14);
6485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(w15, d15);
6486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x17, s17);
6487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x18, s18);
6488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x19, s19);
6489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x20, s20);
6490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x21, s21);
6491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x22, s22);
6492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x23, s23);
6493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x24, d24);
6494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x25, d25);
6495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x26, d26);
6496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x27, d27);
6497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x28, d28);
6498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x29, d29);
6499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtns(x30, d30);
6500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x2);
6507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x3);
6508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
6509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
6510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
6512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x10);
6515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
6516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
6517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
6518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
6520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x18);
65221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x19);
65231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x20);
65241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x21);
65251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
65261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000008000000000, x23);
6527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x25);
65291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x26);
65301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x27);
65311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x28);
65321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
65331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000400, x30);
6534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtnu) {
6540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
6549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s6, 0xffffff00);  // Largest float < UINT32_MAX.
6550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, 0xfffffffe);
6557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s16, 1.0);
6558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
65631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, 0xffffff0000000000);  // Largest float < UINT64_MAX.
6564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
65691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0xfffffffffffff800);  // Largest double < UINT64_MAX.
65701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s30, 0x100000000);
6571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w0, s0);
6573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w1, s1);
6574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w2, s2);
6575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w3, s3);
6576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w4, s4);
6577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w5, s5);
6578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w6, s6);
6579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w8, d8);
6580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w9, d9);
6581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w10, d10);
6582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w11, d11);
6583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w12, d12);
6584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w13, d13);
6585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w14, d14);
6586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w15, d15);
6587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x16, s16);
6588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x17, s17);
6589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x18, s18);
6590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x19, s19);
6591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x20, s20);
6592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x21, s21);
6593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x22, s22);
6594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x24, d24);
6595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x25, d25);
6596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x26, d26);
6597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x27, d27);
6598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x28, d28);
6599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(x29, d29);
6600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtnu(w30, s30);
6601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x2);
6608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
6609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
6610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
6611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff00, x6);
6612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x10);
6615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
6616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
6617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x13);
6618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x14);
6619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x16);
6620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x18);
6622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x19);
66231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
6624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x21);
66251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffff0000000000, x22);
6626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x25);
6628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x26);
66291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x27);
6630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x28);
66311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffff800, x29);
6632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x30);
6633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtzs) {
6639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
66481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
66491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
6650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
66631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
66641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
6665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
66701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
66711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
6672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w0, s0);
6674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w1, s1);
6675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w2, s2);
6676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w3, s3);
6677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w4, s4);
6678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w5, s5);
6679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w6, s6);
6680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w7, s7);
6681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w8, d8);
6682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w9, d9);
6683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w10, d10);
6684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w11, d11);
6685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w12, d12);
6686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w13, d13);
6687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w14, d14);
6688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(w15, d15);
6689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x17, s17);
6690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x18, s18);
6691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x19, s19);
6692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x20, s20);
6693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x21, s21);
6694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x22, s22);
6695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x23, s23);
6696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x24, d24);
6697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x25, d25);
6698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x26, d26);
6699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x27, d27);
6700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x28, d28);
6701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x29, d29);
6702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzs(x30, d30);
6703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
6710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
6711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
6712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
6713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
6715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
6718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x11);
6719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
6720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
6721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
6723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x18);
67251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x19);
67261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x20);
67271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x21);
67281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
67291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000008000000000, x23);
6730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x25);
67321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x26);
67331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x27);
67341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x28);
67351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
67361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000400, x30);
6737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(fcvtzu) {
6742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s0, 1.0);
6746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.1);
6747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 1.5);
6748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s3, -1.5);
6749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
6750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
67511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
67521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
6753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d8, 1.0);
6754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d9, 1.1);
6755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 1.5);
6756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d11, -1.5);
6757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
6758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
6759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d14, kWMaxInt - 1);
6760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d15, kWMinInt + 1);
6761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s17, 1.1);
6762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s18, 1.5);
6763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s19, -1.5);
6764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
6765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
67661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
67671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
6768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d24, 1.1);
6769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d25, 1.5);
6770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d26, -1.5);
6771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
6772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
67731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
67741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
6775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w0, s0);
6777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w1, s1);
6778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w2, s2);
6779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w3, s3);
6780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w4, s4);
6781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w5, s5);
6782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w6, s6);
6783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w7, s7);
6784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w8, d8);
6785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w9, d9);
6786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w10, d10);
6787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w11, d11);
6788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w12, d12);
6789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w13, d13);
6790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(w14, d14);
6791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x17, s17);
6792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x18, s18);
6793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x19, s19);
6794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x20, s20);
6795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x21, s21);
6796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x22, s22);
6797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x23, s23);
6798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x24, d24);
6799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x25, d25);
6800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x26, d26);
6801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x27, d27);
6802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x28, d28);
6803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x29, d29);
6804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fcvtzu(x30, d30);
6805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
6810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
6811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
6812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
6813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
6814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
6815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
6816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x7);
6817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x8);
6818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
6819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
6820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
6821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
6822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x13);
6823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
6824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x17);
6825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x18);
68261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x19);
68271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
68281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x21);
68291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
68301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x23);
6831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x24);
6832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x25);
68331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x26);
68341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x27);
68351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x28);
68361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
68371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0, x30);
6838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6843578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// Test that scvtf and ucvtf can convert the 64-bit input into the expected
6844578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// value. All possible values of 'fbits' are tested. The expected value is
6845578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// modified accordingly in each case.
6846578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//
6847578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// The expected value is specified as the bit encoding of the expected double
6848578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// produced by scvtf (expected_scvtf_bits) as well as ucvtf
6849578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// (expected_ucvtf_bits).
6850578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//
6851578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// Where the input value is representable by int32_t or uint32_t, conversions
6852578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// from W registers will also be tested.
6853578645f14e122d2b87d907e298cda7e7d0babf1farmvixlstatic void TestUScvtfHelper(uint64_t in,
6854578645f14e122d2b87d907e298cda7e7d0babf1farmvixl                             uint64_t expected_scvtf_bits,
6855578645f14e122d2b87d907e298cda7e7d0babf1farmvixl                             uint64_t expected_ucvtf_bits) {
6856578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint64_t u64 = in;
6857578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint32_t u32 = u64 & 0xffffffff;
6858578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int64_t s64 = static_cast<int64_t>(in);
6859578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int32_t s32 = s64 & 0x7fffffff;
6860578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6861578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  bool cvtf_s32 = (s64 == s32);
6862578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  bool cvtf_u32 = (u64 == u32);
6863578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6864578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double results_scvtf_x[65];
6865578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double results_ucvtf_x[65];
6866578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double results_scvtf_w[33];
6867578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double results_ucvtf_w[33];
6868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6869578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  SETUP();
6870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
6871578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
68721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, reinterpret_cast<uintptr_t>(results_scvtf_x));
68731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, reinterpret_cast<uintptr_t>(results_ucvtf_x));
68741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(results_scvtf_w));
68751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, reinterpret_cast<uintptr_t>(results_ucvtf_w));
6876578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6877578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x10, s64);
6878578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6879578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Corrupt the top word, in case it is accidentally used during W-register
6880578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // conversions.
6881578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x11, 0x5555555555555555);
6882578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bfi(x11, x10, 0, kWRegSize);
6883578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6884578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test integer conversions.
6885578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Scvtf(d0, x10);
6886578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ucvtf(d1, x10);
6887578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Scvtf(d2, w11);
6888578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ucvtf(d3, w11);
6889578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(d0, MemOperand(x0));
6890578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(d1, MemOperand(x1));
6891578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(d2, MemOperand(x2));
6892578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(d3, MemOperand(x3));
6893578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6894578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test all possible values of fbits.
6895578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 1; fbits <= 32; fbits++) {
6896578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(d0, x10, fbits);
6897578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(d1, x10, fbits);
6898578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(d2, w11, fbits);
6899578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(d3, w11, fbits);
6900578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d0, MemOperand(x0, fbits * kDRegSizeInBytes));
6901578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d1, MemOperand(x1, fbits * kDRegSizeInBytes));
6902578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d2, MemOperand(x2, fbits * kDRegSizeInBytes));
6903578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d3, MemOperand(x3, fbits * kDRegSizeInBytes));
6904578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6905578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6906578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Conversions from W registers can only handle fbits values <= 32, so just
6907578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // test conversions from X registers for 32 < fbits <= 64.
6908578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
6909578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(d0, x10, fbits);
6910578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(d1, x10, fbits);
6911578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d0, MemOperand(x0, fbits * kDRegSizeInBytes));
6912578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(d1, MemOperand(x1, fbits * kDRegSizeInBytes));
6913578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6914578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6915578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  END();
6916578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  RUN();
6917578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6918578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check the results.
6919578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double expected_scvtf_base = rawbits_to_double(expected_scvtf_bits);
6920578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  double expected_ucvtf_base = rawbits_to_double(expected_ucvtf_bits);
6921578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6922578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 0; fbits <= 32; fbits++) {
6923578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double expected_scvtf = expected_scvtf_base / pow(2, fbits);
6924578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double expected_ucvtf = expected_ucvtf_base / pow(2, fbits);
6925578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]);
6926578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]);
6927578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (cvtf_s32) ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_w[fbits]);
6928578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (cvtf_u32) ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_w[fbits]);
6929578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6930578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
6931578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double expected_scvtf = expected_scvtf_base / pow(2, fbits);
6932578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    double expected_ucvtf = expected_ucvtf_base / pow(2, fbits);
6933578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]);
6934578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]);
6935578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
6936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6941578645f14e122d2b87d907e298cda7e7d0babf1farmvixlTEST(scvtf_ucvtf_double) {
6942578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Simple conversions of positive numbers which require no rounding; the
6943578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // results should not depened on the rounding mode, and ucvtf and scvtf should
6944578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // produce the same result.
6945578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000000000000, 0x0000000000000000, 0x0000000000000000);
6946578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000000000001, 0x3ff0000000000000, 0x3ff0000000000000);
6947578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000040000000, 0x41d0000000000000, 0x41d0000000000000);
6948578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000100000000, 0x41f0000000000000, 0x41f0000000000000);
6949578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x4000000000000000, 0x43d0000000000000, 0x43d0000000000000);
6950578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test mantissa extremities.
6951578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x4000000000000400, 0x43d0000000000001, 0x43d0000000000001);
6952578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The largest int32_t that fits in a double.
6953578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x000000007fffffff, 0x41dfffffffc00000, 0x41dfffffffc00000);
6954578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Values that would be negative if treated as an int32_t.
6955578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x00000000ffffffff, 0x41efffffffe00000, 0x41efffffffe00000);
6956578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000080000000, 0x41e0000000000000, 0x41e0000000000000);
6957578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000080000001, 0x41e0000000200000, 0x41e0000000200000);
6958578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The largest int64_t that fits in a double.
6959578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x7ffffffffffffc00, 0x43dfffffffffffff, 0x43dfffffffffffff);
6960578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check for bit pattern reproduction.
6961578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0123456789abcde0, 0x43723456789abcde, 0x43723456789abcde);
6962578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x0000000012345678, 0x41b2345678000000, 0x41b2345678000000);
6963578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6964578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Simple conversions of negative int64_t values. These require no rounding,
6965578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // and the results should not depend on the rounding mode.
6966578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xffffffffc0000000, 0xc1d0000000000000, 0x43effffffff80000);
6967578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xffffffff00000000, 0xc1f0000000000000, 0x43efffffffe00000);
6968578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xc000000000000000, 0xc3d0000000000000, 0x43e8000000000000);
6969578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6970578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Conversions which require rounding.
6971578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000000, 0x43b0000000000000, 0x43b0000000000000);
6972578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000001, 0x43b0000000000000, 0x43b0000000000000);
6973578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000080, 0x43b0000000000000, 0x43b0000000000000);
6974578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000081, 0x43b0000000000001, 0x43b0000000000001);
6975578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000100, 0x43b0000000000001, 0x43b0000000000001);
6976578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000101, 0x43b0000000000001, 0x43b0000000000001);
6977578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000180, 0x43b0000000000002, 0x43b0000000000002);
6978578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000181, 0x43b0000000000002, 0x43b0000000000002);
6979578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000200, 0x43b0000000000002, 0x43b0000000000002);
6980578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000201, 0x43b0000000000002, 0x43b0000000000002);
6981578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000280, 0x43b0000000000002, 0x43b0000000000002);
6982578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000281, 0x43b0000000000003, 0x43b0000000000003);
6983578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x1000000000000300, 0x43b0000000000003, 0x43b0000000000003);
6984578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check rounding of negative int64_t values (and large uint64_t values).
6985578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000000, 0xc3e0000000000000, 0x43e0000000000000);
6986578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000001, 0xc3e0000000000000, 0x43e0000000000000);
6987578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000200, 0xc3e0000000000000, 0x43e0000000000000);
6988578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000201, 0xc3dfffffffffffff, 0x43e0000000000000);
6989578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000400, 0xc3dfffffffffffff, 0x43e0000000000000);
6990578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000401, 0xc3dfffffffffffff, 0x43e0000000000001);
6991578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000600, 0xc3dffffffffffffe, 0x43e0000000000001);
6992578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000601, 0xc3dffffffffffffe, 0x43e0000000000001);
6993578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000800, 0xc3dffffffffffffe, 0x43e0000000000001);
6994578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000801, 0xc3dffffffffffffe, 0x43e0000000000001);
6995578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000a00, 0xc3dffffffffffffe, 0x43e0000000000001);
6996578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000a01, 0xc3dffffffffffffd, 0x43e0000000000001);
6997578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x8000000000000c00, 0xc3dffffffffffffd, 0x43e0000000000002);
6998578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Round up to produce a result that's too big for the input to represent.
6999578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x7ffffffffffffe00, 0x43e0000000000000, 0x43e0000000000000);
7000578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0x7fffffffffffffff, 0x43e0000000000000, 0x43e0000000000000);
7001578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xfffffffffffffc00, 0xc090000000000000, 0x43f0000000000000);
7002578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtfHelper(0xffffffffffffffff, 0xbff0000000000000, 0x43f0000000000000);
7003578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
7004578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7006578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// The same as TestUScvtfHelper, but convert to floats.
7007578645f14e122d2b87d907e298cda7e7d0babf1farmvixlstatic void TestUScvtf32Helper(uint64_t in,
7008578645f14e122d2b87d907e298cda7e7d0babf1farmvixl                               uint32_t expected_scvtf_bits,
7009578645f14e122d2b87d907e298cda7e7d0babf1farmvixl                               uint32_t expected_ucvtf_bits) {
7010578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint64_t u64 = in;
7011578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint32_t u32 = u64 & 0xffffffff;
7012578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int64_t s64 = static_cast<int64_t>(in);
7013578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  int32_t s32 = s64 & 0x7fffffff;
7014578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7015578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  bool cvtf_s32 = (s64 == s32);
7016578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  bool cvtf_u32 = (u64 == u32);
7017578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7018578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float results_scvtf_x[65];
7019578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float results_ucvtf_x[65];
7020578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float results_scvtf_w[33];
7021578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float results_ucvtf_w[33];
7022578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7023578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  SETUP();
7024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
70261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, reinterpret_cast<uintptr_t>(results_scvtf_x));
70271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, reinterpret_cast<uintptr_t>(results_ucvtf_x));
70281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(results_scvtf_w));
70291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, reinterpret_cast<uintptr_t>(results_ucvtf_w));
7030578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7031578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x10, s64);
7032578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7033578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Corrupt the top word, in case it is accidentally used during W-register
7034578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // conversions.
7035578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x11, 0x5555555555555555);
7036578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bfi(x11, x10, 0, kWRegSize);
7037578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7038578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test integer conversions.
7039578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Scvtf(s0, x10);
7040578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ucvtf(s1, x10);
7041578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Scvtf(s2, w11);
7042578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Ucvtf(s3, w11);
7043578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(s0, MemOperand(x0));
7044578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(s1, MemOperand(x1));
7045578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(s2, MemOperand(x2));
7046578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Str(s3, MemOperand(x3));
7047578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7048578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test all possible values of fbits.
7049578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 1; fbits <= 32; fbits++) {
7050578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(s0, x10, fbits);
7051578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(s1, x10, fbits);
7052578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(s2, w11, fbits);
7053578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(s3, w11, fbits);
7054578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s0, MemOperand(x0, fbits * kSRegSizeInBytes));
7055578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s1, MemOperand(x1, fbits * kSRegSizeInBytes));
7056578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s2, MemOperand(x2, fbits * kSRegSizeInBytes));
7057578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s3, MemOperand(x3, fbits * kSRegSizeInBytes));
7058578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
7059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7060578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Conversions from W registers can only handle fbits values <= 32, so just
7061578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // test conversions from X registers for 32 < fbits <= 64.
7062578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
7063578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Scvtf(s0, x10, fbits);
7064578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Ucvtf(s1, x10, fbits);
7065578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s0, MemOperand(x0, fbits * kSRegSizeInBytes));
7066578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ Str(s1, MemOperand(x1, fbits * kSRegSizeInBytes));
7067578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
7068578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7069578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  END();
7070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7072578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check the results.
7073578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float expected_scvtf_base = rawbits_to_float(expected_scvtf_bits);
7074578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  float expected_ucvtf_base = rawbits_to_float(expected_ucvtf_bits);
7075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7076578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 0; fbits <= 32; fbits++) {
7077f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float expected_scvtf = expected_scvtf_base / powf(2, fbits);
7078f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float expected_ucvtf = expected_ucvtf_base / powf(2, fbits);
7079578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]);
7080578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]);
7081578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (cvtf_s32) ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_w[fbits]);
7082578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (cvtf_u32) ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_w[fbits]);
7083578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    break;
7084578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
7085578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
7086578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    break;
7087f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float expected_scvtf = expected_scvtf_base / powf(2, fbits);
7088f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    float expected_ucvtf = expected_ucvtf_base / powf(2, fbits);
7089578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]);
7090578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]);
7091578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
7092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7097578645f14e122d2b87d907e298cda7e7d0babf1farmvixlTEST(scvtf_ucvtf_float) {
7098578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Simple conversions of positive numbers which require no rounding; the
7099578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // results should not depened on the rounding mode, and ucvtf and scvtf should
7100578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // produce the same result.
7101578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000000000000, 0x00000000, 0x00000000);
7102578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000000000001, 0x3f800000, 0x3f800000);
7103578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000040000000, 0x4e800000, 0x4e800000);
7104578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000100000000, 0x4f800000, 0x4f800000);
7105578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x4000000000000000, 0x5e800000, 0x5e800000);
7106578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Test mantissa extremities.
7107578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000000800001, 0x4b000001, 0x4b000001);
7108578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x4000008000000000, 0x5e800001, 0x5e800001);
7109578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The largest int32_t that fits in a float.
7110578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x000000007fffff80, 0x4effffff, 0x4effffff);
7111578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Values that would be negative if treated as an int32_t.
7112578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x00000000ffffff00, 0x4f7fffff, 0x4f7fffff);
7113578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000080000000, 0x4f000000, 0x4f000000);
7114578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000080000100, 0x4f000001, 0x4f000001);
7115578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The largest int64_t that fits in a float.
7116578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x7fffff8000000000, 0x5effffff, 0x5effffff);
7117578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check for bit pattern reproduction.
7118578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000000000876543, 0x4b076543, 0x4b076543);
7119578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7120578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Simple conversions of negative int64_t values. These require no rounding,
7121578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // and the results should not depend on the rounding mode.
7122578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0xfffffc0000000000, 0xd4800000, 0x5f7ffffc);
7123578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0xc000000000000000, 0xde800000, 0x5f400000);
7124578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7125578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Conversions which require rounding.
7126578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800000000000, 0x57000000, 0x57000000);
7127578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800000000001, 0x57000000, 0x57000000);
7128578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800000800000, 0x57000000, 0x57000000);
7129578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800000800001, 0x57000001, 0x57000001);
7130578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800001000000, 0x57000001, 0x57000001);
7131578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800001000001, 0x57000001, 0x57000001);
7132578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800001800000, 0x57000002, 0x57000002);
7133578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800001800001, 0x57000002, 0x57000002);
7134578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800002000000, 0x57000002, 0x57000002);
7135578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800002000001, 0x57000002, 0x57000002);
7136578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800002800000, 0x57000002, 0x57000002);
7137578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800002800001, 0x57000003, 0x57000003);
7138578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x0000800003000000, 0x57000003, 0x57000003);
7139578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Check rounding of negative int64_t values (and large uint64_t values).
7140578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000000000000000, 0xdf000000, 0x5f000000);
7141578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000000000000001, 0xdf000000, 0x5f000000);
7142578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000004000000000, 0xdf000000, 0x5f000000);
7143578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000004000000001, 0xdeffffff, 0x5f000000);
7144578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000008000000000, 0xdeffffff, 0x5f000000);
7145578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000008000000001, 0xdeffffff, 0x5f000001);
7146578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x800000c000000000, 0xdefffffe, 0x5f000001);
7147578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x800000c000000001, 0xdefffffe, 0x5f000001);
7148578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000010000000000, 0xdefffffe, 0x5f000001);
7149578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000010000000001, 0xdefffffe, 0x5f000001);
7150578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000014000000000, 0xdefffffe, 0x5f000001);
7151578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000014000000001, 0xdefffffd, 0x5f000001);
7152578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x8000018000000000, 0xdefffffd, 0x5f000002);
7153578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Round up to produce a result that's too big for the input to represent.
7154578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x000000007fffffc0, 0x4f000000, 0x4f000000);
7155578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x000000007fffffff, 0x4f000000, 0x4f000000);
7156578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x00000000ffffff80, 0x4f800000, 0x4f800000);
7157578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x00000000ffffffff, 0x4f800000, 0x4f800000);
7158578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x7fffffc000000000, 0x5f000000, 0x5f000000);
7159578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0x7fffffffffffffff, 0x5f000000, 0x5f000000);
7160578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0xffffff8000000000, 0xd3000000, 0x5f800000);
7161578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  TestUScvtf32Helper(0xffffffffffffffff, 0xbf800000, 0x5f800000);
7162578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
7163578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7164578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(system_mrs) {
7166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
7170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 1);
7171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w2, 0x80000000);
7172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the Z and C flags.
7174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, w0);
7175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x3, NZCV);
7176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the N flag.
7178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, w1);
7179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x4, NZCV);
7180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the Z, C and V flags.
7182f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Adds(w0, w2, w2);
7183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mrs(x5, NZCV);
7184578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7185578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Read the default FPCR.
7186578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x6, FPCR);
7187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7191578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // NZCV
7192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCFlag, w3);
7193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(NFlag, w4);
7194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(ZCVFlag, w5);
7195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7196578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // FPCR
7197578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The default FPCR on Linux-based platforms is 0.
7198578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_32(0, w6);
7199578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(system_msr) {
7205578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // All FPCR fields that must be implemented: AHP, DN, FZ, RMode
7206578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  const uint64_t fpcr_core = 0x07c00000;
7207578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7208578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // All FPCR fields (including fields which may be read-as-zero):
7209578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  Stride, Len
7210578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  //  IDE, IXE, UFE, OFE, DZE, IOE
7211578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  const uint64_t fpcr_all = fpcr_core | 0x00379f00;
7212578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0);
7217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w1, 0x7fffffff);
7218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x7, 0);
7220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, NVFlag);
7222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmp(w0, w0);     // Set Z and C.
7223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msr(NZCV, x10);  // Set N and V.
7224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The Msr should have overwritten every flag set by the Cmp.
7225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, mi);  // N
7226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, ne);  // !Z
7227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, lo);  // !C
7228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, vs);  // V
7229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, ZCFlag);
7231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cmn(w1, w1);     // Set N and V.
7232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msr(NZCV, x10);  // Set Z and C.
7233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The Msr should have overwritten every flag set by the Cmn.
7234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, pl);  // !N
7235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, eq);  // Z
7236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, hs);  // C
7237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cinc(x7, x7, vc);  // !V
7238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7239578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // All core FPCR fields must be writable.
7240578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x8, fpcr_core);
7241578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Msr(FPCR, x8);
7242578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x8, FPCR);
7243578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7244578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // All FPCR fields, including optional ones. This part of the test doesn't
7245578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // achieve much other than ensuring that supported fields can be cleared by
7246578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // the next test.
7247578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x9, fpcr_all);
7248578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Msr(FPCR, x9);
7249578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x9, FPCR);
7250578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ And(x9, x9, fpcr_core);
7251578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7252578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // The undefined bits must ignore writes.
7253578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // It's conceivable that a future version of the architecture could use these
7254578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // fields (making this test fail), but in the meantime this is a useful test
7255578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // for the simulator.
7256578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x10, ~fpcr_all);
7257578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Msr(FPCR, x10);
7258578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mrs(x10, FPCR);
7259578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We should have incremented x7 (from 0) exactly 8 times.
7265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(8, x7);
7266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7267578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(fpcr_core, x8);
7268578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(fpcr_core, x9);
7269578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  ASSERT_EQUAL_64(0, x10);
7270578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
7271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(system_nop) {
7276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump before;
7278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  before.Dump(&masm);
7281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Nop();
7282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_REGISTERS(before);
7287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(before.flags_nzcv());
7288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(zero_dest) {
7294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump before;
7296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Preserve the stack pointer, in case we clobber it.
7299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x30, sp);
7300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the other registers used in this test.
73011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
7302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
7303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, literal_base);
7304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (unsigned i = 2; i < x30.code(); i++) {
7305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Add(Register::XRegFromCode(i), Register::XRegFromCode(i-1), x1);
7306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  before.Dump(&masm);
7308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // All of these instructions should be NOPs in these forms, but have
7310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // alternate forms which can write into the stack pointer.
7311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ add(xzr, x0, x1);
7312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ add(xzr, x1, xzr);
7313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ add(xzr, xzr, x1);
7314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ and_(xzr, x0, x2);
7316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ and_(xzr, x2, xzr);
7317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ and_(xzr, xzr, x2);
7318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bic(xzr, x0, x3);
7320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bic(xzr, x3, xzr);
7321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ bic(xzr, xzr, x3);
7322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eon(xzr, x0, x4);
7324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eon(xzr, x4, xzr);
7325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eon(xzr, xzr, x4);
7326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eor(xzr, x0, x5);
7328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eor(xzr, x5, xzr);
7329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ eor(xzr, xzr, x5);
7330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ orr(xzr, x0, x6);
7332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ orr(xzr, x6, xzr);
7333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ orr(xzr, xzr, x6);
7334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sub(xzr, x0, x7);
7336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sub(xzr, x7, xzr);
7337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ sub(xzr, xzr, x7);
7338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Swap the saved stack pointer with the real one. If sp was written
7340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // during the test, it will show up in x30. This is done because the test
7341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // framework assumes that sp will be valid at the end of the test.
7342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, x30);
7343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x30, sp);
7344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x29);
7345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We used x29 as a scratch register, so reset it to make sure it doesn't
7346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // trigger a test failure.
7347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x29, x28, x1);
7348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_REGISTERS(before);
7353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(before.flags_nzcv());
7354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(zero_dest_setflags) {
7360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump before;
7362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Preserve the stack pointer, in case we clobber it.
7365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x30, sp);
7366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the other registers used in this test.
73671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
7368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
7369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, literal_base);
7370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 2; i < 30; i++) {
7371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Add(Register::XRegFromCode(i), Register::XRegFromCode(i-1), x1);
7372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  before.Dump(&masm);
7374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // All of these instructions should only write to the flags in these forms,
7376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // but have alternate forms which can write into the stack pointer.
7377f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x0, Operand(x1, UXTX));
7378f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x1, Operand(xzr, UXTX));
7379f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x1, 1234);
7380f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x0, x1);
7381f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, x1, xzr);
7382f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ adds(xzr, xzr, x1);
7383f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
7384f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, x2, ~0xf);
7385f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, xzr, ~0xf);
7386f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, x0, x2);
7387f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, x2, xzr);
7388f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ ands(xzr, xzr, x2);
7389f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
7390f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, x3, ~0xf);
7391f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, xzr, ~0xf);
7392f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, x0, x3);
7393f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, x3, xzr);
7394f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ bics(xzr, xzr, x3);
7395f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
7396f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x0, Operand(x3, UXTX));
7397f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x3, Operand(xzr, UXTX));
7398f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x3, 1234);
7399f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x0, x3);
7400f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, x3, xzr);
7401f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ subs(xzr, xzr, x3);
7402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Swap the saved stack pointer with the real one. If sp was written
7404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // during the test, it will show up in x30. This is done because the test
7405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // framework assumes that sp will be valid at the end of the test.
7406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, x30);
7407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x30, sp);
7408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x29);
7409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We used x29 as a scratch register, so reset it to make sure it doesn't
7410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // trigger a test failure.
7411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x29, x28, x1);
7412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_REGISTERS(before);
7417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(register_bit) {
7423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // No code generation takes place in this test, so no need to setup and
7424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // teardown.
7425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Simple tests.
74271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  assert(x0.Bit() == (UINT64_C(1) << 0));
74281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  assert(x1.Bit() == (UINT64_C(1) << 1));
74291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  assert(x10.Bit() == (UINT64_C(1) << 10));
7430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // AAPCS64 definitions.
74321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  assert(lr.Bit() == (UINT64_C(1) << kLinkRegCode));
7433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Fixed (hardware) definitions.
74351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  assert(xzr.Bit() == (UINT64_C(1) << kZeroRegCode));
7436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Internal ABI definitions.
74381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  assert(sp.Bit() == (UINT64_C(1) << kSPRegInternalCode));
7439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Bit() != xzr.Bit());
7440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // xn.Bit() == wn.Bit() at all times, for the same n.
7442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x0.Bit() == w0.Bit());
7443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x1.Bit() == w1.Bit());
7444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x10.Bit() == w10.Bit());
7445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(xzr.Bit() == wzr.Bit());
7446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Bit() == wsp.Bit());
7447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(stack_pointer_override) {
7451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test generates some stack maintenance code, but the test only checks
7452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // the reported state.
7453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The default stack pointer in VIXL is sp.
7457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Is(__ StackPointer()));
7458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(x0);
7459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x0.Is(__ StackPointer()));
7460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(x28);
7461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(x28.Is(__ StackPointer()));
7462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(sp);
7463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(sp.Is(__ StackPointer()));
7464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(peek_poke_simple) {
7472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static const RegList x0_to_x3 = x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit();
7476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static const RegList x10_to_x13 = x10.Bit() | x11.Bit() |
7477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    x12.Bit() | x13.Bit();
7478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
74841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
7485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the registers.
7487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, literal_base);
7488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x1, x0, x0);
7489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x2, x1, x0);
7490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x3, x2, x0);
7491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(32);
7493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Simple exchange.
7495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  After this test:
7496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x0-x3 should be unchanged.
7497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    w10-w13 should contain the lower words of x0-x3.
7498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 0);
7499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x1, 8);
7500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x2, 16);
7501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x3, 24);
7502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x0_to_x3);
7503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x0, 0);
7504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x1, 8);
7505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x2, 16);
7506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x3, 24);
7507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w0, 0);
7509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w1, 4);
7510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w2, 8);
7511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w3, 12);
7512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x10_to_x13);
7513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w10, 0);
7514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w11, 4);
7515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w12, 8);
7516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w13, 12);
7517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Drop(32);
7519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 1, x0);
7524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 2, x1);
7525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 3, x2);
7526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 4, x3);
7527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 1) & 0xffffffff, x10);
7529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 2) & 0xffffffff, x11);
7530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 3) & 0xffffffff, x12);
7531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 4) & 0xffffffff, x13);
7532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(peek_poke_unaligned) {
7538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
75461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
7547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the registers.
7549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, literal_base);
7550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x1, x0, x0);
7551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x2, x1, x0);
7552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x3, x2, x0);
7553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x4, x3, x0);
7554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x5, x4, x0);
7555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x6, x5, x0);
7556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(32);
7558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Unaligned exchanges.
7560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  After this test:
7561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x0-x6 should be unchanged.
7562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    w10-w12 should contain the lower words of x0-x2.
7563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 1);
7564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x0.Bit());
7565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x0, 1);
7566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x1, 2);
7567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x1.Bit());
7568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x1, 2);
7569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x2, 3);
7570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x2.Bit());
7571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x2, 3);
7572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x3, 4);
7573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x3.Bit());
7574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x3, 4);
7575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x4, 5);
7576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x4.Bit());
7577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x4, 5);
7578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x5, 6);
7579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x5.Bit());
7580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x5, 6);
7581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x6, 7);
7582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, x6.Bit());
7583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x6, 7);
7584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w0, 1);
7586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, w10.Bit());
7587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w10, 1);
7588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w1, 2);
7589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, w11.Bit());
7590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w11, 2);
7591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w2, 3);
7592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Clobber(&masm, w12.Bit());
7593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w12, 3);
7594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Drop(32);
7596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 1, x0);
7601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 2, x1);
7602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 3, x2);
7603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 4, x3);
7604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 5, x4);
7605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 6, x5);
7606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 7, x6);
7607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 1) & 0xffffffff, x10);
7609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 2) & 0xffffffff, x11);
7610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64((literal_base * 3) & 0xffffffff, x12);
7611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(peek_poke_endianness) {
7617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
76251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
7626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the registers.
7628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, literal_base);
7629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x1, x0, x0);
7630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(32);
7632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Endianness tests.
7634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  After this section:
7635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x4 should match x0[31:0]:x0[63:32]
7636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    w5 should match w1[15:0]:w1[31:16]
7637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 0);
7638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 8);
7639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(x4, 4);
7640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w1, 0);
7642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(w1, 4);
7643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Peek(w5, 2);
7644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Drop(32);
7646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x0_expected = literal_base * 1;
7651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x1_expected = literal_base * 2;
7652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x4_expected = (x0_expected << 32) | (x0_expected >> 32);
7653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x5_expected = ((x1_expected << 16) & 0xffff0000) |
7654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                         ((x1_expected >> 16) & 0x0000ffff);
7655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x0_expected, x0);
7657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x1_expected, x1);
7658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x4_expected, x4);
7659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x5_expected, x5);
7660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(peek_poke_mixed) {
7666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
76741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
7675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize the registers.
7677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, literal_base);
7678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x1, x0, x0);
7679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x2, x1, x0);
7680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(x3, x2, x0);
7681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(32);
7683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Mix with other stack operations.
7685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  After this section:
7686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x0-x3 should be unchanged.
7687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    x6 should match x1[31:0]:x0[63:32]
7688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    w7 should match x1[15:0]:x0[63:48]
7689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x1, 8);
7690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Poke(x0, 0);
7691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
76921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
7693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x4, __ StackPointer());
7694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(x4);
7695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Poke(wzr, 0);    // Clobber the space we're about to drop.
7697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(4);
7698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Peek(x6, 0);
7699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(8);
7700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Peek(w7, 10);
7701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Poke(x3, 28);
7702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Poke(xzr, 0);    // Clobber the space we're about to drop.
7703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(8);
7704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Poke(x2, 12);
7705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Push(w0);
7706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
7708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
7709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(x0, x1, x2, x3);
7712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x0_expected = literal_base * 1;
7717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x1_expected = literal_base * 2;
7718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x2_expected = literal_base * 3;
7719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x3_expected = literal_base * 4;
7720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x6_expected = (x1_expected << 32) | (x0_expected >> 32);
7721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t x7_expected = ((x1_expected << 16) & 0xffff0000) |
7722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                         ((x0_expected >> 48) & 0x0000ffff);
7723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x0_expected, x0);
7725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x1_expected, x1);
7726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x2_expected, x2);
7727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x3_expected, x3);
7728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x6_expected, x6);
7729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x7_expected, x7);
7730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// This enum is used only as an argument to the push-pop test helpers.
7736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlenum PushPopMethod {
7737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Push or Pop using the Push and Pop methods, with blocks of up to four
7738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // registers. (Smaller blocks will be used if necessary.)
7739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  PushPopByFour,
7740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Use Push<Size>RegList and Pop<Size>RegList to transfer the registers.
7742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  PushPopRegList
7743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl};
7744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// The maximum number of registers that can be used by the PushPopXReg* tests,
7747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// where a reg_count field is provided.
7748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic int const kPushPopXRegMaxRegCount = -1;
7749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Test a simple push-pop pattern:
7751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Claim <claim> bytes to set the stack alignment.
7752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Push <reg_count> registers with size <reg_size>.
7753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Clobber the register contents.
7754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Pop <reg_count> registers to restore the original contents.
7755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Drop <claim> bytes to restore the original stack pointer.
7756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
7757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Different push and pop methods can be specified independently to test for
7758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// proper word-endian behaviour.
7759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void PushPopXRegSimpleHelper(int reg_count,
7760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    int claim,
7761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    int reg_size,
7762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    PushPopMethod push_method,
7763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                    PushPopMethod pop_method) {
7764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Arbitrarily pick a register to use as a stack pointer.
7769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register& stack_pointer = x20;
7770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const RegList allowed = ~stack_pointer.Bit();
7771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (reg_count == kPushPopXRegMaxRegCount) {
7772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    reg_count = CountSetBits(allowed, kNumberOfRegisters);
7773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Work out which registers to use, based on reg_size.
7775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register r[kNumberOfRegisters];
7776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register x[kNumberOfRegisters];
7777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList list = PopulateRegisterArray(NULL, x, r, reg_size, reg_count,
7778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                       allowed);
7779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
7782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
7783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
77851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
7786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
77881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
7789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(stack_pointer, __ StackPointer());
7790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(stack_pointer);
7791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    int i;
7793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Initialize the registers.
7795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (i = 0; i < reg_count; i++) {
7796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Always write into the X register, to ensure that the upper word is
7797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // properly ignored by Push when testing W registers.
7798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Mov(x[i], literal_base * i);
7799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Claim memory first, as requested.
7802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(claim);
7803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    switch (push_method) {
7805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopByFour:
7806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Push high-numbered registers first (to the highest addresses).
7807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (i = reg_count; i >= 4; i -= 4) {
7808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          __ Push(r[i-1], r[i-2], r[i-3], r[i-4]);
7809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Finish off the leftovers.
7811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        switch (i) {
7812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 3:  __ Push(r[2], r[1], r[0]); break;
7813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 2:  __ Push(r[1], r[0]);       break;
7814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 1:  __ Push(r[0]);             break;
78151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl          default: VIXL_ASSERT(i == 0);            break;
7816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopRegList:
7819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PushSizeRegList(list, reg_size);
7820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Clobber all the registers, to ensure that they get repopulated by Pop.
7824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, list);
7825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    switch (pop_method) {
7827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopByFour:
7828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Pop low-numbered registers first (from the lowest addresses).
7829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (i = 0; i <= (reg_count-4); i += 4) {
7830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          __ Pop(r[i], r[i+1], r[i+2], r[i+3]);
7831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Finish off the leftovers.
7833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        switch (reg_count - i) {
7834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 3:  __ Pop(r[i], r[i+1], r[i+2]); break;
7835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 2:  __ Pop(r[i], r[i+1]);         break;
7836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 1:  __ Pop(r[i]);                 break;
78371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl          default: VIXL_ASSERT(i == reg_count);       break;
7838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopRegList:
7841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PopSizeRegList(list, reg_size);
7842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
7843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Drop memory to restore stack_pointer.
7846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(claim);
7847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
7849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
7850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
7853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
7855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that the register contents were preserved.
7857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Always use ASSERT_EQUAL_64, even when testing W registers, so we can test
7858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // that the upper word was properly cleared by Pop.
78591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  literal_base &= (0xffffffffffffffff >> (64-reg_size));
7860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i < reg_count; i++) {
7861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (x[i].Is(xzr)) {
7862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT_EQUAL_64(0, x[i]);
7863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    } else {
7864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT_EQUAL_64(literal_base * i, x[i]);
7865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
7869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_simple_32) {
7873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
7874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 0; count <= 8; count++) {
7875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
7876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopByFour);
7877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
7878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopRegList);
7879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
7880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopByFour);
7881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
7882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopRegList);
7883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
7885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kWRegSize, PushPopByFour, PushPopByFour);
7887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kWRegSize, PushPopByFour, PushPopRegList);
7889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kWRegSize, PushPopRegList, PushPopByFour);
7891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kWRegSize, PushPopRegList, PushPopRegList);
7893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7897ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_simple_64) {
7898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
7899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 0; count <= 8; count++) {
7900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
7901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopByFour);
7902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
7903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopRegList);
7904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
7905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopByFour);
7906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
7907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopRegList);
7908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
7910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kXRegSize, PushPopByFour, PushPopByFour);
7912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kXRegSize, PushPopByFour, PushPopRegList);
7914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kXRegSize, PushPopRegList, PushPopByFour);
7916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
7917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                            claim, kXRegSize, PushPopRegList, PushPopRegList);
7918ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
7920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// The maximum number of registers that can be used by the PushPopFPXReg* tests,
7923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// where a reg_count field is provided.
7924ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic int const kPushPopFPXRegMaxRegCount = -1;
7925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Test a simple push-pop pattern:
7927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Claim <claim> bytes to set the stack alignment.
7928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Push <reg_count> FP registers with size <reg_size>.
7929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Clobber the register contents.
7930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Pop <reg_count> FP registers to restore the original contents.
7931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//  * Drop <claim> bytes to restore the original stack pointer.
7932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl//
7933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Different push and pop methods can be specified independently to test for
7934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// proper word-endian behaviour.
7935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void PushPopFPXRegSimpleHelper(int reg_count,
7936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                      int claim,
7937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                      int reg_size,
7938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                      PushPopMethod push_method,
7939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                      PushPopMethod pop_method) {
7940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
7941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We can use any floating-point register. None of them are reserved for
7945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // debug code, for example.
7946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static RegList const allowed = ~0;
7947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (reg_count == kPushPopFPXRegMaxRegCount) {
7948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    reg_count = CountSetBits(allowed, kNumberOfFPRegisters);
7949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
7950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Work out which registers to use, based on reg_size.
7951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  FPRegister v[kNumberOfRegisters];
7952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  FPRegister d[kNumberOfRegisters];
7953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList list = PopulateFPRegisterArray(NULL, d, v, reg_size, reg_count,
7954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                         allowed);
7955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Arbitrarily pick a register to use as a stack pointer.
7957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register& stack_pointer = x10;
7958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
7960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied (using an integer) by small values (such as a register
7961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    index), this value is clearly readable in the result.
7962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
7963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
7964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * It is never a floating-point NaN, and will therefore always compare
7965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    equal to itself.
79661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
7967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
79691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
7970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(stack_pointer, __ StackPointer());
7971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(stack_pointer);
7972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    int i;
7974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Initialize the registers, using X registers to load the literal.
7976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x0, 0);
7977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x1, literal_base);
7978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (i = 0; i < reg_count; i++) {
7979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Always write into the D register, to ensure that the upper word is
7980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // properly ignored by Push when testing S registers.
7981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Fmov(d[i], x0);
7982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Calculate the next literal.
7983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Add(x0, x0, x1);
7984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
7985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Claim memory first, as requested.
7987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(claim);
7988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
7989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    switch (push_method) {
7990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopByFour:
7991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Push high-numbered registers first (to the highest addresses).
7992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (i = reg_count; i >= 4; i -= 4) {
7993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          __ Push(v[i-1], v[i-2], v[i-3], v[i-4]);
7994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
7995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Finish off the leftovers.
7996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        switch (i) {
7997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 3:  __ Push(v[2], v[1], v[0]); break;
7998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 2:  __ Push(v[1], v[0]);       break;
7999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 1:  __ Push(v[0]);             break;
80001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl          default: VIXL_ASSERT(i == 0);            break;
8001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
8002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
8003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopRegList:
8004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PushSizeRegList(list, reg_size, CPURegister::kFPRegister);
8005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
8006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Clobber all the registers, to ensure that they get repopulated by Pop.
8009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ClobberFP(&masm, list);
8010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    switch (pop_method) {
8012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopByFour:
8013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Pop low-numbered registers first (from the lowest addresses).
8014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (i = 0; i <= (reg_count-4); i += 4) {
8015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          __ Pop(v[i], v[i+1], v[i+2], v[i+3]);
8016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
8017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Finish off the leftovers.
8018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        switch (reg_count - i) {
8019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 3:  __ Pop(v[i], v[i+1], v[i+2]); break;
8020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 2:  __ Pop(v[i], v[i+1]);         break;
8021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          case 1:  __ Pop(v[i]);                 break;
80221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl          default: VIXL_ASSERT(i == reg_count);       break;
8023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
8024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
8025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      case PushPopRegList:
8026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PopSizeRegList(list, reg_size, CPURegister::kFPRegister);
8027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        break;
8028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Drop memory to restore the stack pointer.
8031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(claim);
8032ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
8034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
8035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Check that the register contents were preserved.
8042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Always use ASSERT_EQUAL_FP64, even when testing S registers, so we can
8043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // test that the upper word was properly cleared by Pop.
80441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  literal_base &= (0xffffffffffffffff >> (64-reg_size));
8045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i < reg_count; i++) {
8046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    uint64_t literal = literal_base * i;
8047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    double expected;
8048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    memcpy(&expected, &literal, sizeof(expected));
8049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    ASSERT_EQUAL_FP64(expected, d[i]);
8050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_fp_xreg_simple_32) {
8057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
8058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 0; count <= 8; count++) {
8059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
8060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopByFour, PushPopByFour);
8061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
8062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopByFour, PushPopRegList);
8063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
8064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopRegList, PushPopByFour);
8065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
8066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopRegList, PushPopRegList);
8067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
8069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
8070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopByFour);
8071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
8072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopRegList);
8073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
8074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopByFour);
8075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
8076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopRegList);
8077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_fp_xreg_simple_64) {
8082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
8083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 0; count <= 8; count++) {
8084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
8085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopByFour, PushPopByFour);
8086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
8087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopByFour, PushPopRegList);
8088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
8089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopRegList, PushPopByFour);
8090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
8091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                                PushPopRegList, PushPopRegList);
8092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
8094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
8095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopByFour);
8096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
8097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopByFour, PushPopRegList);
8098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
8099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopByFour);
8100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
8101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                              PushPopRegList, PushPopRegList);
8102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Push and pop data using an overlapping combination of Push/Pop and
8107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// RegList-based methods.
8108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void PushPopXRegMixedMethodsHelper(int claim, int reg_size) {
8109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Arbitrarily pick a register to use as a stack pointer.
8112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register& stack_pointer = x5;
8113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const RegList allowed = ~stack_pointer.Bit();
8114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Work out which registers to use, based on reg_size.
8115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register r[10];
8116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register x[10];
8117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  PopulateRegisterArray(NULL, x, r, reg_size, 10, allowed);
8118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Calculate some handy register lists.
8120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList r0_to_r3 = 0;
8121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i <= 3; i++) {
8122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    r0_to_r3 |= x[i].Bit();
8123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList r4_to_r5 = 0;
8125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 4; i <= 5; i++) {
8126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    r4_to_r5 |= x[i].Bit();
8127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList r6_to_r9 = 0;
8129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 6; i <= 9; i++) {
8130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    r6_to_r9 |= x[i].Bit();
8131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8132ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
8134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
8135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
8136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
8137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
81381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t literal_base = 0x0100001000100101;
8139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
81421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
8143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(stack_pointer, __ StackPointer());
8144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(stack_pointer);
8145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Claim memory first, as requested.
8147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(claim);
8148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x[3], literal_base * 3);
8150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x[2], literal_base * 2);
8151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x[1], literal_base * 1);
8152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(x[0], literal_base * 0);
8153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ PushSizeRegList(r0_to_r3, reg_size);
8155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Push(r[3], r[2]);
8156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, r0_to_r3);
8158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ PopSizeRegList(r0_to_r3, reg_size);
8159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Push(r[2], r[1], r[3], r[0]);
8161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, r4_to_r5);
8163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Pop(r[4], r[5]);
8164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, r6_to_r9);
8165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Pop(r[6], r[7], r[8], r[9]);
8166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Drop memory to restore stack_pointer.
8168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(claim);
8169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
8171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
8172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Always use ASSERT_EQUAL_64, even when testing W registers, so we can test
8179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // that the upper word was properly cleared by Pop.
81801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  literal_base &= (0xffffffffffffffff >> (64-reg_size));
8181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 3, x[9]);
8183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 2, x[8]);
8184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 0, x[7]);
8185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 3, x[6]);
8186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 1, x[5]);
8187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(literal_base * 2, x[4]);
8188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_mixed_methods_64) {
8194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
8195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegMixedMethodsHelper(claim, kXRegSize);
8196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_mixed_methods_32) {
8201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
8202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegMixedMethodsHelper(claim, kWRegSize);
8203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Push and pop data using overlapping X- and W-sized quantities.
8208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlstatic void PushPopXRegWXOverlapHelper(int reg_count, int claim) {
8209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Arbitrarily pick a register to use as a stack pointer.
8212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register& stack_pointer = x10;
8213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const RegList allowed = ~stack_pointer.Bit();
8214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  if (reg_count == kPushPopXRegMaxRegCount) {
8215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    reg_count = CountSetBits(allowed, kNumberOfRegisters);
8216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Work out which registers to use, based on reg_size.
8218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register w[kNumberOfRegisters];
8219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Register x[kNumberOfRegisters];
8220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegList list = PopulateRegisterArray(w, x, NULL, 0, reg_count, allowed);
8221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The number of W-sized slots we expect to pop. When we pop, we alternate
8223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // between W and X registers, so we need reg_count*1.5 W-sized slots.
8224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int const requested_w_slots = reg_count + reg_count / 2;
8225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Track what _should_ be on the stack, using W-sized slots.
8227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static int const kMaxWSlots = kNumberOfRegisters + kNumberOfRegisters / 2;
8228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t stack[kMaxWSlots];
8229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i < kMaxWSlots; i++) {
8230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    stack[i] = 0xdeadbeef;
8231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The literal base is chosen to have two useful properties:
8234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * When multiplied by small values (such as a register index), this value
8235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    is clearly readable in the result.
8236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
8237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //    can be used to detect endianness-related errors.
82381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  static uint64_t const literal_base = 0x0100001000100101;
8239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static uint64_t const literal_base_hi = literal_base >> 32;
8240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static uint64_t const literal_base_lo = literal_base & 0xffffffff;
8241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  static uint64_t const literal_base_w = literal_base & 0xffffffff;
8242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
82451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
8246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(stack_pointer, __ StackPointer());
8247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(stack_pointer);
8248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Initialize the registers.
8250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int i = 0; i < reg_count; i++) {
8251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Always write into the X register, to ensure that the upper word is
8252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // properly ignored by Push when testing W registers.
8253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Mov(x[i], literal_base * i);
8254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Claim memory first, as requested.
8257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Claim(claim);
8258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // The push-pop pattern is as follows:
8260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Push:           Pop:
8261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[0](hi)   ->   w[0]
8262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[0](lo)   ->   x[1](hi)
8263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[1]       ->   x[1](lo)
8264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[1]       ->   w[2]
8265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](hi)   ->   x[2](hi)
8266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](lo)   ->   x[2](lo)
8267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](hi)   ->   w[3]
8268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](lo)   ->   x[4](hi)
8269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](hi)   ->   x[4](lo)
8270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[2](lo)   ->   w[5]
8271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[3]       ->   x[5](hi)
8272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[3]       ->   x[6](lo)
8273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[3]       ->   w[7]
8274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  w[3]       ->   x[8](hi)
8275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[4](hi)   ->   x[8](lo)
8276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //  x[4](lo)   ->   w[9]
8277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // ... pattern continues ...
8278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //
8279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // That is, registers are pushed starting with the lower numbers,
8280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // alternating between x and w registers, and pushing i%4+1 copies of each,
8281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // where i is the register number.
8282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Registers are popped starting with the higher numbers one-by-one,
8283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // alternating between x and w registers, but only popping one at a time.
8284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    //
8285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // This pattern provides a wide variety of alignment effects and overlaps.
8286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // ---- Push ----
8288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    int active_w_slots = 0;
8290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int i = 0; active_w_slots < requested_w_slots; i++) {
82911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl      VIXL_ASSERT(i < reg_count);
8292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // In order to test various arguments to PushMultipleTimes, and to try to
8293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // exercise different alignment and overlap effects, we push each
8294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // register a different number of times.
8295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      int times = i % 4 + 1;
8296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      if (i & 1) {
8297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Push odd-numbered registers as W registers.
8298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PushMultipleTimes(times, w[i]);
8299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Fill in the expected stack slots.
8300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (int j = 0; j < times; j++) {
8301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          if (w[i].Is(wzr)) {
8302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            // The zero register always writes zeroes.
8303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = 0;
8304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          } else {
8305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = literal_base_w * i;
8306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          }
8307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
8308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      } else {
8309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Push even-numbered registers as X registers.
8310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ PushMultipleTimes(times, x[i]);
8311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        // Fill in the expected stack slots.
8312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        for (int j = 0; j < times; j++) {
8313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          if (x[i].Is(xzr)) {
8314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            // The zero register always writes zeroes.
8315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = 0;
8316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = 0;
8317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          } else {
8318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = literal_base_hi * i;
8319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            stack[active_w_slots++] = literal_base_lo * i;
8320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl          }
8321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        }
8322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      }
8323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Because we were pushing several registers at a time, we probably pushed
8325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // more than we needed to.
8326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (active_w_slots > requested_w_slots) {
8327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      __ Drop((active_w_slots - requested_w_slots) * kWRegSizeInBytes);
8328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // Bump the number of active W-sized slots back to where it should be,
8329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      // and fill the empty space with a dummy value.
8330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      do {
8331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        stack[active_w_slots--] = 0xdeadbeef;
8332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      } while (active_w_slots > requested_w_slots);
8333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // ---- Pop ----
8336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    Clobber(&masm, list);
8338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // If popping an even number of registers, the first one will be X-sized.
8340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Otherwise, the first one will be W-sized.
8341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    bool next_is_64 = !(reg_count & 1);
8342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int i = reg_count-1; i >= 0; i--) {
8343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      if (next_is_64) {
8344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ Pop(x[i]);
8345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        active_w_slots -= 2;
8346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      } else {
8347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        __ Pop(w[i]);
8348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl        active_w_slots -= 1;
8349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      }
8350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      next_is_64 = !next_is_64;
8351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
83521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(active_w_slots == 0);
8353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Drop memory to restore stack_pointer.
8355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Drop(claim);
8356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ Mov(sp, __ StackPointer());
8358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ SetStackPointer(sp);
8359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8361ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int slot = 0;
8366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int i = 0; i < reg_count; i++) {
8367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Even-numbered registers were written as W registers.
8368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Odd-numbered registers were written as X registers.
8369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    bool expect_64 = (i & 1);
8370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    uint64_t expected;
8371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (expect_64) {
8373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      uint64_t hi = stack[slot++];
8374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      uint64_t lo = stack[slot++];
8375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      expected = (hi << 32) | lo;
8376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    } else {
8377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      expected = stack[slot++];
8378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Always use ASSERT_EQUAL_64, even when testing W registers, so we can
8381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // test that the upper word was properly cleared by Pop.
8382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    if (x[i].Is(xzr)) {
8383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT_EQUAL_64(0, x[i]);
8384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    } else {
8385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      ASSERT_EQUAL_64(expected, x[i]);
8386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
83881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(slot == requested_w_slots);
8389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8392ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_xreg_wx_overlap) {
8395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  for (int claim = 0; claim <= 8; claim++) {
8396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    for (int count = 1; count <= 8; count++) {
8397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      PushPopXRegWXOverlapHelper(count, claim);
8398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
8399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    // Test with the maximum number of registers.
8400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    PushPopXRegWXOverlapHelper(kPushPopXRegMaxRegCount, claim);
8401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(push_pop_sp) {
8406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
84101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(sp.Is(__ StackPointer()));
8411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
84121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, 0x3333333333333333);
84131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0x2222222222222222);
84141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x1111111111111111);
84151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x0000000000000000);
8416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit());
8418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(x3, x2);
8419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit());
8420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(x2, x1, x3, x0);
8421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(x4, x5);
8422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(x6, x7, x8, x9);
8423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushWRegList(w0.Bit() | w1.Bit() | w2.Bit() | w3.Bit());
8426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(w3, w1, w2, w0);
8427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopWRegList(w10.Bit() | w11.Bit() | w12.Bit() | w13.Bit());
8428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(w14, w15, w16, w17);
8429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(w2, w2, w1, w1);
8432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Push(x3, x3);
8433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(w18, w19, w20, w21);
8434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Pop(x22, x23);
8435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushXRegList(x1.Bit() | x22.Bit());
8438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopXRegList(x24.Bit() | x26.Bit());
8439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushWRegList(w1.Bit() | w2.Bit() | w4.Bit() | w22.Bit());
8442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopWRegList(w25.Bit() | w27.Bit() | w28.Bit() | w29.Bit());
8443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Claim(2 * kXRegSizeInBytes);
8445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushXRegList(0);
8446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopXRegList(0);
8447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushXRegList(0xffffffff);
8448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopXRegList(0xffffffff);
8449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Drop(12 * kXRegSizeInBytes);
8450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
84541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1111111111111111, x3);
84551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x2);
84561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3333333333333333, x1);
84571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x2222222222222222, x0);
84581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3333333333333333, x9);
84591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x2222222222222222, x8);
84601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x7);
84611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3333333333333333, x6);
84621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1111111111111111, x5);
84631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x2222222222222222, x4);
8464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w13);
8466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x33333333U, w12);
8467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00000000U, w11);
8468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x22222222U, w10);
8469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w17);
8470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00000000U, w16);
8471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x33333333U, w15);
8472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x22222222U, w14);
8473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w18);
8475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w19);
8476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w20);
8477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x11111111U, w21);
84781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3333333333333333, x22);
84791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x23);
8480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
84811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3333333333333333, x24);
84821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3333333333333333, x26);
8483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x33333333U, w25);
8485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x00000000U, w27);
8486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x22222222U, w28);
8487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0x33333333U, w29);
8488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(noreg) {
8493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test doesn't generate any code, but it verifies some invariants
8494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // related to NoReg.
84951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoReg.Is(NoFPReg));
84961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoFPReg.Is(NoReg));
84971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoReg.Is(NoCPUReg));
84981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoCPUReg.Is(NoReg));
84991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoFPReg.Is(NoCPUReg));
85001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoCPUReg.Is(NoFPReg));
8501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
85021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoReg.IsNone());
85031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoFPReg.IsNone());
85041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(NoCPUReg.IsNone());
8505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(isvalid) {
8509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test doesn't generate any code, but it verifies some invariants
8510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // related to IsValid().
85111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!NoReg.IsValid());
85121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!NoFPReg.IsValid());
85131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!NoCPUReg.IsValid());
85141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(x0.IsValid());
85161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(w0.IsValid());
85171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(x30.IsValid());
85181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(w30.IsValid());
85191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(xzr.IsValid());
85201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(wzr.IsValid());
85211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(sp.IsValid());
85231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(wsp.IsValid());
85241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(d0.IsValid());
85261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(s0.IsValid());
85271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(d31.IsValid());
85281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(s31.IsValid());
85291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(x0.IsValidRegister());
85311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(w0.IsValidRegister());
85321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(xzr.IsValidRegister());
85331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(wzr.IsValidRegister());
85341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(sp.IsValidRegister());
85351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(wsp.IsValidRegister());
85361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!x0.IsValidFPRegister());
85371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!w0.IsValidFPRegister());
85381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!xzr.IsValidFPRegister());
85391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!wzr.IsValidFPRegister());
85401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!sp.IsValidFPRegister());
85411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!wsp.IsValidFPRegister());
85421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(d0.IsValidFPRegister());
85441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(s0.IsValidFPRegister());
85451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!d0.IsValidRegister());
85461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!s0.IsValidRegister());
8547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test the same as before, but using CPURegister types. This shouldn't make
8549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // any difference.
85501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(x0).IsValid());
85511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(w0).IsValid());
85521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(x30).IsValid());
85531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(w30).IsValid());
85541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(xzr).IsValid());
85551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(wzr).IsValid());
85561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(sp).IsValid());
85581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(wsp).IsValid());
85591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(d0).IsValid());
85611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(s0).IsValid());
85621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(d31).IsValid());
85631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(s31).IsValid());
85641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(x0).IsValidRegister());
85661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(w0).IsValidRegister());
85671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(xzr).IsValidRegister());
85681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(wzr).IsValidRegister());
85691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(sp).IsValidRegister());
85701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(wsp).IsValidRegister());
85711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!static_cast<CPURegister>(x0).IsValidFPRegister());
85721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!static_cast<CPURegister>(w0).IsValidFPRegister());
85731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!static_cast<CPURegister>(xzr).IsValidFPRegister());
85741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!static_cast<CPURegister>(wzr).IsValidFPRegister());
85751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!static_cast<CPURegister>(sp).IsValidFPRegister());
85761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!static_cast<CPURegister>(wsp).IsValidFPRegister());
85771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
85781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(d0).IsValidFPRegister());
85791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(static_cast<CPURegister>(s0).IsValidFPRegister());
85801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!static_cast<CPURegister>(d0).IsValidRegister());
85811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(!static_cast<CPURegister>(s0).IsValidRegister());
8582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(printf) {
8586ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  SETUP_SIZE(BUF_SIZE * 2);
8587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  char const * test_plain_string = "Printf with no arguments.\n";
8590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  char const * test_substring = "'This is a substring.'";
8591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump before;
8592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Initialize x29 to the value of the stack pointer. We will use x29 as a
8594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // temporary stack pointer later, and initializing it in this way allows the
8595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // RegisterDump check to pass.
8596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, __ StackPointer());
8597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test simple integer arguments.
8599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1234);
8600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1234);
8601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test simple floating-point arguments.
8603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d0, 1.234);
8604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test pointer (string) arguments.
8606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(test_substring));
8607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test the maximum number of arguments, and sign extension.
8609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, 0xffffffff);
8610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, 0xffffffff);
8611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 0xffffffffffffffff);
8612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x6, 0xffffffffffffffff);
8613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.234);
8614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 2.345);
8615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d3, 3.456);
8616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d4, 4.567);
8617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test printing callee-saved registers.
8619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, 0x123456789abcdef);
8620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 42.0);
8621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test with three arguments.
8623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x10, 3);
8624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x11, 40);
8625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x12, 500);
8626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8627ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // A single character.
8628ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Mov(w13, 'x');
8629ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
8630ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Check that we don't clobber any registers.
8631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  before.Dump(&masm);
8632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf(test_plain_string);   // NOLINT(runtime/printf)
8634ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Printf("x0: %" PRId64 ", x1: 0x%08" PRIx64 "\n", x0, x1);
8635ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Printf("w5: %" PRId32 ", x5: %" PRId64"\n", w5, x5);
8636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("d0: %f\n", d0);
8637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("Test %%s: %s\n", x2);
8638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n"
8639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n",
8640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl            w3, w4, x5, x6);
8641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4);
8642ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Printf("0x%" PRIx32 ", 0x%" PRIx64 "\n", w28, x28);
8643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("%g\n", d10);
8644ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Printf("%%%%%s%%%c%%\n", x2, w13);
8645ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
8646ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Print the stack pointer (sp).
8647ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Printf("StackPointer(sp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n",
8648ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl            __ StackPointer(), __ StackPointer().W());
8649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test with a different stack pointer.
8651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register old_stack_pointer = __ StackPointer();
8652ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Mov(x29, old_stack_pointer);
8653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(x29);
8654ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Print the stack pointer (not sp).
8655ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Printf("StackPointer(not sp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n",
8656ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl            __ StackPointer(), __ StackPointer().W());
8657ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Mov(old_stack_pointer, __ StackPointer());
8658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(old_stack_pointer);
8659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8660ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Test with three arguments.
8661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Printf("3=%u, 4=%u, 5=%u\n", x10, x11, x12);
8662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8663ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Mixed argument types.
8664ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Printf("w3: %" PRIu32 ", s1: %f, x5: %" PRIu64 ", d3: %f\n",
8665ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl            w3, s1, x5, d3);
8666ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Printf("s1: %f, d3: %f, w3: %" PRId32 ", x5: %" PRId64 "\n",
8667ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl            s1, d3, w3, x5);
8668ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
8669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We cannot easily test the output of the Printf sequences, and because
8673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Printf preserves all registers by default, we can't look at the number of
8674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // bytes that were printed. However, the printf_no_preserve test should check
8675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // that, and here we just test that we didn't clobber any registers.
8676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_REGISTERS(before);
8677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(printf_no_preserve) {
8683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  char const * test_plain_string = "Printf with no arguments.\n";
8687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  char const * test_substring = "'This is a substring.'";
8688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve(test_plain_string);
8690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, x0);
8691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test simple integer arguments.
8693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1234);
8694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1234);
8695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("x0: %" PRId64", x1: 0x%08" PRIx64 "\n", x0, x1);
8696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, x0);
8697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test simple floating-point arguments.
8699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d0, 1.234);
8700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("d0: %f\n", d0);
8701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, x0);
8702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test pointer (string) arguments.
8704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(test_substring));
8705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("Test %%s: %s\n", x2);
8706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, x0);
8707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test the maximum number of arguments, and sign extension.
8709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w3, 0xffffffff);
8710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w4, 0xffffffff);
8711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 0xffffffffffffffff);
8712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x6, 0xffffffffffffffff);
8713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n"
8714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                      "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n",
8715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl                      w3, w4, x5, x6);
8716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, x0);
8717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s1, 1.234);
8719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(s2, 2.345);
8720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d3, 3.456);
8721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d4, 4.567);
8722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4);
8723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, x0);
8724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test printing callee-saved registers.
8726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, 0x123456789abcdef);
8727ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ PrintfNoPreserve("0x%" PRIx32 ", 0x%" PRIx64 "\n", w28, x28);
8728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, x0);
8729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Fmov(d10, 42.0);
8731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("%g\n", d10);
8732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, x0);
8733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test with a different stack pointer.
8735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  const Register old_stack_pointer = __ StackPointer();
8736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, old_stack_pointer);
8737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(x29);
8738ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Print the stack pointer (not sp).
8739ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ PrintfNoPreserve(
8740ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl      "StackPointer(not sp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n",
8741ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl      __ StackPointer(), __ StackPointer().W());
8742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, x0);
8743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(old_stack_pointer, __ StackPointer());
8744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ SetStackPointer(old_stack_pointer);
8745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test with three arguments.
8747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 3);
8748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 40);
8749ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 500);
8750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PrintfNoPreserve("3=%u, 4=%u, 5=%u\n", x3, x4, x5);
8751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, x0);
8752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8753ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // Mixed argument types.
8754ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Mov(w3, 0xffffffff);
8755ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(s1, 1.234);
8756ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Mov(x5, 0xffffffffffffffff);
8757ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Fmov(d3, 3.456);
8758ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ PrintfNoPreserve("w3: %" PRIu32 ", s1: %f, x5: %" PRIu64 ", d3: %f\n",
8759ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl                      w3, s1, x5, d3);
8760ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  __ Mov(x29, x0);
8761ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
8762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // We cannot easily test the exact output of the Printf sequences, but we can
8766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // use the return code to check that the string length was correct.
8767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Printf with no arguments.
8769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(strlen(test_plain_string), x19);
8770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // x0: 1234, x1: 0x00001234
8771ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(25, x20);
8772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // d0: 1.234000
8773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(13, x21);
8774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test %s: 'This is a substring.'
8775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(32, x22);
8776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // w3(uint32): 4294967295
8777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // w4(int32): -1
8778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // x5(uint64): 18446744073709551615
8779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // x6(int64): -1
8780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(23 + 14 + 33 + 14, x23);
8781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // %f: 1.234000
8782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // %g: 2.345
8783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // %e: 3.456000e+00
8784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // %E: 4.567000E+00
8785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(13 + 10 + 17 + 17, x24);
8786ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // 0x89abcdef, 0x123456789abcdef
8787ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_64(30, x25);
8788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // 42
8789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x26);
8790ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // StackPointer(not sp): 0x00007fb037ae2370, 0x37ae2370
8791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Note: This is an example value, but the field width is fixed here so the
8792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // string length is still predictable.
8793ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_64(53, x27);
8794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // 3=3, 4=40, 5=500
8795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(17, x28);
8796ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  // w3: 4294967295, s1: 1.234000, x5: 18446744073709551615, d3: 3.456000
8797ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  ASSERT_EQUAL_64(69, x29);
8798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifndef USE_SIMULATOR
8804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(trace) {
8805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The Trace helper should not generate any code unless the simulator (or
8806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // debugger) is being used.
8807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label start;
8811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&start);
8812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Trace(LOG_ALL, TRACE_ENABLE);
8813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Trace(LOG_ALL, TRACE_DISABLE);
88141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
8815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif
8820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#ifndef USE_SIMULATOR
8823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(log) {
8824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // The Log helper should not generate any code unless the simulator (or
8825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // debugger) is being used.
8826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label start;
8830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&start);
8831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Log(LOG_ALL);
88321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
8833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#endif
8838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(instruction_accurate_scope) {
8841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // By default macro instructions are allowed.
88451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(masm.AllowMacroInstructions());
8846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
8847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    InstructionAccurateScope scope1(&masm);
88481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(!masm.AllowMacroInstructions());
8849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    {
8850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl      InstructionAccurateScope scope2(&masm);
88511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl      VIXL_ASSERT(!masm.AllowMacroInstructions());
8852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
88531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    VIXL_ASSERT(!masm.AllowMacroInstructions());
8854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
88551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(masm.AllowMacroInstructions());
8856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {
8858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    InstructionAccurateScope scope(&masm, 2);
8859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ add(x0, x0, x0);
8860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    __ sub(x0, x0, x0);
8861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
8862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(blr_lr) {
8870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // A simple test to check that the simulator correcty handle "blr lr".
8871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
8872ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label target;
8875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label end;
8876ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
8878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(lr, &target);
8879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Blr(lr);
8881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xdeadbeef);
8882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&end);
8883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&target);
8885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xc001c0de);
8886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&end);
8888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
8889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
8891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xc001c0de, x0);
8893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
8895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
8896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
8897f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8898f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(barriers) {
8899f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // Generate all supported barriers, this is just a smoke test
8900f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
8901f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8902f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
8903f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8904f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // DMB
8905f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(FullSystem, BarrierAll);
8906f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(FullSystem, BarrierReads);
8907f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(FullSystem, BarrierWrites);
8908f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(FullSystem, BarrierOther);
8909f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8910f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(InnerShareable, BarrierAll);
8911f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(InnerShareable, BarrierReads);
8912f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(InnerShareable, BarrierWrites);
8913f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(InnerShareable, BarrierOther);
8914f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8915f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(NonShareable, BarrierAll);
8916f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(NonShareable, BarrierReads);
8917f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(NonShareable, BarrierWrites);
8918f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(NonShareable, BarrierOther);
8919f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8920f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(OuterShareable, BarrierAll);
8921f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(OuterShareable, BarrierReads);
8922f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(OuterShareable, BarrierWrites);
8923f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dmb(OuterShareable, BarrierOther);
8924f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8925f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // DSB
8926f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(FullSystem, BarrierAll);
8927f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(FullSystem, BarrierReads);
8928f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(FullSystem, BarrierWrites);
8929f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(FullSystem, BarrierOther);
8930f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8931f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(InnerShareable, BarrierAll);
8932f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(InnerShareable, BarrierReads);
8933f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(InnerShareable, BarrierWrites);
8934f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(InnerShareable, BarrierOther);
8935f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8936f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(NonShareable, BarrierAll);
8937f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(NonShareable, BarrierReads);
8938f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(NonShareable, BarrierWrites);
8939f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(NonShareable, BarrierOther);
8940f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8941f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(OuterShareable, BarrierAll);
8942f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(OuterShareable, BarrierReads);
8943f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(OuterShareable, BarrierWrites);
8944f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Dsb(OuterShareable, BarrierOther);
8945f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8946f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  // ISB
8947f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Isb();
8948f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8949f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
8950f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8951f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
8952f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
8953f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
8954f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
8955f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
89561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
89571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(process_nan_double) {
89581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Make sure that NaN propagation works correctly.
89591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sn = rawbits_to_double(0x7ff5555511111111);
89601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qn = rawbits_to_double(0x7ffaaaaa11111111);
89611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sn));
89621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn));
89631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
89641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // The input NaNs after passing through ProcessNaN.
89651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sn_proc = rawbits_to_double(0x7ffd555511111111);
89661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qn_proc = qn;
89671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(sn_proc));
89681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn_proc));
89691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
89701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
89711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
89721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
89731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Execute a number of instructions which all use ProcessNaN, and check that
89741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // they all handle the NaN correctly.
89751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d0, sn);
89761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d10, qn);
89771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
89781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Operations that always propagate NaNs unchanged, even signalling NaNs.
89791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaN
89801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d1, d0);
89811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fabs(d2, d0);
89821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(d3, d0);
89831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaN
89841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d11, d10);
89851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fabs(d12, d10);
89861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(d13, d10);
89871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
89881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Operations that use ProcessNaN.
89891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaN
89901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsqrt(d4, d0);
89911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frinta(d5, d0);
89921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frintn(d6, d0);
89931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frintz(d7, d0);
89941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaN
89951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsqrt(d14, d10);
89961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frinta(d15, d10);
89971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frintn(d16, d10);
89981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frintz(d17, d10);
89991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // The behaviour of fcvt is checked in TEST(fcvt_sd).
90011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
90031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
90041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t qn_raw = double_to_rawbits(qn);
90061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t sn_raw = double_to_rawbits(sn);
90071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaN
90091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(sn, d1);
90101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(rawbits_to_double(sn_raw & ~kDSignMask), d2);
90111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(rawbits_to_double(sn_raw ^ kDSignMask), d3);
90121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaN
90131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(qn, d11);
90141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(rawbits_to_double(qn_raw & ~kDSignMask), d12);
90151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(rawbits_to_double(qn_raw ^ kDSignMask), d13);
90161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaN
90181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(sn_proc, d4);
90191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(sn_proc, d5);
90201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(sn_proc, d6);
90211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(sn_proc, d7);
90221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaN
90231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(qn_proc, d14);
90241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(qn_proc, d15);
90251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(qn_proc, d16);
90261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(qn_proc, d17);
90271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
90291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
90301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(process_nan_float) {
90331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Make sure that NaN propagation works correctly.
90341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sn = rawbits_to_float(0x7f951111);
90351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qn = rawbits_to_float(0x7fea1111);
90361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sn));
90371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn));
90381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // The input NaNs after passing through ProcessNaN.
90401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sn_proc = rawbits_to_float(0x7fd51111);
90411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qn_proc = qn;
90421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(sn_proc));
90431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn_proc));
90441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
90461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
90471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Execute a number of instructions which all use ProcessNaN, and check that
90491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // they all handle the NaN correctly.
90501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s0, sn);
90511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s10, qn);
90521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Operations that always propagate NaNs unchanged, even signalling NaNs.
90541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaN
90551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s1, s0);
90561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fabs(s2, s0);
90571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s3, s0);
90581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaN
90591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s11, s10);
90601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fabs(s12, s10);
90611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fneg(s13, s10);
90621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Operations that use ProcessNaN.
90641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaN
90651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsqrt(s4, s0);
90661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frinta(s5, s0);
90671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frintn(s6, s0);
90681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frintz(s7, s0);
90691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaN
90701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsqrt(s14, s10);
90711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frinta(s15, s10);
90721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frintn(s16, s10);
90731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Frintz(s17, s10);
90741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // The behaviour of fcvt is checked in TEST(fcvt_sd).
90761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
90781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
90791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint32_t qn_raw = float_to_rawbits(qn);
90811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint32_t sn_raw = float_to_rawbits(sn);
90821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaN
90841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(sn, s1);
90851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(rawbits_to_float(sn_raw & ~kSSignMask), s2);
90861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(rawbits_to_float(sn_raw ^ kSSignMask), s3);
90871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaN
90881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(qn, s11);
90891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(rawbits_to_float(qn_raw & ~kSSignMask), s12);
90901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(rawbits_to_float(qn_raw ^ kSSignMask), s13);
90911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
90921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaN
90931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(sn_proc, s4);
90941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(sn_proc, s5);
90951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(sn_proc, s6);
90961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(sn_proc, s7);
90971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaN
90981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(qn_proc, s14);
90991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(qn_proc, s15);
91001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(qn_proc, s16);
91011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(qn_proc, s17);
91021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
91041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
91051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlstatic void ProcessNaNsHelper(double n, double m, double expected) {
91081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(isnan(n) || isnan(m));
91091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(isnan(expected));
91101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
91121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
91131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Execute a number of instructions which all use ProcessNaNs, and check that
91151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // they all propagate NaNs correctly.
91161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d0, n);
91171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d1, m);
91181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(d2, d0, d1);
91201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(d3, d0, d1);
91211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(d4, d0, d1);
91221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(d5, d0, d1);
91231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmax(d6, d0, d1);
91241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmin(d7, d0, d1);
91251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
91271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
91281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(expected, d2);
91301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(expected, d3);
91311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(expected, d4);
91321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(expected, d5);
91331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(expected, d6);
91341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(expected, d7);
91351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
91371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
91381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(process_nans_double) {
91411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Make sure that NaN propagation works correctly.
91421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sn = rawbits_to_double(0x7ff5555511111111);
91431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sm = rawbits_to_double(0x7ff5555522222222);
91441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qn = rawbits_to_double(0x7ffaaaaa11111111);
91451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qm = rawbits_to_double(0x7ffaaaaa22222222);
91461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sn));
91471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sm));
91481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn));
91491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qm));
91501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // The input NaNs after passing through ProcessNaN.
91521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sn_proc = rawbits_to_double(0x7ffd555511111111);
91531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sm_proc = rawbits_to_double(0x7ffd555522222222);
91541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qn_proc = qn;
91551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qm_proc = qm;
91561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(sn_proc));
91571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(sm_proc));
91581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn_proc));
91591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qm_proc));
91601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Quiet NaNs are propagated.
91621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(qn, 0, qn_proc);
91631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(0, qm, qm_proc);
91641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(qn, qm, qn_proc);
91651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Signalling NaNs are propagated, and made quiet.
91671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(sn, 0, sn_proc);
91681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(0, sm, sm_proc);
91691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(sn, sm, sn_proc);
91701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Signalling NaNs take precedence over quiet NaNs.
91721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(sn, qm, sn_proc);
91731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(qn, sm, sm_proc);
91741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(sn, sm, sn_proc);
91751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
91761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlstatic void ProcessNaNsHelper(float n, float m, float expected) {
91791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(isnan(n) || isnan(m));
91801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(isnan(expected));
91811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
91831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
91841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Execute a number of instructions which all use ProcessNaNs, and check that
91861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // they all propagate NaNs correctly.
91871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s0, n);
91881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s1, m);
91891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fadd(s2, s0, s1);
91911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fsub(s3, s0, s1);
91921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmul(s4, s0, s1);
91931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fdiv(s5, s0, s1);
91941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmax(s6, s0, s1);
91951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmin(s7, s0, s1);
91961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
91971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
91981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
91991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(expected, s2);
92011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(expected, s3);
92021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(expected, s4);
92031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(expected, s5);
92041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(expected, s6);
92051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(expected, s7);
92061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
92081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
92091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(process_nans_float) {
92121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Make sure that NaN propagation works correctly.
92131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sn = rawbits_to_float(0x7f951111);
92141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sm = rawbits_to_float(0x7f952222);
92151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qn = rawbits_to_float(0x7fea1111);
92161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qm = rawbits_to_float(0x7fea2222);
92171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sn));
92181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sm));
92191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn));
92201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qm));
92211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // The input NaNs after passing through ProcessNaN.
92231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sn_proc = rawbits_to_float(0x7fd51111);
92241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sm_proc = rawbits_to_float(0x7fd52222);
92251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qn_proc = qn;
92261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qm_proc = qm;
92271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(sn_proc));
92281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(sm_proc));
92291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn_proc));
92301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qm_proc));
92311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Quiet NaNs are propagated.
92331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(qn, 0, qn_proc);
92341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(0, qm, qm_proc);
92351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(qn, qm, qn_proc);
92361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Signalling NaNs are propagated, and made quiet.
92381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(sn, 0, sn_proc);
92391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(0, sm, sm_proc);
92401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(sn, sm, sn_proc);
92411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Signalling NaNs take precedence over quiet NaNs.
92431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(sn, qm, sn_proc);
92441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(qn, sm, sm_proc);
92451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ProcessNaNsHelper(sn, sm, sn_proc);
92461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
92471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlstatic void DefaultNaNHelper(float n, float m, float a) {
92501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(isnan(n) || isnan(m) || isnan(a));
92511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  bool test_1op = isnan(n);
92531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  bool test_2op = isnan(n) || isnan(m);
92541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
92561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
92571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Enable Default-NaN mode in the FPCR.
92591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mrs(x0, FPCR);
92601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(x1, x0, DN_mask);
92611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Msr(FPCR, x1);
92621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Execute a number of instructions which all use ProcessNaNs, and check that
92641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // they all produce the default NaN.
92651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s0, n);
92661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s1, m);
92671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(s2, a);
92681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  if (test_1op) {
92701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    // Operations that always propagate NaNs unchanged, even signalling NaNs.
92711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmov(s10, s0);
92721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fabs(s11, s0);
92731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fneg(s12, s0);
92741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    // Operations that use ProcessNaN.
92761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fsqrt(s13, s0);
92771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Frinta(s14, s0);
92781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Frintn(s15, s0);
92791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Frintz(s16, s0);
92801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    // Fcvt usually has special NaN handling, but it respects default-NaN mode.
92821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcvt(d17, s0);
92831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
92841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  if (test_2op) {
92861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fadd(s18, s0, s1);
92871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fsub(s19, s0, s1);
92881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmul(s20, s0, s1);
92891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fdiv(s21, s0, s1);
92901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmax(s22, s0, s1);
92911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmin(s23, s0, s1);
92921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
92931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmadd(s24, s0, s1, s2);
92951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmsub(s25, s0, s1, s2);
92961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fnmadd(s26, s0, s1, s2);
92971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fnmsub(s27, s0, s1, s2);
92981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
92991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Restore FPCR.
93001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Msr(FPCR, x0);
93011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
93031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
93041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  if (test_1op) {
93061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    uint32_t n_raw = float_to_rawbits(n);
93071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(n, s10);
93081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(rawbits_to_float(n_raw & ~kSSignMask), s11);
93091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(rawbits_to_float(n_raw ^ kSSignMask), s12);
93101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s13);
93111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s14);
93121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s15);
93131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s16);
93141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d17);
93151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
93161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  if (test_2op) {
93181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s18);
93191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s19);
93201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s20);
93211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s21);
93221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s22);
93231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s23);
93241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
93251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s24);
93271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s25);
93281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s26);
93291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s27);
93301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
93321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
93331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(default_nan_float) {
93361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sn = rawbits_to_float(0x7f951111);
93371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sm = rawbits_to_float(0x7f952222);
93381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float sa = rawbits_to_float(0x7f95aaaa);
93391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qn = rawbits_to_float(0x7fea1111);
93401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qm = rawbits_to_float(0x7fea2222);
93411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  float qa = rawbits_to_float(0x7feaaaaa);
93421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sn));
93431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sm));
93441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sa));
93451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn));
93461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qm));
93471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qa));
93481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaNs
93501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, 0.0f, 0.0f);
93511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0f, sm, 0.0f);
93521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0f, 0.0f, sa);
93531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, sm, 0.0f);
93541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0f, sm, sa);
93551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, 0.0f, sa);
93561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, sm, sa);
93571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaNs
93581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, 0.0f, 0.0f);
93591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0f, qm, 0.0f);
93601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0f, 0.0f, qa);
93611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, qm, 0.0f);
93621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0f, qm, qa);
93631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, 0.0f, qa);
93641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, qm, qa);
93651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Mixed NaNs
93661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, sm, sa);
93671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, qm, sa);
93681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, sm, qa);
93691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, qm, sa);
93701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, qm, qa);
93711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, sm, qa);
93721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, qm, qa);
93731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
93741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlstatic void DefaultNaNHelper(double n, double m, double a) {
93771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(isnan(n) || isnan(m) || isnan(a));
93781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  bool test_1op = isnan(n);
93801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  bool test_2op = isnan(n) || isnan(m);
93811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
93831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
93841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Enable Default-NaN mode in the FPCR.
93861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mrs(x0, FPCR);
93871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(x1, x0, DN_mask);
93881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Msr(FPCR, x1);
93891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Execute a number of instructions which all use ProcessNaNs, and check that
93911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // they all produce the default NaN.
93921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d0, n);
93931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d1, m);
93941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmov(d2, a);
93951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
93961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  if (test_1op) {
93971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    // Operations that always propagate NaNs unchanged, even signalling NaNs.
93981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmov(d10, d0);
93991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fabs(d11, d0);
94001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fneg(d12, d0);
94011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    // Operations that use ProcessNaN.
94031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fsqrt(d13, d0);
94041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Frinta(d14, d0);
94051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Frintn(d15, d0);
94061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Frintz(d16, d0);
94071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    // Fcvt usually has special NaN handling, but it respects default-NaN mode.
94091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fcvt(s17, d0);
94101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
94111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  if (test_2op) {
94131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fadd(d18, d0, d1);
94141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fsub(d19, d0, d1);
94151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmul(d20, d0, d1);
94161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fdiv(d21, d0, d1);
94171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmax(d22, d0, d1);
94181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    __ Fmin(d23, d0, d1);
94191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
94201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmadd(d24, d0, d1, d2);
94221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fmsub(d25, d0, d1, d2);
94231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fnmadd(d26, d0, d1, d2);
94241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Fnmsub(d27, d0, d1, d2);
94251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Restore FPCR.
94271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Msr(FPCR, x0);
94281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
94301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
94311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  if (test_1op) {
94331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    uint64_t n_raw = double_to_rawbits(n);
94341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(n, d10);
94351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(rawbits_to_double(n_raw & ~kDSignMask), d11);
94361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(rawbits_to_double(n_raw ^ kDSignMask), d12);
94371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
94381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d14);
94391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d15);
94401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d16);
94411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s17);
94421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
94431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  if (test_2op) {
94451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d18);
94461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d19);
94471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d20);
94481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d21);
94491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d22);
94501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d23);
94511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  }
94521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d24);
94541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d25);
94551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d26);
94561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d27);
94571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
94591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
94601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(default_nan_double) {
94631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sn = rawbits_to_double(0x7ff5555511111111);
94641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sm = rawbits_to_double(0x7ff5555522222222);
94651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double sa = rawbits_to_double(0x7ff55555aaaaaaaa);
94661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qn = rawbits_to_double(0x7ffaaaaa11111111);
94671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qm = rawbits_to_double(0x7ffaaaaa22222222);
94681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa);
94691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sn));
94701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sm));
94711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsSignallingNaN(sa));
94721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qn));
94731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qm));
94741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(IsQuietNaN(qa));
94751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
94761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Signalling NaNs
94771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, 0.0, 0.0);
94781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0, sm, 0.0);
94791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0, 0.0, sa);
94801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, sm, 0.0);
94811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0, sm, sa);
94821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, 0.0, sa);
94831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, sm, sa);
94841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Quiet NaNs
94851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, 0.0, 0.0);
94861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0, qm, 0.0);
94871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0, 0.0, qa);
94881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, qm, 0.0);
94891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(0.0, qm, qa);
94901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, 0.0, qa);
94911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, qm, qa);
94921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  //   - Mixed NaNs
94931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, sm, sa);
94941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, qm, sa);
94951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, sm, qa);
94961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, qm, sa);
94971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(sn, qm, qa);
94981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, sm, qa);
94991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  DefaultNaNHelper(qn, qm, qa);
95001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
95011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
95021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
9503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}  // namespace vixl
9504