10cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Copyright 2015, 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 <float.h>
310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#include <cmath>
32ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
334a06316541258e3c058792321295ee36d409f419armvixl#include "test-runner.h"
34ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#include "test-utils-a64.h"
350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#include "vixl/a64/macro-assembler-a64.h"
360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#include "vixl/a64/simulator-a64.h"
370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#include "vixl/a64/debugger-a64.h"
380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#include "vixl/a64/disasm-a64.h"
390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#include "vixl/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
979795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang#ifdef VIXL_INCLUDE_SIMULATOR
98ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Run tests with the simulator.
9939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
10039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define SETUP()                                                                \
10139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  MacroAssembler masm(BUF_SIZE);                                               \
10239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP_COMMON()
10339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
10439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define SETUP_CUSTOM(size, pic)                                                \
10539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  byte* buf = new byte[size + BUF_SIZE];                                       \
10639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  MacroAssembler masm(buf, size + BUF_SIZE, pic);                              \
10739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP_COMMON()
10839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
10939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define SETUP_COMMON()                                                         \
1109795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  masm.SetAllowSimulatorInstructions(true);                                    \
111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Decoder decoder;                                                             \
1124a06316541258e3c058792321295ee36d409f419armvixl  Simulator* simulator = Test::run_debugger() ? new Debugger(&decoder)         \
1134a06316541258e3c058792321295ee36d409f419armvixl                                              : new Simulator(&decoder);       \
1144a06316541258e3c058792321295ee36d409f419armvixl  simulator->set_coloured_trace(Test::coloured_trace());                       \
1154a06316541258e3c058792321295ee36d409f419armvixl  simulator->set_instruction_stats(Test::instruction_stats());                 \
116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump core
117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
11839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl// This is a convenience macro to avoid creating a scope for every assembler
11939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl// function called. It will still assert the buffer hasn't been exceeded.
12039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define ALLOW_ASM()                                                            \
12139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  CodeBufferCheckScope guard(&masm, masm.BufferCapacity())
12239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define START()                                                                \
124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.Reset();                                                                \
125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  simulator->ResetState();                                                     \
126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushCalleeSavedRegisters();                                               \
1274a06316541258e3c058792321295ee36d409f419armvixl  if (Test::trace_reg()) {                                                     \
1284a06316541258e3c058792321295ee36d409f419armvixl    __ Trace(LOG_STATE, TRACE_ENABLE);                                         \
1294a06316541258e3c058792321295ee36d409f419armvixl  }                                                                            \
1304a06316541258e3c058792321295ee36d409f419armvixl  if (Test::trace_write()) {                                                   \
1314a06316541258e3c058792321295ee36d409f419armvixl    __ Trace(LOG_WRITE, TRACE_ENABLE);                                         \
1324a06316541258e3c058792321295ee36d409f419armvixl  }                                                                            \
1334a06316541258e3c058792321295ee36d409f419armvixl  if (Test::trace_sim()) {                                                     \
1344a06316541258e3c058792321295ee36d409f419armvixl    __ Trace(LOG_DISASM, TRACE_ENABLE);                                        \
135578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }                                                                            \
1364a06316541258e3c058792321295ee36d409f419armvixl  if (Test::instruction_stats()) {                                             \
137578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ EnableInstrumentation();                                                \
138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define END()                                                                  \
1414a06316541258e3c058792321295ee36d409f419armvixl  if (Test::instruction_stats()) {                                             \
142578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    __ DisableInstrumentation();                                               \
143578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }                                                                            \
1444a06316541258e3c058792321295ee36d409f419armvixl  __ Trace(LOG_ALL, TRACE_DISABLE);                                            \
145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  core.Dump(&masm);                                                            \
146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopCalleeSavedRegisters();                                                \
147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ret();                                                                    \
148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.FinalizeCode()
149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define RUN()                                                                  \
15139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  simulator->RunFrom(masm.GetStartAddress<Instruction*>())
15239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
15339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define TEARDOWN() TEARDOWN_COMMON()
15439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
15539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define TEARDOWN_CUSTOM()                                                      \
15639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  delete[] buf;                                                                \
15739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN_COMMON()
158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
15939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define TEARDOWN_COMMON()                                                      \
16039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  delete simulator;
161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1629795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang#else  // ifdef VIXL_INCLUDE_SIMULATOR.
163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl// Run the test on real hardware or models.
16439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define SETUP()                                                                \
16539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  MacroAssembler masm(BUF_SIZE);                                               \
16639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP_COMMON()
16739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
16839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define SETUP_CUSTOM(size, pic)                                                \
16939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  byte* buf = new byte[size + BUF_SIZE];                                       \
17039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  MacroAssembler masm(buf, size + BUF_SIZE, pic);                              \
17139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP_COMMON()
17239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
17339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define SETUP_COMMON()                                                         \
1749795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  masm.SetAllowSimulatorInstructions(false);                                   \
175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RegisterDump core;                                                           \
176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  CPU::SetUp()
177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl// This is a convenience macro to avoid creating a scope for every assembler
17939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl// function called. It will still assert the buffer hasn't been exceeded.
18039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define ALLOW_ASM()                                                            \
18139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  CodeBufferCheckScope guard(&masm, masm.BufferCapacity())
18239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define START()                                                                \
184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.Reset();                                                                \
185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PushCalleeSavedRegisters()
186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define END()                                                                  \
188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  core.Dump(&masm);                                                            \
189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ PopCalleeSavedRegisters();                                                \
190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ret();                                                                    \
191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  masm.FinalizeCode()
192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define RUN()                                                                  \
194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  {                                                                            \
19539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    byte* buffer_start = masm.GetStartAddress<byte*>();                        \
19639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    size_t buffer_length = masm.CursorOffset();                                \
197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    void (*test_function)(void);                                               \
19839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl                                                                               \
19939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    CPU::EnsureIAndDCacheCoherency(buffer_start, buffer_length);               \
20039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    VIXL_STATIC_ASSERT(sizeof(buffer_start) == sizeof(test_function));         \
20139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    memcpy(&test_function, &buffer_start, sizeof(buffer_start));               \
202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    test_function();                                                           \
203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
20539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define TEARDOWN()
20639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
20739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl#define TEARDOWN_CUSTOM()                                                      \
20839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  delete[] buf;                                                                \
209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2109795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang#endif  // ifdef VIXL_INCLUDE_SIMULATOR.
211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_NZCV(expected)                                            \
213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualNzcv(expected, core.flags_nzcv()))
214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_REGISTERS(expected)                                       \
216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualRegisters(&expected, &core))
217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_32(expected, result)                                      \
219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(Equal32(static_cast<uint32_t>(expected), &core, result))
220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_FP32(expected, result)                                    \
222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualFP32(expected, &core, result))
223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_64(expected, result)                                      \
225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(Equal64(expected, &core, result))
226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_EQUAL_FP64(expected, result)                                    \
228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  assert(EqualFP64(expected, &core, result))
229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#define ASSERT_EQUAL_128(expected_h, expected_l, result)                       \
2310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(Equal128(expected_h, expected_l, &core, result))
2320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl#define ASSERT_LITERAL_POOL_SIZE(expected)                                     \
2340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert((expected + kInstructionSize) == (masm.LiteralPoolSize()))
235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(stack_ops) {
238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // save sp.
242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, sp);
243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Set the sp to a known value.
245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, 0x1004);
246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, sp);
247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Add immediate to the sp, and move the result to a normal register.
2491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Add(sp, sp, 0x50);
250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, sp);
251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Add extended to the sp, and move the result to a normal register.
253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 0xfff);
254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Add(sp, sp, Operand(x17, SXTB));
255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, sp);
256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Create an sp using a logical instruction, and move to normal register.
2581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(sp, xzr, 0x1fff);
259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, sp);
260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Write wsp using a logical instruction.
2621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(wsp, wzr, 0xfffffff8);
263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, sp);
264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Write sp, and read back wsp.
2661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(sp, xzr, 0xfffffff8);
267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w5, wsp);
268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  //  restore sp.
270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x29);
271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1004, x0);
276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1054, x1);
277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1053, x2);
278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1fff, x3);
279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff8, x4);
280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffff8, x5);
281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mvn) {
287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w0, 0xfff);
291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x1, 0xfff);
292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w2, Operand(w0, LSL, 1));
293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x3, Operand(x1, LSL, 2));
294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w4, Operand(w0, LSR, 3));
295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x5, Operand(x1, LSR, 4));
296ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w6, Operand(w0, ASR, 11));
297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x7, Operand(x1, ASR, 12));
298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w8, Operand(w0, ROR, 13));
299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x9, Operand(x1, ROR, 14));
300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w10, Operand(w2, UXTB));
301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x11, Operand(x2, SXTB, 1));
302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(w12, Operand(w2, UXTH, 2));
303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x13, Operand(x2, SXTH, 3));
304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x14, Operand(w2, UXTW, 4));
305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mvn(x15, Operand(w2, SXTW, 4));
306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff000, x0);
3111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffff000, x1);
312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00001fff, x2);
3131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000003fff, x3);
314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xe00001ff, x4);
3151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0000000000000ff, x5);
316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x6);
3171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x7);
318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ff80000, x8);
3191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3ffc000000000000, x9);
320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff00, x10);
3211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000001, x11);
322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff8003, x12);
3231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff0007, x13);
3241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffe000f, x14);
3251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffe000f, x15);
326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
331f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(mov_imm_w) {
332f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
333f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
334f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w0, 0xffffffff);
3361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w1, 0xffff1234);
3371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w2, 0x1234ffff);
3381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w3, 0x00000000);
3391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w4, 0x00001234);
3401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w5, 0x12340000);
3411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(w6, 0x12345678);
34290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Mov(w7, (int32_t)0x80000000);
34390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Mov(w8, (int32_t)0xffff0000);
34490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Mov(w9, kWMinInt);
345f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
346f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
347f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
348f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
3491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff, x0);
3501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff1234, x1);
3511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffff, x2);
3521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000, x3);
3531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00001234, x4);
3541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x12340000, x5);
3551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x12345678, x6);
35690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(0x80000000, x7);
35790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(0xffff0000, x8);
35890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_32(kWMinInt, w9);
359f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
360f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
361f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
362f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
363f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
364f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(mov_imm_x) {
365f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
366f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
367f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
3681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
3691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffff1234);
3701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xffffffff12345678);
3711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, 0xffff1234ffff5678);
3721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x4, 0x1234ffffffff5678);
3731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x5, 0x1234ffff5678ffff);
3741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x6, 0x12345678ffffffff);
3751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x7, 0x1234ffffffffffff);
3761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x8, 0x123456789abcffff);
3771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x9, 0x12345678ffff9abc);
3781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x10, 0x1234ffff56789abc);
3791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x11, 0xffff123456789abc);
3801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x12, 0x0000000000000000);
3811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x13, 0x0000000000001234);
3821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x14, 0x0000000012345678);
3831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x15, 0x0000123400005678);
3841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0x1234000000005678);
3851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0x1234000056780000);
3861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x20, 0x1234567800000000);
3871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, 0x1234000000000000);
3881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, 0x123456789abc0000);
3891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x23, 0x1234567800009abc);
3901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0x1234000056789abc);
3911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x25, 0x0000123456789abc);
3921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x26, 0x123456789abcdef0);
3931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x27, 0xffff000000000001);
3941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x28, 0x8000ffff00000000);
3951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
3961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
3971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
3981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
3991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff1234, x1);
4001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff12345678, x2);
4011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff1234ffff5678, x3);
4021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffffffff5678, x4);
4031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffff5678ffff, x5);
4041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x12345678ffffffff, x6);
4051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffffffffffff, x7);
4061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x123456789abcffff, x8);
4071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x12345678ffff9abc, x9);
4081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234ffff56789abc, x10);
4091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff123456789abc, x11);
4101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x12);
4111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000001234, x13);
4121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000012345678, x14);
4131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000123400005678, x15);
4141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234000000005678, x18);
4151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234000056780000, x19);
4161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567800000000, x20);
4171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234000000000000, x21);
4181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x123456789abc0000, x22);
4191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567800009abc, x23);
4201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234000056789abc, x24);
4211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000123456789abc, x25);
4221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x123456789abcdef0, x26);
4231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff000000000001, x27);
4241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000ffff00000000, x28);
425f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
426f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
427f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
428f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
429f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
430f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mov) {
432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
43339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  ALLOW_ASM();
434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
4371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xffffffffffffffff);
4381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0xffffffffffffffff);
4391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x3, 0xffffffffffffffff);
440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x0123456789abcdef);
442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ movz(x1, UINT64_C(0xabcd) << 16);
4441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ movk(x2, UINT64_C(0xabcd) << 32);
4451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ movn(x3, UINT64_C(0xabcd) << 48);
446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x4, 0x0123456789abcdef);
448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, x4);
449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w6, -1);
451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test that moves back to the same register have the desired effect. This
453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // is a no-op for X registers, and a truncation for W registers.
4541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x7, 0x0123456789abcdef);
455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x7, x7);
4561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x8, 0x0123456789abcdef);
457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w8, w8);
4581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x9, 0x0123456789abcdef);
459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x9, Operand(x9));
4601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x10, 0x0123456789abcdef);
461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w10, Operand(w10));
462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w11, 0xfff);
464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x12, 0xfff);
465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w13, Operand(w11, LSL, 1));
466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x14, Operand(x12, LSL, 2));
467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w15, Operand(w11, LSR, 3));
468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, Operand(x12, LSR, 4));
469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w19, Operand(w11, ASR, 11));
470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, Operand(x12, ASR, 12));
471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w21, Operand(w11, ROR, 13));
472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, Operand(x12, ROR, 14));
473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w23, Operand(w13, UXTB));
474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, Operand(x13, SXTB, 1));
475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w25, Operand(w13, UXTH, 2));
476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, Operand(x13, SXTH, 3));
477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, Operand(w13, UXTW, 4));
478f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x28, 0x0123456789abcdef);
480f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w28, w28, kDiscardForSameWReg);
481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x0);
4861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000abcd0000, x1);
4871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffabcdffffffff, x2);
4881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x5432ffffffffffff, x3);
489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(x4, x5);
490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(-1, w6);
4911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x7);
4921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_32(0x89abcdef, w8);
4931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x9);
4941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_32(0x89abcdef, w10);
495ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000fff, x11);
4961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000fff, x12);
497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00001ffe, x13);
4981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000003ffc, x14);
499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000001ff, x15);
5001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000000000ff, x18);
501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000001, x19);
5021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000000000, x20);
503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7ff80000, x21);
5041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x3ffc000000000000, x22);
505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000fe, x23);
5061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffc, x24);
507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00007ff8, x25);
5081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000fff0, x26);
5091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000001ffe0, x27);
5101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x28);
511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orr) {
517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xf0f0);
521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x2, x0, Operand(x1));
524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w3, w0, Operand(w1, LSL, 28));
525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x4, x0, Operand(x1, LSL, 32));
526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x5, x0, Operand(x1, LSR, 4));
527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w6, w0, Operand(w1, ASR, 4));
528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x7, x0, Operand(x1, ASR, 4));
529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w8, w0, Operand(w1, ROR, 12));
530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x9, x0, Operand(x1, ROR, 12));
5311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(w10, w0, 0xf);
5321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(x11, x0, 0xf0000000f0000000);
533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000f000f0ff, x2);
538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf000f0f0, x3);
5391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf00000ff0000f0f0, x4);
5401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000f00f0ff, x5);
541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff00f0ff, x6);
5421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000f00f0ff, x7);
543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0ffff0f0, x8);
5441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0ff00000000ff0f0, x9);
5451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000f0ff, x10);
5461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0000000f000f0f0, x11);
547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orr_extend) {
553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
5571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008080);
558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w6, w0, Operand(w1, UXTB));
559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x7, x0, Operand(x1, UXTH, 1));
560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w8, w0, Operand(w1, UXTW, 2));
561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x9, x0, Operand(x1, UXTX, 3));
562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(w10, w0, Operand(w1, SXTB));
563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x11, x0, Operand(x1, SXTH, 1));
564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x12, x0, Operand(x1, SXTW, 2));
565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x13, x0, Operand(x1, SXTX, 3));
566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000081, x6);
5711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000010101, x7);
572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00020201, x8);
5731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000400040401, x9);
5741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffff81, x10);
5751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff0101, x11);
5761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00020201, x12);
5771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000400040401, x13);
578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bitwise_wide_imm) {
584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
5881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0xf0f0f0f0f0f0f0f0);
589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(x10, x0, 0x1234567890abcdef);
5911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orr(w11, w1, 0x90abcdef);
59290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
59390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Orr(w12, w0, kWMinInt);
59490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Eor(w13, w0, kWMinInt);
595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
6001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xf0f0f0f0f0f0f0f0, x1);
6011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x10);
6021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000f0fbfdff, x11);
60390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_32(kWMinInt, w12);
60490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_32(kWMinInt, w13);
605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orn) {
611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xf0f0);
615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x2, x0, Operand(x1));
618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w3, w0, Operand(w1, LSL, 4));
619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x4, x0, Operand(x1, LSL, 4));
620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x5, x0, Operand(x1, LSR, 1));
621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w6, w0, Operand(w1, ASR, 1));
622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x7, x0, Operand(x1, ASR, 1));
623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w8, w0, Operand(w1, ROR, 16));
624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x9, x0, Operand(x1, ROR, 16));
6251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orn(w10, w0, 0x0000ffff);
6261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Orn(x11, x0, 0x0000ffff0000ffff);
627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff0ffffff0, x2);
632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff0ff, x3);
6331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffff0fffff0ff, x4);
6341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff87fffff0, x5);
635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x07fffff0, x6);
6361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff87fffff0, x7);
637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff00ffff, x8);
6381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xff00ffffffffffff, x9);
639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffff0f0, x10);
6401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffff0000fffff0f0, x11);
641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(orn_extend) {
647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
6511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w6, w0, Operand(w1, UXTB));
653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x7, x0, Operand(x1, UXTH, 1));
654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w8, w0, Operand(w1, UXTW, 2));
655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x9, x0, Operand(x1, UXTX, 3));
656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(w10, w0, Operand(w1, SXTB));
657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x11, x0, Operand(x1, SXTH, 1));
658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x12, x0, Operand(x1, SXTW, 2));
659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orn(x13, x0, Operand(x1, SXTX, 3));
660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff7f, x6);
6651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffefefd, x7);
666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffdfdfb, x8);
6671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7, x9);
668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007f, x10);
6691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000fefd, x11);
6701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001fffdfdfb, x12);
6711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7, x13);
672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(and_) {
678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x2, x0, Operand(x1));
685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w3, w0, Operand(w1, LSL, 4));
686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x4, x0, Operand(x1, LSL, 4));
687ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x5, x0, Operand(x1, LSR, 1));
688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w6, w0, Operand(w1, ASR, 20));
689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x7, x0, Operand(x1, ASR, 20));
690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w8, w0, Operand(w1, ROR, 28));
691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x9, x0, Operand(x1, ROR, 28));
692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w10, w0, Operand(0xff00));
693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x11, x0, Operand(0xff));
694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x2);
699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x3);
700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x4);
701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000070, x5);
702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x6);
703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000f00, x7);
704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000ff0, x8);
705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x9);
706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x10);
707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x11);
708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(and_extend) {
714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
7181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w6, w0, Operand(w1, UXTB));
720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x7, x0, Operand(x1, UXTH, 1));
721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w8, w0, Operand(w1, UXTW, 2));
722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x9, x0, Operand(x1, UXTX, 3));
723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(w10, w0, Operand(w1, SXTB));
724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x11, x0, Operand(x1, SXTH, 1));
725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x12, x0, Operand(x1, SXTW, 2));
726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ And(x13, x0, Operand(x1, SXTX, 3));
727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000081, x6);
7321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000010102, x7);
733ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00020204, x8);
7341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000400040408, x9);
735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff81, x10);
7361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff0102, x11);
7371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00020204, x12);
7381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000400040408, x13);
739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
742ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
743ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
744ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ands) {
745ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
746ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
748ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
749f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w1, Operand(w1));
750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xf00000ff, x0);
756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
760f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(w1, LSR, 4));
761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
7691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x8000000000000000);
770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x00000001);
771f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(x0, x0, Operand(x1, ROR, 1));
772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
7771123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x0);
778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
779ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
780ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
781f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(0xf));
782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xff000000);
791f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Ands(w0, w0, Operand(0x80000000));
792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
795ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x0);
798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bic) {
804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x2, x0, Operand(x1));
811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w3, w0, Operand(w1, LSL, 4));
812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x4, x0, Operand(x1, LSL, 4));
813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x5, x0, Operand(x1, LSR, 1));
814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w6, w0, Operand(w1, ASR, 20));
815ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x7, x0, Operand(x1, ASR, 20));
816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w8, w0, Operand(w1, ROR, 28));
817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x9, x0, Operand(x1, ROR, 24));
818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x10, x0, Operand(0x1f));
819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x11, x0, Operand(0x100));
820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test bic into sp when the constant cannot be encoded in the immediate
822ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // field.
823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Use x20 to preserve sp. We check for the result via x21 because the
824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // test infrastructure requires that sp be restored to its original value.
825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, sp);
826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffff);
827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(sp, x0, Operand(0xabcdef));
828ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, sp);
829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(sp, x20);
830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
831ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
832ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x2);
835ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x3);
836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x4);
837ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff80, x5);
838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x000000f0, x6);
839ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f0f0, x7);
840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x8);
841ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff00, x9);
842ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ffe0, x10);
843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000fef0, x11);
844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x543210, x21);
846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
847ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
848ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
849ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bic_extend) {
852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
8551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
8561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
857ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w6, w0, Operand(w1, UXTB));
858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x7, x0, Operand(x1, UXTH, 1));
859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w8, w0, Operand(w1, UXTW, 2));
860ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x9, x0, Operand(x1, UXTX, 3));
861ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(w10, w0, Operand(w1, SXTB));
862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x11, x0, Operand(x1, SXTH, 1));
863ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x12, x0, Operand(x1, SXTW, 2));
864ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bic(x13, x0, Operand(x1, SXTX, 3));
865ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff7e, x6);
8701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffefefd, x7);
871ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffdfdfb, x8);
8721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7, x9);
873ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007e, x10);
8741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000fefd, x11);
8751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001fffdfdfb, x12);
8761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffbfffbfbf7, x13);
877ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(bics) {
883ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xffff);
887f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(w0, w1, Operand(w1));
888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
890ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
896ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xffffffff);
897f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(w0, w0, Operand(w0, LSR, 1));
898ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
901ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
902ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x80000000, x0);
904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
9061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x8000000000000000);
907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x00000001);
908f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Bics(x0, x0, Operand(x1, ROR, 1));
909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
911ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
912ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
913ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
9171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0xffffffffffffffff);
9181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bics(x0, x0, 0x7fffffffffffffff);
919ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
920ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
923ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(NFlag);
9241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x0);
925ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
926ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
927ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(w0, 0xffff0000);
9281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bics(w0, w0, 0xfffffff0);
929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_NZCV(ZFlag);
934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00000000, x0);
935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
936ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
937ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
938ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
939ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
940ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eor) {
941ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
942ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
943ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
944ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
946ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x2, x0, Operand(x1));
948ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w3, w0, Operand(w1, LSL, 4));
949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x4, x0, Operand(x1, LSL, 4));
950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x5, x0, Operand(x1, LSR, 1));
951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w6, w0, Operand(w1, ASR, 20));
952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x7, x0, Operand(x1, ASR, 20));
953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w8, w0, Operand(w1, ROR, 28));
954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x9, x0, Operand(x1, ROR, 28));
9551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Eor(w10, w0, 0xff00ff00);
9561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Eor(x11, x0, 0xff00ff00ff00ff00);
957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
9611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000f000ff0f, x2);
962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f000, x3);
9631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000f0000f000, x4);
9641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000007800ff8f, x5);
965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff00f0, x6);
9661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000f0f0, x7);
967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000f00f, x8);
9681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000ff00000ffff, x9);
969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xff0000f0, x10);
9701123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xff00ff00ff0000f0, x11);
971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eor_extend) {
976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
9791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x1111111111111111);
9801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w6, w0, Operand(w1, UXTB));
982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x7, x0, Operand(x1, UXTH, 1));
983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w8, w0, Operand(w1, UXTW, 2));
984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x9, x0, Operand(x1, UXTX, 3));
985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(w10, w0, Operand(w1, SXTB));
986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x11, x0, Operand(x1, SXTH, 1));
987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x12, x0, Operand(x1, SXTW, 2));
988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x13, x0, Operand(x1, SXTX, 3));
989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x11111190, x6);
9941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1111111111101013, x7);
995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x11131315, x8);
9961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1111111511151519, x9);
997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeee90, x10);
9981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeeeeeee1013, x11);
9991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeef11131315, x12);
10001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1111111511151519, x13);
1001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eon) {
1007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0xfff0);
1011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0xf00000ff);
1012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x2, x0, Operand(x1));
1014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w3, w0, Operand(w1, LSL, 4));
1015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x4, x0, Operand(x1, LSL, 4));
1016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x5, x0, Operand(x1, LSR, 1));
1017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w6, w0, Operand(w1, ASR, 20));
1018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x7, x0, Operand(x1, ASR, 20));
1019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w8, w0, Operand(w1, ROR, 28));
1020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x9, x0, Operand(x1, ROR, 28));
10211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Eon(w10, w0, 0x03c003c0);
10221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Eon(x11, x0, 0x0000100000001000);
1023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1025ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
10271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff0fff00f0, x2);
1028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff0fff, x3);
10291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffff0ffff0fff, x4);
10301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff87ff0070, x5);
1031ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000ff0f, x6);
10321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff0f0f, x7);
1033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff0ff0, x8);
10341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffff00fffff0000, x9);
1035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfc3f03cf, x10);
10361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffefffffff100f, x11);
1037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(eon_extend) {
1043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
10461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x1111111111111111);
10471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x1, 0x8000000080008081);
1048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w6, w0, Operand(w1, UXTB));
1049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x7, x0, Operand(x1, UXTH, 1));
1050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w8, w0, Operand(w1, UXTW, 2));
1051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x9, x0, Operand(x1, UXTX, 3));
1052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(w10, w0, Operand(w1, SXTB));
1053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x11, x0, Operand(x1, SXTH, 1));
1054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x12, x0, Operand(x1, SXTW, 2));
1055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eon(x13, x0, Operand(x1, SXTX, 3));
1056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeeeee6f, x6);
10611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeeeeeefefec, x7);
1062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xeeececea, x8);
10631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeeaeeeaeae6, x9);
1064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1111116f, x10);
10651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x111111111111efec, x11);
10661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x11111110eeececea, x12);
10671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xeeeeeeeaeeeaeae6, x13);
1068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(mul) {
1074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
10770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 0);
10780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x26, 1);
1079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
10801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
10820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(w0, w25, w25);
10830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(w1, w25, w26);
10840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(w2, w26, w18);
1085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(w3, w18, w19);
10860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(x4, x25, x25);
10870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(x5, x26, x18);
1088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x6, x18, x19);
1089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mul(x7, x19, x19);
10900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smull(x8, w26, w18);
1091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smull(x9, w18, w18);
1092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smull(x10, w19, w19);
10930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mneg(w11, w25, w25);
10940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mneg(w12, w25, w26);
10950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mneg(w13, w26, w18);
1096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(w14, w18, w19);
10970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mneg(x20, x25, x25);
10980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mneg(x21, x26, x18);
1099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x22, x18, x19);
1100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mneg(x23, x19, x19);
1101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x3);
1109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x4);
1110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x5);
11111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000001, x6);
1112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
11131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x8);
1114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x9);
1115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x10);
1116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
1117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
1119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x14);
1120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x20);
11211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000001, x21);
1122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x22);
11231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x23);
1124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1129f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlstatic void SmullHelper(int64_t expected, int64_t a, int64_t b) {
1130f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
1131f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
1132f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w0, a);
1133f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(w1, b);
1134f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Smull(x2, w0, w1);
1135f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
1136f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
1137f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(expected, x2);
1138f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
1139f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
1140f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1141f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1142f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixlTEST(smull) {
1143f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0, 0, 0);
1144f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(1, 1, 1);
1145f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(-1, -1, 1);
1146f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(1, -1, -1);
1147f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0xffffffff80000000, 0x80000000, 1);
1148f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SmullHelper(0x0000000080000000, 0x00010000, 0x00008000);
1149f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
1150f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1151f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(madd) {
1153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
11591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w0, w16, w16, w16);
1162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w1, w16, w16, w17);
1163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w2, w16, w16, w18);
1164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w3, w16, w16, w19);
1165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w4, w16, w17, w17);
1166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w5, w17, w17, w18);
1167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w6, w17, w17, w19);
1168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w7, w17, w18, w16);
1169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w8, w17, w18, w18);
1170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w9, w18, w18, w17);
1171ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w10, w18, w19, w18);
1172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(w11, w19, w19, w19);
1173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x12, x16, x16, x16);
1175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x13, x16, x16, x17);
1176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x14, x16, x16, x18);
1177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x15, x16, x16, x19);
1178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x20, x16, x17, x17);
1179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x21, x17, x17, x18);
1180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x22, x17, x17, x19);
1181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x23, x17, x18, x16);
1182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x24, x17, x18, x18);
1183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x25, x18, x18, x17);
1184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x26, x18, x19, x18);
1185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Madd(x27, x19, x19, x19);
1186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
1193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
1197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x6);
1198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x7);
1199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x8);
1200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x9);
1201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x10);
1202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x11);
1203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
12061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000ffffffff, x14);
1207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x15);
1208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x20);
12091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000100000000, x21);
1210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x22);
12111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000ffffffff, x23);
12121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001fffffffe, x24);
12131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00000002, x25);
1214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x26);
1215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x27);
1216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1219ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1220ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1221ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(msub) {
1222ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1225ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
1226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
1227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, 0xffffffff);
12281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w0, w16, w16, w16);
1231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w1, w16, w16, w17);
1232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w2, w16, w16, w18);
1233ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w3, w16, w16, w19);
1234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w4, w16, w17, w17);
1235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w5, w17, w17, w18);
1236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w6, w17, w17, w19);
1237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w7, w17, w18, w16);
1238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w8, w17, w18, w18);
1239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w9, w18, w18, w17);
1240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w10, w18, w19, w18);
1241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(w11, w19, w19, w19);
1242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x12, x16, x16, x16);
1244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x13, x16, x16, x17);
1245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x14, x16, x16, x18);
1246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x15, x16, x16, x19);
1247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x20, x16, x17, x17);
1248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x21, x17, x17, x18);
1249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x22, x17, x17, x19);
1250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x23, x17, x18, x16);
1251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x24, x17, x18, x18);
1252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x25, x18, x18, x17);
1253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x26, x18, x19, x18);
1254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Msub(x27, x19, x19, x19);
1255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x1);
1262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x2);
1263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x5);
1266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x6);
1267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
1268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
1269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x9);
1270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x10);
1271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
1272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x12);
1274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x13);
12751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000ffffffff, x14);
12761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x15);
1277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x20);
12781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000000fffffffe, x21);
12791123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x22);
12801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000001, x23);
1281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x24);
12821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000200000000, x25);
12831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001fffffffe, x26);
12841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x27);
1285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(smulh) {
1291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 0);
1295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 1);
12961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, 0x0000000100000000);
12971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x23, 0x0000000012345678);
12981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0x0123456789abcdef);
12991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x25, 0x0000000200000000);
13001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x26, 0x8000000000000000);
13011123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x27, 0xffffffffffffffff);
13021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x28, 0x5555555555555555);
13031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x29, 0xaaaaaaaaaaaaaaaa);
1304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x0, x20, x24);
1306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x1, x21, x24);
1307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x2, x22, x23);
1308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x3, x22, x24);
1309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x4, x24, x25);
1310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x5, x23, x27);
1311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x6, x26, x26);
1312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x7, x26, x27);
1313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x8, x27, x27);
1314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x9, x28, x28);
1315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x10, x28, x29);
1316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smulh(x11, x29, x29);
1317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x0);
1322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
1323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x2);
13241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000001234567, x3);
13251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000002468acf, x4);
13261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x5);
13271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x4000000000000000, x6);
1328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x7);
1329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
13301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1c71c71c71c71c71, x9);
13311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xe38e38e38e38e38e, x10);
13321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1c71c71c71c71c72, x11);
1333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
13380cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(umulh) {
13390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
13400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
13410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
13420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, 0);
13430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, 1);
13440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 0x0000000100000000);
13450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, 0x0000000012345678);
13460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, 0x0123456789abcdef);
13470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 0x0000000200000000);
13480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x26, 0x8000000000000000);
13490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x27, 0xffffffffffffffff);
13500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x28, 0x5555555555555555);
13510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x29, 0xaaaaaaaaaaaaaaaa);
13520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
13530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x0, x20, x24);
13540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x1, x21, x24);
13550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x2, x22, x23);
13560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x3, x22, x24);
13570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x4, x24, x25);
13580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x5, x23, x27);
13590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x6, x26, x26);
13600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x7, x26, x27);
13610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x8, x27, x27);
13620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x9, x28, x28);
13630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x10, x28, x29);
13640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umulh(x11, x29, x29);
13650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
13660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
13670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
13680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
13690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x0);
13700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x1);
13710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x2);
13720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000001234567, x3);
13730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000002468acf, x4);
13740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000012345677, x5);
13750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x4000000000000000, x6);
13760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x7);
13770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x8);
13780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1c71c71c71c71c71, x9);
13790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x38e38e38e38e38e3, x10);
13800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x71c71c71c71c71c6, x11);
13810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
13820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
13830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
13840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
13850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
13860cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(smaddl_umaddl_umull) {
1387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
13911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0x00000000ffffffff);
13921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 4);
13941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, 0x0000000200000000);
1395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x9, w17, w18, x20);
1397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x10, w18, w18, x20);
1398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x11, w19, w19, x20);
1399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smaddl(x12, w19, w19, x21);
1400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x13, w17, w18, x20);
1401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x14, w18, w18, x20);
1402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x15, w19, w19, x20);
1403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umaddl(x22, w19, w19, x21);
14040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umull(x24, w19, w19);
14050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umull(x25, w17, w18);
1406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x9);
1411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x10);
1412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x11);
14131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000200000001, x12);
14141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000100000003, x13);
14151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00000005, x14);
14161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfffffffe00000005, x15);
14171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(1, x22);
14180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffe00000001, x24);
14190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00000000ffffffff, x25);
1420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(smsubl_umsubl) {
1426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 1);
14301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0x00000000ffffffff);
14311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, 0xffffffffffffffff);
1432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, 4);
14331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, 0x0000000200000000);
1434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x9, w17, w18, x20);
1436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x10, w18, w18, x20);
1437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x11, w19, w19, x20);
1438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Smsubl(x12, w19, w19, x21);
1439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x13, w17, w18, x20);
1440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x14, w18, w18, x20);
1441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x15, w19, w19, x20);
1442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Umsubl(x22, w19, w19, x21);
1443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(5, x9);
1448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x10);
1449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x11);
14501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000001ffffffff, x12);
14511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000005, x13);
14521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000200000003, x14);
14531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000200000003, x15);
14541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x00000003ffffffff, x22);
1455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(div) {
1461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 1);
1465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 0xffffffff);
14661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0xffffffffffffffff);
1467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, 0x80000000);
14681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x20, 0x8000000000000000);
1469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, 2);
1470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w0, w16, w16);
1472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w1, w17, w16);
1473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w2, w16, w16);
1474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w3, w16, w17);
1475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w4, w17, w18);
1476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x5, x16, x16);
1478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x6, x17, x18);
1479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x7, x16, x16);
1480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x8, x16, x17);
1481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x9, x17, x18);
1482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(w10, w19, w21);
1484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(w11, w19, w21);
1485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x12, x19, x21);
1486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x13, x19, x21);
1487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Udiv(x14, x20, x21);
1488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Sdiv(x15, x20, x21);
1489f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1490f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(w22, w19, w17);
1491f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(w23, w19, w17);
1492f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x24, x20, x18);
1493f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x25, x20, x18);
1494f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1495f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x26, x16, x21);
1496f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x27, x16, x21);
1497f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x28, x18, x21);
1498f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x29, x18, x21);
1499f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
1500f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Mov(x17, 0);
1501f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(w18, w16, w17);
1502f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(w19, w16, w17);
1503f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Udiv(x20, x16, x17);
1504f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Sdiv(x21, x16, x17);
1505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
1510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x1);
1511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
1512ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
1513ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
1514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x5);
1515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x6);
1516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x7);
1517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x8);
15181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff00000001, x9);
1519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x40000000, x10);
15200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xc0000000, x11);
15211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000040000000, x12);
15221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000040000000, x13);
15231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x4000000000000000, x14);
15240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xc000000000000000, x15);
1525f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x22);
1526f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0x80000000, x23);
1527f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x24);
15281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x8000000000000000, x25);
1529f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x26);
1530f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x27);
15311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x28);
1532f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x29);
1533f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x18);
1534f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x19);
1535f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x20);
1536f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  ASSERT_EQUAL_64(0, x21);
1537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(rbit_rev) {
1543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
15461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0xfedcba9876543210);
1547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rbit(w0, w24);
1548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rbit(x1, x24);
1549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev16(w2, w24);
1550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev16(x3, x24);
1551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev(w4, w24);
1552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev32(x5, x24);
1553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Rev(x6, x24);
1554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x084c2a6e, x0);
15591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x084c2a6e195d3b7f, x1);
1560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x54761032, x2);
15611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xdcfe98ba54761032, x3);
1562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x10325476, x4);
15631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x98badcfe10325476, x5);
15641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x1032547698badcfe, x6);
1565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(clz_cls) {
1571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
15741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x24, 0x0008000000800000);
15751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x25, 0xff800000fff80000);
1576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, 0);
1577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w0, w24);
1578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x1, x24);
1579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w2, w25);
1580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x3, x25);
1581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(w4, w26);
1582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Clz(x5, x26);
1583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w6, w24);
1584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x7, x24);
1585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w8, w25);
1586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x9, x25);
1587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(w10, w26);
1588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cls(x11, x26);
1589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1590ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(8, x0);
1594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(12, x1);
1595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x2);
1596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
1597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(32, x4);
1598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(64, x5);
1599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(7, x6);
1600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(11, x7);
1601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(12, x8);
1602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(8, x9);
1603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(31, x10);
1604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(63, x11);
1605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(label) {
1611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label label_1, label_2, label_3, label_4;
1614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x1);
1617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x0);
1618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, lr);    // Save lr.
1619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);
1621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);
1622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_1);     // Multiple branches to the same label.
1623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_2);
1625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_3);     // Forward branch.
1626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_1);
1628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&label_2);     // Backward branch.
1629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_3);
1631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&label_4);
1632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_4);
1635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1);
1636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(lr, x22);
1637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x0);
1642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x1);
1643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
164839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlTEST(label_2) {
164939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
165039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
165139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  Label label_1, label_2, label_3;
165239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  Label first_jump_to_3;
165339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
165439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
165539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Mov(x0, 0x0);
165639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
165739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ B(&label_1);
165839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  ptrdiff_t offset_2 = masm.CursorOffset();
165939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Orr(x0, x0, 1 << 1);
166039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ B(&label_3);
166139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  ptrdiff_t offset_1 = masm.CursorOffset();
166239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Orr(x0, x0, 1 << 0);
166339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ B(&label_2);
166439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  ptrdiff_t offset_3 = masm.CursorOffset();
166539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Tbz(x0, 2, &first_jump_to_3);
166639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Orr(x0, x0, 1 << 3);
166739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Bind(&first_jump_to_3);
166839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Orr(x0, x0, 1 << 2);
166939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Tbz(x0, 3, &label_3);
167039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
167139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  // Labels 1, 2, and 3 are bound before the current buffer offset. Branches to
167239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  // label_1 and label_2 branch respectively forward and backward. Branches to
167339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  // label 3 include both forward and backward branches.
167439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  masm.BindToOffset(&label_1, offset_1);
167539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  masm.BindToOffset(&label_2, offset_2);
167639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  masm.BindToOffset(&label_3, offset_3);
167739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
167839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  END();
167939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
168039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  RUN();
168139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
168239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  ASSERT_EQUAL_64(0xf, x0);
168339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
168439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
168539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
168639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
168739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
1688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(adr) {
1689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
1690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1691ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label label_1, label_2, label_3, label_4;
1692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);        // Set to non-zero to indicate failure.
1695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x1, &label_3);   // Set to zero to indicate success.
1696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_1);   // Multiple forward references to the same label.
1698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x3, &label_1);
1699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x4, &label_1);
1700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1701ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_2);
1702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x5, x2, Operand(x3));  // Ensure that x2,x3 and x4 are identical.
1703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x6, x2, Operand(x4));
1704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x0, x0, Operand(x5));
1705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Orr(x0, x0, Operand(x6));
1706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x2);  // label_1, label_3
1707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_3);
1709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_3);   // Self-reference (offset 0).
1710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Eor(x1, x1, Operand(x2));
1711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_4);   // Simple forward reference.
1712ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x2);  // label_4
1713ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_1);
1715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x2, &label_3);   // Multiple reverse references to the same label.
1716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x3, &label_3);
1717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x4, &label_3);
1718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Adr(x5, &label_2);   // Simple reverse reference.
1719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x5);  // label_2
1720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&label_4);
1722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
1723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
1725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x0);
1727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0, x1);
1728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
1730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
1731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
173390b0414b6c794be58f34813f84c2c06e6a15be91armvixl// Simple adrp tests: check that labels are linked and handled properly.
173490b0414b6c794be58f34813f84c2c06e6a15be91armvixl// This is similar to the adr test, but all the adrp instructions are put on the
173590b0414b6c794be58f34813f84c2c06e6a15be91armvixl// same page so that they return the same value.
173690b0414b6c794be58f34813f84c2c06e6a15be91armvixlTEST(adrp) {
173790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  Label start;
173890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  Label label_1, label_2, label_3;
173990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
174090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  SETUP_CUSTOM(2 * kPageSize, PageOffsetDependentCode);
174190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  START();
174290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
174390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  // Waste space until the start of a page.
174439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  {
174539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    InstructionAccurateScope scope(&masm,
174639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl                                   kPageSize / kInstructionSize,
174739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl                                   InstructionAccurateScope::kMaximumSize);
174890b0414b6c794be58f34813f84c2c06e6a15be91armvixl    const uintptr_t kPageOffsetMask = kPageSize - 1;
174939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    while ((masm.GetCursorAddress<uintptr_t>() & kPageOffsetMask) != 0) {
175090b0414b6c794be58f34813f84c2c06e6a15be91armvixl      __ b(&start);
175190b0414b6c794be58f34813f84c2c06e6a15be91armvixl    }
175290b0414b6c794be58f34813f84c2c06e6a15be91armvixl    __ bind(&start);
175390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  }
175490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
175590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  // Simple forward reference.
175690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x0, &label_2);
175790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
175890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Bind(&label_1);
175990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
176090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  // Multiple forward references to the same label.
176190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x1, &label_3);
176290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x2, &label_3);
176390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x3, &label_3);
176490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
176590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Bind(&label_2);
176690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
176790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  // Self-reference (offset 0).
176890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x4, &label_2);
176990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
177090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Bind(&label_3);
177190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
177290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  // Simple reverse reference.
177390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x5, &label_1);
177490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
177590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  // Multiple reverse references to the same label.
177690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x6, &label_2);
177790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x7, &label_2);
177890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  __ Adrp(x8, &label_2);
177990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
178090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  VIXL_ASSERT(masm.SizeOfCodeGeneratedSince(&start) < kPageSize);
178190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  END();
178290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  RUN();
178390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
178490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  uint64_t expected = reinterpret_cast<uint64_t>(
178590b0414b6c794be58f34813f84c2c06e6a15be91armvixl      AlignDown(masm.GetLabelAddress<uint64_t*>(&start), kPageSize));
178690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x0);
178790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x1);
178890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x2);
178990b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x3);
179090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x4);
179190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x5);
179290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x6);
179390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x7);
179490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x8);
179590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
179639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN_CUSTOM();
179790b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
179890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
179990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
180090b0414b6c794be58f34813f84c2c06e6a15be91armvixlstatic void AdrpPageBoundaryHelper(unsigned offset_into_page) {
180190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  VIXL_ASSERT(offset_into_page < kPageSize);
180290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  VIXL_ASSERT((offset_into_page % kInstructionSize) == 0);
180390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
180490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  const uintptr_t kPageOffsetMask = kPageSize - 1;
180590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
180690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  // The test label is always bound on page 0. Adrp instructions are generated
180790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  // on pages from kStartPage to kEndPage (inclusive).
180890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  const int kStartPage = -16;
180990b0414b6c794be58f34813f84c2c06e6a15be91armvixl  const int kEndPage = 16;
181039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  const int kMaxCodeSize = (kEndPage - kStartPage + 2) * kPageSize;
181190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
181239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP_CUSTOM(kMaxCodeSize, PageOffsetDependentCode);
181390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  START();
181490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
181590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  Label test;
181639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  Label start;
181790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
181839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  {
181939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    InstructionAccurateScope scope(&masm,
182039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl                                   kMaxCodeSize / kInstructionSize,
182139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl                                   InstructionAccurateScope::kMaximumSize);
182239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    // Initialize NZCV with `eq` flags.
182339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    __ cmp(wzr, wzr);
182490b0414b6c794be58f34813f84c2c06e6a15be91armvixl    // Waste space until the start of a page.
182539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    while ((masm.GetCursorAddress<uintptr_t>() & kPageOffsetMask) != 0) {
182690b0414b6c794be58f34813f84c2c06e6a15be91armvixl      __ b(&start);
182790b0414b6c794be58f34813f84c2c06e6a15be91armvixl    }
182890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
182990b0414b6c794be58f34813f84c2c06e6a15be91armvixl    // The first page.
183090b0414b6c794be58f34813f84c2c06e6a15be91armvixl    VIXL_STATIC_ASSERT(kStartPage < 0);
183139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    {
183239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl      InstructionAccurateScope scope_page(&masm, kPageSize / kInstructionSize);
183390b0414b6c794be58f34813f84c2c06e6a15be91armvixl      __ bind(&start);
183490b0414b6c794be58f34813f84c2c06e6a15be91armvixl      __ adrp(x0, &test);
183590b0414b6c794be58f34813f84c2c06e6a15be91armvixl      __ adrp(x1, &test);
183690b0414b6c794be58f34813f84c2c06e6a15be91armvixl      for (size_t i = 2; i < (kPageSize / kInstructionSize); i += 2) {
183790b0414b6c794be58f34813f84c2c06e6a15be91armvixl        __ ccmp(x0, x1, NoFlag, eq);
183890b0414b6c794be58f34813f84c2c06e6a15be91armvixl        __ adrp(x1, &test);
183990b0414b6c794be58f34813f84c2c06e6a15be91armvixl      }
184090b0414b6c794be58f34813f84c2c06e6a15be91armvixl    }
184190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
184290b0414b6c794be58f34813f84c2c06e6a15be91armvixl    // Subsequent pages.
184390b0414b6c794be58f34813f84c2c06e6a15be91armvixl    VIXL_STATIC_ASSERT(kEndPage >= 0);
184490b0414b6c794be58f34813f84c2c06e6a15be91armvixl    for (int page = (kStartPage + 1); page <= kEndPage; page++) {
184590b0414b6c794be58f34813f84c2c06e6a15be91armvixl      InstructionAccurateScope scope_page(&masm, kPageSize / kInstructionSize);
184690b0414b6c794be58f34813f84c2c06e6a15be91armvixl      if (page == 0) {
184790b0414b6c794be58f34813f84c2c06e6a15be91armvixl        for (size_t i = 0; i < (kPageSize / kInstructionSize);) {
184890b0414b6c794be58f34813f84c2c06e6a15be91armvixl          if (i++ == (offset_into_page / kInstructionSize)) __ bind(&test);
184990b0414b6c794be58f34813f84c2c06e6a15be91armvixl          __ ccmp(x0, x1, NoFlag, eq);
185090b0414b6c794be58f34813f84c2c06e6a15be91armvixl          if (i++ == (offset_into_page / kInstructionSize)) __ bind(&test);
185190b0414b6c794be58f34813f84c2c06e6a15be91armvixl          __ adrp(x1, &test);
185290b0414b6c794be58f34813f84c2c06e6a15be91armvixl        }
185390b0414b6c794be58f34813f84c2c06e6a15be91armvixl      } else {
185490b0414b6c794be58f34813f84c2c06e6a15be91armvixl        for (size_t i = 0; i < (kPageSize / kInstructionSize); i += 2) {
185590b0414b6c794be58f34813f84c2c06e6a15be91armvixl          __ ccmp(x0, x1, NoFlag, eq);
185690b0414b6c794be58f34813f84c2c06e6a15be91armvixl          __ adrp(x1, &test);
185790b0414b6c794be58f34813f84c2c06e6a15be91armvixl        }
185890b0414b6c794be58f34813f84c2c06e6a15be91armvixl      }
185990b0414b6c794be58f34813f84c2c06e6a15be91armvixl    }
186090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  }
186190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
186239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  // Every adrp instruction pointed to the same label (`test`), so they should
186339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  // all have produced the same result.
186439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
186590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  END();
186690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  RUN();
186790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
186890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  uintptr_t expected =
186990b0414b6c794be58f34813f84c2c06e6a15be91armvixl      AlignDown(masm.GetLabelAddress<uintptr_t>(&test), kPageSize);
187090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x0);
187190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x1);
187290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_NZCV(ZCFlag);
187390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
187439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN_CUSTOM();
187590b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
187690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
187790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
187890b0414b6c794be58f34813f84c2c06e6a15be91armvixl// Test that labels are correctly referenced by adrp across page boundaries.
187990b0414b6c794be58f34813f84c2c06e6a15be91armvixlTEST(adrp_page_boundaries) {
188090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  VIXL_STATIC_ASSERT(kPageSize == 4096);
188190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpPageBoundaryHelper(kInstructionSize * 0);
188290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpPageBoundaryHelper(kInstructionSize * 1);
188390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpPageBoundaryHelper(kInstructionSize * 512);
188490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpPageBoundaryHelper(kInstructionSize * 1022);
188590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpPageBoundaryHelper(kInstructionSize * 1023);
188690b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
188790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
188890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
18895ee436a3a51863de7b5dc9326cf02895248050c2armvixlstatic void AdrpOffsetHelper(int64_t offset) {
189090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  const size_t kPageOffsetMask = kPageSize - 1;
189139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  const int kMaxCodeSize = 2 * kPageSize;
189290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
189339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP_CUSTOM(kMaxCodeSize, PageOffsetDependentCode);
189490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  START();
189590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
189690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  Label page;
189739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
189839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  {
189939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    InstructionAccurateScope scope(&masm,
190039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl                                   kMaxCodeSize / kInstructionSize,
190139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl                                   InstructionAccurateScope::kMaximumSize);
190239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    // Initialize NZCV with `eq` flags.
190339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    __ cmp(wzr, wzr);
190490b0414b6c794be58f34813f84c2c06e6a15be91armvixl    // Waste space until the start of a page.
190539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    while ((masm.GetCursorAddress<uintptr_t>() & kPageOffsetMask) != 0) {
190690b0414b6c794be58f34813f84c2c06e6a15be91armvixl      __ b(&page);
190790b0414b6c794be58f34813f84c2c06e6a15be91armvixl    }
190890b0414b6c794be58f34813f84c2c06e6a15be91armvixl    __ bind(&page);
190990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
191039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl    {
19115ee436a3a51863de7b5dc9326cf02895248050c2armvixl      int imm21 = static_cast<int>(offset);
191239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl      InstructionAccurateScope scope_page(&masm, kPageSize / kInstructionSize);
191390b0414b6c794be58f34813f84c2c06e6a15be91armvixl      // Every adrp instruction on this page should return the same value.
191490b0414b6c794be58f34813f84c2c06e6a15be91armvixl      __ adrp(x0, imm21);
191590b0414b6c794be58f34813f84c2c06e6a15be91armvixl      __ adrp(x1, imm21);
191690b0414b6c794be58f34813f84c2c06e6a15be91armvixl      for (size_t i = 2; i < kPageSize / kInstructionSize; i += 2) {
191790b0414b6c794be58f34813f84c2c06e6a15be91armvixl        __ ccmp(x0, x1, NoFlag, eq);
191890b0414b6c794be58f34813f84c2c06e6a15be91armvixl        __ adrp(x1, imm21);
191990b0414b6c794be58f34813f84c2c06e6a15be91armvixl      }
192090b0414b6c794be58f34813f84c2c06e6a15be91armvixl    }
192190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  }
192290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
192390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  END();
192490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  RUN();
192590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
192690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  uintptr_t expected =
19275ee436a3a51863de7b5dc9326cf02895248050c2armvixl      masm.GetLabelAddress<uintptr_t>(&page) + (kPageSize * offset);
192890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x0);
192990b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_64(expected, x1);
193090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  ASSERT_EQUAL_NZCV(ZCFlag);
193190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
193239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN_CUSTOM();
193390b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
193490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
193590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
193690b0414b6c794be58f34813f84c2c06e6a15be91armvixl// Check that adrp produces the correct result for a specific offset.
193790b0414b6c794be58f34813f84c2c06e6a15be91armvixlTEST(adrp_offset) {
193890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpOffsetHelper(0);
193990b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpOffsetHelper(1);
194090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpOffsetHelper(-1);
194190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpOffsetHelper(4);
194290b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpOffsetHelper(-4);
194390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpOffsetHelper(0x000fffff);
194490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpOffsetHelper(-0x000fffff);
194590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  AdrpOffsetHelper(-0x00100000);
194690b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
194790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
194890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
1949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(branch_cond) {
1950ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
195139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  ALLOW_ASM();
1952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label done, wrong;
1954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
1956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x1);
1957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0x1);
19581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x2, 0x8000000000000000);
1959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // For each 'cmp' instruction below, condition codes other than the ones
1961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // following it would branch.
1962ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1963578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 0);
1964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
1965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
1966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
1967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ls);
1969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lt);
1970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, le);
1971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_1;
1972ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_1, ne);
1973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1974ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_1);
1975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1976578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 1);
1977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ne);
1978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
1979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
1980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hi);
1982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lt);
1983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
1984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_2;
1985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_2, pl);
1986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
1987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_2);
1988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
1989578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x1, 2);
1990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
1991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hs);
1992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, pl);
1993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vs);
1994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, hi);
1995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ge);
1996ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
1997ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_3;
1998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_3, vc);
1999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
2000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_3);
2001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2002578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Cmp(x2, 1);
2003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, eq);
2004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, lo);
2005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, mi);
2006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, vc);
2007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ls);
2008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, ge);
2009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&wrong, gt);
2010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label ok_4;
2011ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&ok_4, le);
2012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
2013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&ok_4);
2014578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
201539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  // The MacroAssembler does not allow al as a branch condition.
2016578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Label ok_5;
2017578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ b(&ok_5, al);
2018578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x0, 0x0);
2019578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bind(&ok_5);
2020578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
202139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  // The MacroAssembler does not allow nv as a branch condition.
2022578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Label ok_6;
2023578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ b(&ok_6, nv);
2024578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Mov(x0, 0x0);
2025578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  __ Bind(&ok_6);
2026578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
20270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&done);
2028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&wrong);
2030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0x0);
20310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
20320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
2033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2035ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1, x0);
2038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(branch_to_reg) {
2044ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test br.
2047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label fn1, after_fn1;
2048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2049ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, lr);
2051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
2053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&after_fn1);
2054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&fn1);
2056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, lr);
2057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 42);
2058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Br(x0);
2059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&after_fn1);
2061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&fn1);
2062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2063ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Test blr.
2064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label fn2, after_fn2;
2065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
2067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&after_fn2);
2068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&fn2);
2070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, lr);
2071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 84);
2072ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Blr(x0);
2073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2074ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&after_fn2);
2075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bl(&fn2);
2076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, lr);
2077ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(lr, x29);
2079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2081ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2082ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(core.xreg(3) + kInstructionSize, x0);
2084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(42, x1);
2085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(84, x2);
2086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2090ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2091ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(compare_branch) {
2092ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2093ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2095ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
2096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
2097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
2098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0);
2099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 0);
2100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 0);
2101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, 0);
2102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, 42);
2103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label zt, zt_end;
2105ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(w16, &zt);
2106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&zt_end);
2107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zt);
2108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
2109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zt_end);
2110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label zf, zf_end;
2112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(x17, &zf);
2113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&zf_end);
2114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zf);
2115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
2116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&zf_end);
2117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nzt, nzt_end;
2119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(w17, &nzt);
2120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nzt_end);
2121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzt);
2122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 1);
2123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzt_end);
2124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nzf, nzf_end;
2126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(x16, &nzf);
2127ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nzf_end);
2128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzf);
2129ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 1);
2130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nzf_end);
2131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
21321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x18, 0xffffffff00000000);
2133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label a, a_end;
2135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbz(w18, &a);
2136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&a_end);
2137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&a);
2138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x4, 1);
2139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&a_end);
2140ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label b, b_end;
2142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Cbnz(w18, &b);
2143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&b_end);
2144ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&b);
2145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x5, 1);
2146ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&b_end);
2147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2151ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
2153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
2154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
2155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
2156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x4);
2157ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x5);
2158ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(test_branch) {
2164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2166ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 0);
2168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 0);
2169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 0);
2170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 0);
21711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x16, 0xaaaaaaaaaaaaaaaa);
2172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label bz, bz_end;
2174f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Tbz(w16, 0, &bz);
2175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&bz_end);
2176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bz);
2177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x0, 1);
2178ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bz_end);
2179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label bo, bo_end;
2181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Tbz(x16, 63, &bo);
2182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&bo_end);
2183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bo);
2184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x1, 1);
2185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&bo_end);
2186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nbz, nbz_end;
2188ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Tbnz(x16, 61, &nbz);
2189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nbz_end);
2190ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbz);
2191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x2, 1);
2192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbz_end);
2193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  Label nbo, nbo_end;
2195f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  __ Tbnz(w16, 2, &nbo);
2196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ B(&nbo_end);
2197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbo);
2198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x3, 1);
2199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Bind(&nbo_end);
2200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
2205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x1);
2206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x2);
2207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0, x3);
2208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
22131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixlTEST(branch_type) {
22141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
22151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  Label fail, done;
22171123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
22191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x0);
22201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x10, 0x7);
22211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x11, 0x0);
22221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Test non taken branches.
22241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Cmp(x10, 0x7);
22251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, ne);
22261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, never);
22271123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, reg_zero, x10);
22281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, reg_not_zero, x11);
22291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, reg_bit_clear, x10, 0);
22301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail, reg_bit_set, x10, 3);
22311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22321123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  // Test taken branches.
22331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  Label l1, l2, l3, l4, l5;
22341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Cmp(x10, 0x7);
22351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l1, eq);
22361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
22371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l1);
22381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l2, always);
22391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
22401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l2);
22411123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l3, reg_not_zero, x10);
22421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
22431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l3);
22441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l4, reg_bit_clear, x10, 15);
22451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
22461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l4);
22471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&l5, reg_bit_set, x10, 1);
22481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&fail);
22491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&l5);
22501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ B(&done);
22521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&fail);
22541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x0, 0x1);
22551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Bind(&done);
22571123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
22591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
22611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0, x0);
22631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
22651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
22661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
22671123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
2268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_offset) {
2269ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
22711123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[2] = {0xfedcba9876543210, 0x0123456789abcdef};
2272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
2273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2277ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17));
2280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18));
2281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w1, MemOperand(x17, 4));
2282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w1, MemOperand(x18, 12));
2283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x2, MemOperand(x17, 8));
2284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x2, MemOperand(x18, 16));
2285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x17, 1));
2286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x18, 25));
2287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x17, 2));
2288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x18, 33));
2289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2293ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, x0);
2294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x76543210, dst[0]);
2295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x1);
22961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfedcba9800000000, dst[1]);
22971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x2);
22981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[2]);
2299ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
2300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
2301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x7654, x4);
2302ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x765400, dst[4]);
2303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2304ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x18);
2305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_wide) {
2311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[8192];
2314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t dst[8192];
2315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  memset(src, 0xaa, 8192 * sizeof(src[0]));
2318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  memset(dst, 0xaa, 8192 * sizeof(dst[0]));
2319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[0] = 0;
2320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[6144] = 6144;
2321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  src[8191] = 8191;
2322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, src_base);
2325ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, dst_base);
2326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, src_base);
2327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, dst_base);
2328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, src_base);
2329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, dst_base);
2330ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x22, 8191 * sizeof(src[0])));
2332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x23, 8191 * sizeof(dst[0])));
2333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w1, MemOperand(x24, 4096 * sizeof(src[0]), PostIndex));
2334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w1, MemOperand(x25, 4096 * sizeof(dst[0]), PostIndex));
2335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x26, 6144 * sizeof(src[0]), PreIndex));
2336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x27, 6144 * sizeof(dst[0]), PreIndex));
2337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2341ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(8191, w0);
2342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(8191, dst[8191]);
2343ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x22);
2344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x23);
2345ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0, w1);
2346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(0, dst[0]);
2347ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4096 * sizeof(src[0]), x24);
2348ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 4096 * sizeof(dst[0]), x25);
2349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(6144, w2);
2350ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(6144, dst[6144]);
2351ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 6144 * sizeof(src[0]), x26);
2352ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 6144 * sizeof(dst[0]), x27);
2353ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2354ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_preindex) {
2359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2360ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
23611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[2] = {0xfedcba9876543210, 0x0123456789abcdef};
2362ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
2363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2367ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
2370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
2371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base + 16);
2372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base + 40);
2373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, src_base);
2374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, dst_base);
2375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, src_base);
2376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, dst_base);
2377ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17, 4, PreIndex));
2378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18, 12, PreIndex));
2379ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x19, 8, PreIndex));
2380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x20, 16, PreIndex));
2381ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x21, -4, PreIndex));
2382ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x22, -4, PreIndex));
2383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x23, 1, PreIndex));
2384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x24, 25, PreIndex));
2385ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x25, 3, PreIndex));
2386ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x26, 41, PreIndex));
2387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x0);
23921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfedcba9800000000, dst[1]);
23931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x1);
23941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[2]);
2395ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x01234567, x2);
23961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456700000000, dst[4]);
2397ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
2398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
2399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x9876, x4);
2400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x987600, dst[5]);
2401ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 4, x17);
2402ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 12, x18);
2403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x19);
2404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 16, x20);
2405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 12, x21);
2406ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 36, x22);
2407ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 1, x23);
2408ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 25, x24);
2409ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 3, x25);
2410ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 41, x26);
2411ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_postindex) {
2417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
24191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t src[2] = {0xfedcba9876543210, 0x0123456789abcdef};
2420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
2421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2423ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2424ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base + 4);
2426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base + 12);
2427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base + 8);
2428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base + 16);
2429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base + 8);
2430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base + 32);
2431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x23, src_base + 1);
2432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, dst_base + 25);
2433ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, src_base + 3);
2434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, dst_base + 41);
2435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x17, 4, PostIndex));
2436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x18, 12, PostIndex));
2437ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x19, 8, PostIndex));
2438ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x20, 16, PostIndex));
2439ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x2, MemOperand(x21, -8, PostIndex));
2440ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x2, MemOperand(x22, -32, PostIndex));
2441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrb(w3, MemOperand(x23, 1, PostIndex));
2442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strb(w3, MemOperand(x24, 5, PostIndex));
2443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrh(w4, MemOperand(x25, -3, PostIndex));
2444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Strh(w4, MemOperand(x26, -41, PostIndex));
2445ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2446ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2448ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xfedcba98, x0);
24501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xfedcba9800000000, dst[1]);
24511123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x1);
24521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[2]);
24531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x2);
24541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[4]);
2455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x32, x3);
2456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x3200, dst[3]);
2457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x9876, x4);
2458ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x987600, dst[5]);
2459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 8, x17);
2460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 24, x18);
2461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 16, x19);
2462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 32, x20);
2463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x21);
2464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2465ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2, x23);
2466ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 30, x24);
2467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x25);
2468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x26);
2469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2472ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2473ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(ldr_str_largeindex) {
2475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2476ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2477ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This value won't fit in the immediate offset field of ldr/str instructions.
2478ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int largeoffset = 0xabcdef;
2479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  int64_t data[3] = { 0x1122334455667788, 0, 0 };
24811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t base_addr = reinterpret_cast<uintptr_t>(data);
24821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  uint64_t drifted_addr = base_addr - largeoffset;
2483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // This test checks that we we can use large immediate offsets when
2485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // using PreIndex or PostIndex addressing mode of the MacroAssembler
2486ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  // Ldr/Str instructions.
2487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
24891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x19, drifted_addr);
24901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ldr(x0, MemOperand(x19, largeoffset, PreIndex));
2491ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
24921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x20, base_addr);
24931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Ldr(x1, MemOperand(x20, largeoffset, PostIndex));
2494ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
24951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x21, drifted_addr);
24961123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Str(x0, MemOperand(x21, largeoffset + 8, PreIndex));
2497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
24981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Mov(x22, base_addr + 16);
24991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  __ Str(x0, MemOperand(x22, largeoffset, PostIndex));
2500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[0]);
2505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[1]);
2506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, data[2]);
2507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, x0);
2508ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x1122334455667788, x1);
2509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
25101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(base_addr, x19);
25111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(base_addr + largeoffset, x20);
25121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(base_addr + 8, x21);
25131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(base_addr + 16 + largeoffset, x22);
2514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_signed) {
2520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[2] = {0x80008080, 0x7fff7f7f};
2523ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2524ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, src_base);
2527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(w0, MemOperand(x24));
2528ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(w1, MemOperand(x24, 4));
2529ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(w2, MemOperand(x24));
2530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(w3, MemOperand(x24, 4));
2531ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(x4, MemOperand(x24));
2532ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsb(x5, MemOperand(x24, 4));
2533ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(x6, MemOperand(x24));
2534ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsh(x7, MemOperand(x24, 4));
2535ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsw(x8, MemOperand(x24));
2536ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldrsw(x9, MemOperand(x24, 4));
2537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffffff80, x0);
2542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x0000007f, x1);
2543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0xffff8080, x2);
2544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(0x00007f7f, x3);
25451123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffffff80, x4);
25461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000000000007f, x5);
25471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffffffff8080, x6);
25481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000000007f7f, x7);
25491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0xffffffff80008080, x8);
25501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x000000007fff7f7f, x9);
2551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2555ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_regoffset) {
2557ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2558ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2559ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t src[3] = {1, 2, 3};
2560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uint32_t dst[4] = {0, 0, 0, 0};
2561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2562ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x16, src_base);
2566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, dst_base);
2567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, src_base + 3 * sizeof(src[0]));
2568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, dst_base + 3 * sizeof(dst[0]));
2569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base + 4 * sizeof(dst[0]));
2570ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x24, 0);
2571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x25, 4);
2572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x26, -4);
2573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x27, 0xfffffffc);  // 32-bit -4.
2574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x28, 0xfffffffe);  // 32-bit -2.
2575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x29, 0xffffffff);  // 32-bit -1.
2576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w0, MemOperand(x16, x24));
2578ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(x1, MemOperand(x16, x25));
2579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w2, MemOperand(x18, x26));
2580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w3, MemOperand(x18, x27, SXTW));
2581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(w4, MemOperand(x18, x28, SXTW, 2));
2582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w0, MemOperand(x17, x24));
2583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(x1, MemOperand(x17, x25));
2584ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(w2, MemOperand(x20, x29, SXTW, 2));
2585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(1, x0);
25901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  ASSERT_EQUAL_64(0x0000000300000002, x1);
2591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x2);
2592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(3, x3);
2593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(2, x4);
2594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(1, dst[0]);
2595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(2, dst[1]);
2596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(3, dst[2]);
2597ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_32(3, dst[3]);
2598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2599ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_float) {
2604ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float src[3] = {1.0, 2.0, 3.0};
2607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  float dst[3] = {0.0, 0.0, 0.0};
2608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2611ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
2615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
2616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base);
2617ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base);
2618ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s0, MemOperand(x17, sizeof(src[0])));
2619ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s0, MemOperand(x18, sizeof(dst[0]), PostIndex));
2620ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s1, MemOperand(x19, sizeof(src[0]), PostIndex));
2621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
2622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(s2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
2623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(s2, MemOperand(x22, sizeof(dst[0])));
2624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, s0);
2629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(2.0, dst[0]);
2630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
2631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(1.0, dst[2]);
2632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(3.0, s2);
2633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP32(3.0, dst[1]);
2634ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[0]), x18);
2636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + sizeof(src[0]), x19);
2637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
2638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
2639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixlTEST(load_store_double) {
2646ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2647ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double src[3] = {1.0, 2.0, 3.0};
2649ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  double dst[3] = {0.0, 0.0, 0.0};
2650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
2654ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
2655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x18, dst_base);
2656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x19, src_base);
2657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x20, dst_base);
2658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x21, src_base);
2659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x22, dst_base);
2660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d0, MemOperand(x17, sizeof(src[0])));
2661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d0, MemOperand(x18, sizeof(dst[0]), PostIndex));
2662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d1, MemOperand(x19, sizeof(src[0]), PostIndex));
2663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
2664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Ldr(d2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
2665ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Str(d2, MemOperand(x22, sizeof(dst[0])));
2666ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2667ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, d0);
2671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(2.0, dst[0]);
2672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, d1);
2673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(1.0, dst[2]);
2674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(3.0, d2);
2675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_FP64(3.0, dst[1]);
2676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base, x17);
2677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[0]), x18);
2678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + sizeof(src[0]), x19);
2679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
2680ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
2681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2684ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2685ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
26870cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_b) {
2688ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2689ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
26900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[3] = {0x12, 0x23, 0x34};
26910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t dst[3] = {0, 0, 0};
2692ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
26960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
26970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base);
26980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
26990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, dst_base);
27000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base);
27010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, dst_base);
27020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(b0, MemOperand(x17, sizeof(src[0])));
27030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(b0, MemOperand(x18, sizeof(dst[0]), PostIndex));
27040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(b1, MemOperand(x19, sizeof(src[0]), PostIndex));
27050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(b1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
27060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(b2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
27070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(b2, MemOperand(x22, sizeof(dst[0])));
2708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2709ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2710ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2711ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x23, q0);
27130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x23, dst[0]);
27140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x12, q1);
27150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x12, dst[2]);
27160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x34, q2);
27170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x34, dst[1]);
27180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x17);
27190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[0]), x18);
27200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + sizeof(src[0]), x19);
27210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
27220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
27230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27290cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_h) {
2730ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2731ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint16_t src[3] = {0x1234, 0x2345, 0x3456};
27330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint16_t dst[3] = {0, 0, 0};
2734ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2735ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2736ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2737ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
27380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
27390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base);
27400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
27410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, dst_base);
27420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base);
27430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, dst_base);
27440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(h0, MemOperand(x17, sizeof(src[0])));
27450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(h0, MemOperand(x18, sizeof(dst[0]), PostIndex));
27460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(h1, MemOperand(x19, sizeof(src[0]), PostIndex));
27470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(h1, MemOperand(x20, 2 * sizeof(dst[0]), PreIndex));
27480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(h2, MemOperand(x21, 2 * sizeof(src[0]), PreIndex));
27490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(h2, MemOperand(x22, sizeof(dst[0])));
2750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2345, q0);
27550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x2345, dst[0]);
27560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1234, q1);
27570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234, dst[2]);
27580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3456, q2);
27590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3456, dst[1]);
27600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x17);
27610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[0]), x18);
27620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + sizeof(src[0]), x19);
27630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[0]), x20);
27640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x21);
27650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2770ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27710cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_q) {
2772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
27740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[48] = {0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe,
27750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
27760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0x21, 0x43, 0x65, 0x87, 0xa9, 0xcb, 0xed, 0x0f,
27770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
27780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0x24, 0x46, 0x68, 0x8a, 0xac, 0xce, 0xe0, 0x02,
27790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0x42, 0x64, 0x86, 0xa8, 0xca, 0xec, 0x0e, 0x20};
27800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
27810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
2782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
2784ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2785ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
27860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
27870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base);
27880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
27890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, dst_base);
27900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base);
27910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, dst_base);
27920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16));
27930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(q0, MemOperand(x18, 16, PostIndex));
27940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
27950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(q1, MemOperand(x20, 32, PreIndex));
27960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x21, 32, PreIndex));
27970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(q2, MemOperand(x22, 16));
2798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
28020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xf0debc9a78563412, 0x0fedcba987654321, q0);
28030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0fedcba987654321, dst[0]);
28040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xf0debc9a78563412, dst[1]);
28050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xefcdab8967452301, 0xfedcba9876543210, q1);
28060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba9876543210, dst[4]);
28070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xefcdab8967452301, dst[5]);
28080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x200eeccaa8866442, 0x02e0ceac8a684624, q2);
28090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x02e0ceac8a684624, dst[2]);
28100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x200eeccaa8866442, dst[3]);
28110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x17);
28120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 16, x18);
28130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 16, x19);
28140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 32, x20);
28150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 32, x21);
28160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x22);
2817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2820ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
28220cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_v_regoffset) {
282339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
282439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
28250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
28260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
28270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
28280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
28290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t dst[64];
28300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  memset(dst, 0, sizeof(dst));
28310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
283239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
283339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
283439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
283539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
28360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 16);
28370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
28380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w19, -1);
28390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, dst_base - 1);
28400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
28410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(b0, MemOperand(x17, x18));
28420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(b1, MemOperand(x17, x19, SXTW));
28430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
28440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(h2, MemOperand(x17, x18));
28450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(h3, MemOperand(x17, x18, UXTW, 1));
28460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(h4, MemOperand(x17, x19, SXTW, 1));
28470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(h5, MemOperand(x17, x18, LSL, 1));
28480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
28490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(s16, MemOperand(x17, x18));
28500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(s17, MemOperand(x17, x18, UXTW, 2));
28510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(s18, MemOperand(x17, x19, SXTW, 2));
28520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(s19, MemOperand(x17, x18, LSL, 2));
28530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
28540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d20, MemOperand(x17, x18));
28550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d21, MemOperand(x17, x18, UXTW, 3));
28560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d22, MemOperand(x17, x19, SXTW, 3));
28570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d23, MemOperand(x17, x18, LSL, 3));
28580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
28590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x17, x18));
28600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q25, MemOperand(x17, x18, UXTW, 4));
28610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q26, MemOperand(x17, x19, SXTW, 4));
28620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q27, MemOperand(x17, x18, LSL, 4));
28630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
28640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Store [bhsdq]27 to adjacent memory locations, then load again to check.
28650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(b27, MemOperand(x20, x18));
28660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(h27, MemOperand(x20, x18, UXTW, 1));
28670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x20, x20, 8);
28680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(s27, MemOperand(x20, x19, SXTW, 2));
28690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x20, x20, 8);
28700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(d27, MemOperand(x20, x18, LSL, 3));
28710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x20, x20, 32);
28720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(q27, MemOperand(x20, x19, SXTW, 4));
28730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
28740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x20, x20, 32);
28750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x20, x18));
28760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q7, MemOperand(x20, x18, LSL, 4));
28770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
287839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  END();
287939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
288039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  RUN();
288139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
28820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x11, q0);
28830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f, q1);
28840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1211, q2);
28850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1312, q3);
28860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0e, q4);
28870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1312, q5);
28880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x14131211, q16);
28890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x17161514, q17);
28900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0e0d0c, q18);
28910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x17161514, q19);
28920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1817161514131211, q20);
28930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1e1d1c1b1a1918, q21);
28940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0e0d0c0b0a0908, q22);
28950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1e1d1c1b1a1918, q23);
28960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x201f1e1d1c1b1a19, 0x1817161514131211, q24);
28970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q25);
28980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q26);
28990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q27);
29000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2027262524232221, 0x2023222120212020, q6);
29010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q7);
290239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
290339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
290439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
290539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
290639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
29070cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld1_d) {
2908ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
29100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[32 + 5];
29110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
29120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
29130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
29170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
29180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17));  // Initialise top 64-bits of Q register.
29190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v2.V8B(), MemOperand(x17));
29200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
29210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v3.V8B(), v4.V8B(), MemOperand(x17));
29220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
29230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v5.V4H(), v6.V4H(), v7.V4H(), MemOperand(x17));
29240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
29250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(), MemOperand(x17));
29260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
29270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17));
29280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
29290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v20.V1D(), v21.V1D(), v22.V1D(), v23.V1D(), MemOperand(x17));
2930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2931ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
29340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0706050403020100, q2);
29350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0807060504030201, q3);
29360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x100f0e0d0c0b0a09, q4);
29370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0908070605040302, q5);
29380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x11100f0e0d0c0b0a, q6);
29390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1918171615141312, q7);
29400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0a09080706050403, q16);
29410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1211100f0e0d0c0b, q17);
29420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1a19181716151413, q18);
29430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2221201f1e1d1c1b, q19);
29440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0b0a090807060504, q30);
29450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x131211100f0e0d0c, q31);
29460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1b1a191817161514, q0);
29470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x232221201f1e1d1c, q1);
29480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0c0b0a0908070605, q20);
29490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x14131211100f0e0d, q21);
29500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1c1b1a1918171615, q22);
29510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x24232221201f1e1d, q23);
2952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
2954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
2955ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2956ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
29570cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld1_d_postindex) {
2958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
2959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
29600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[32 + 5];
29610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
29620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
29630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
2965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
29670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
29680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 1);
29690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 2);
29700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 3);
29710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base + 4);
29720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, src_base + 5);
29730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, 1);
29740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17));  // Initialise top 64-bits of Q register.
29750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v2.V8B(), MemOperand(x17, x23, PostIndex));
29760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v3.V8B(), v4.V8B(), MemOperand(x18, 16, PostIndex));
29770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v5.V4H(), v6.V4H(), v7.V4H(), MemOperand(x19, 24, PostIndex));
29780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(),
29790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x20, 32, PostIndex));
29800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(),
29810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x21, 32, PostIndex));
29820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v20.V1D(), v21.V1D(), v22.V1D(), v23.V1D(),
29830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x22, 32, PostIndex));
2984ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
2985ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
2986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
2987ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
29880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0706050403020100, q2);
29890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0807060504030201, q3);
29900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x100f0e0d0c0b0a09, q4);
29910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0908070605040302, q5);
29920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x11100f0e0d0c0b0a, q6);
29930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1918171615141312, q7);
29940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0a09080706050403, q16);
29950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1211100f0e0d0c0b, q17);
29960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1a19181716151413, q18);
29970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2221201f1e1d1c1b, q19);
29980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0b0a090807060504, q30);
29990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x131211100f0e0d0c, q31);
30000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1b1a191817161514, q0);
30010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x232221201f1e1d1c, q1);
30020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0c0b0a0908070605, q20);
30030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x14131211100f0e0d, q21);
30040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1c1b1a1918171615, q22);
30050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x24232221201f1e1d, q23);
30060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x17);
30070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1 + 16, x18);
30080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 + 24, x19);
30090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3 + 32, x20);
30100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 + 32, x21);
30110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 5 + 32, x22);
3012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3013ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3014ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3015ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
30170cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld1_q) {
301839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
301939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
30200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
30210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
30220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
30230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
302439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
302539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
302639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
30270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
30280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v2.V16B(), MemOperand(x17));
30290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
30300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v3.V16B(), v4.V16B(), MemOperand(x17));
30310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
30320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v5.V8H(), v6.V8H(), v7.V8H(), MemOperand(x17));
30330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
30340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v16.V4S(), v17.V4S(), v18.V4S(), v19.V4S(), MemOperand(x17));
30350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
30360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x17));
303739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  END();
303839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
303939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  RUN();
304039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
30410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q2);
30420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x100f0e0d0c0b0a09, 0x0807060504030201, q3);
30430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x201f1e1d1c1b1a19, 0x1817161514131211, q4);
30440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x11100f0e0d0c0b0a, 0x0908070605040302, q5);
30450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x21201f1e1d1c1b1a, 0x1918171615141312, q6);
30460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x31302f2e2d2c2b2a, 0x2928272625242322, q7);
30470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1211100f0e0d0c0b, 0x0a09080706050403, q16);
30480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2221201f1e1d1c1b, 0x1a19181716151413, q17);
30490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3231302f2e2d2c2b, 0x2a29282726252423, q18);
30500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4241403f3e3d3c3b, 0x3a39383736353433, q19);
30510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x131211100f0e0d0c, 0x0b0a090807060504, q30);
30520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x232221201f1e1d1c, 0x1b1a191817161514, q31);
30530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x333231302f2e2d2c, 0x2b2a292827262524, q0);
30540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x434241403f3e3d3c, 0x3b3a393837363534, q1);
305539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
305639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
305739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
305839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
305939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
30600cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld1_q_postindex) {
3061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3062ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
30630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
30640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
30650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
30660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
3067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
3068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
30700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
30710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 1);
30720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 2);
30730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 3);
30740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base + 4);
30750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 1);
30760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v2.V16B(), MemOperand(x17, x22, PostIndex));
30770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v3.V16B(), v4.V16B(), MemOperand(x18, 32, PostIndex));
30780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v5.V8H(), v6.V8H(), v7.V8H(), MemOperand(x19, 48, PostIndex));
30790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v16.V4S(), v17.V4S(), v18.V4S(), v19.V4S(),
30800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x20, 64, PostIndex));
30810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(),
30820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x21, 64, PostIndex));
3083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3084ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
30870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q2);
30880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x100f0e0d0c0b0a09, 0x0807060504030201, q3);
30890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x201f1e1d1c1b1a19, 0x1817161514131211, q4);
30900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x11100f0e0d0c0b0a, 0x0908070605040302, q5);
30910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x21201f1e1d1c1b1a, 0x1918171615141312, q6);
30920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x31302f2e2d2c2b2a, 0x2928272625242322, q7);
30930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1211100f0e0d0c0b, 0x0a09080706050403, q16);
30940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2221201f1e1d1c1b, 0x1a19181716151413, q17);
30950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3231302f2e2d2c2b, 0x2a29282726252423, q18);
30960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4241403f3e3d3c3b, 0x3a39383736353433, q19);
30970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x131211100f0e0d0c, 0x0b0a090807060504, q30);
30980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x232221201f1e1d1c, 0x1b1a191817161514, q31);
30990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x333231302f2e2d2c, 0x2b2a292827262524, q0);
31000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x434241403f3e3d3c, 0x3b3a393837363534, q1);
31010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x17);
31020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1 + 32, x18);
31030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 + 48, x19);
31040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3 + 64, x20);
31050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 + 64, x21);
3106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3107ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3108ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
31110cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld1_lane) {
311239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
311339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
31140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
31150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
31160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
31170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
311839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
311939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
312039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
31210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
31220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading whole register by element.
31230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
31240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
31250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld1(v0.B(), i, MemOperand(x17));
31260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
31270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
31280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
31290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
31300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
31310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld1(v1.H(), i, MemOperand(x17));
31320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
31330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
31340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
31350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
31360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
31370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld1(v2.S(), i, MemOperand(x17));
31380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
31390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
31400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
31410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
31420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
31430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld1(v3.D(), i, MemOperand(x17));
31440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
31450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
31460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
31470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading a single element into an initialised register.
31480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
31490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x17));
31500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v4.B(), 4, MemOperand(x17));
31510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x17));
31520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v5.H(), 3, MemOperand(x17));
31530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x17));
31540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v6.S(), 2, MemOperand(x17));
31550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q7, MemOperand(x17));
31560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v7.D(), 1, MemOperand(x17));
31570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
315839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  END();
315939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
316039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  RUN();
316139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
31620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
31630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100020103020403, 0x0504060507060807, q1);
31640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010004030201, 0x0504030206050403, q2);
31650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0807060504030201, q3);
31660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q4);
31670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q5);
31680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q6);
31690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0706050403020100, q7);
317039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
317139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
317239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
317339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
31740cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld2_d) {
3175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3176ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
31770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
31780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
31790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
31800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
3181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
3182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3183ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
31840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
31850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v2.V8B(), v3.V8B(), MemOperand(x17));
31860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
31870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v4.V8B(), v5.V8B(), MemOperand(x17));
31880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
31890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v6.V4H(), v7.V4H(), MemOperand(x17));
31900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
31910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v31.V2S(), v0.V2S(), MemOperand(x17));
3192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3193ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3195ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
31960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0e0c0a0806040200, q2);
31970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0d0b0907050301, q3);
31980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0d0b0907050301, q4);
31990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x100e0c0a08060402, q5);
32000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0e0b0a07060302, q6);
32010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x11100d0c09080504, q7);
32020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0e0d0c0b06050403, q31);
32030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1211100f0a090807, q0);
3204ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3205ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32080cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld2_d_postindex) {
3209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3210ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[32 + 4];
32120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
32130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
32140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
3215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
3216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
3218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  __ Mov(x17, src_base);
32190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 1);
32200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 2);
32210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 3);
32220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base + 4);
32230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 1);
32240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v2.V8B(), v3.V8B(), MemOperand(x17, x22, PostIndex));
32250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v4.V8B(), v5.V8B(), MemOperand(x18, 16, PostIndex));
32260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v5.V4H(), v6.V4H(), MemOperand(x19, 16, PostIndex));
32270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v16.V2S(), v17.V2S(), MemOperand(x20, 16, PostIndex));
32280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v31.V2S(), v0.V2S(), MemOperand(x21, 16, PostIndex));
3229ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3231ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3232ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0e0c0a0806040200, q2);
32340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0d0b0907050301, q3);
32350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0d0b0907050301, q4);
32360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0e0b0a07060302, q5);
32370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x11100d0c09080504, q6);
32380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0e0d0c0b06050403, q16);
32390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1211100f0a090807, q17);
32400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0f0e0d0c07060504, q31);
32410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x131211100b0a0908, q0);
32420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
32430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x17);
32440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1 + 16, x18);
32450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 + 16, x19);
32460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3 + 16, x20);
32470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 + 16, x21);
3248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3251ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32530cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld2_q) {
3254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
3255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
32570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
32580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
32590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
32600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
32610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
3262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
32630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
32640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v2.V16B(), v3.V16B(), MemOperand(x17));
32650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
32660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v4.V16B(), v5.V16B(), MemOperand(x17));
32670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
32680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v6.V8H(), v7.V8H(), MemOperand(x17));
32690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
32700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v16.V4S(), v17.V4S(), MemOperand(x17));
32710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
32720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v31.V2D(), v0.V2D(), MemOperand(x17));
3273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
3274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3275ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
3276ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1e1c1a1816141210, 0x0e0c0a0806040200, q2);
32780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q3);
32790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q4);
32800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x201e1c1a18161412, 0x100e0c0a08060402, q5);
32810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1b1a17161312, 0x0f0e0b0a07060302, q6);
32820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x21201d1c19181514, 0x11100d0c09080504, q7);
32830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1e1d1c1b16151413, 0x0e0d0c0b06050403, q16);
32840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2221201f1a191817, 0x1211100f0a090807, q17);
32850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1b1a191817161514, 0x0b0a090807060504, q31);
32860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x232221201f1e1d1c, 0x131211100f0e0d0c, q0);
3287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32920cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld2_q_postindex) {
329339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
3294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
32950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
32960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
32970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
32980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
32990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
33000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
3301ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
33020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
33030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 1);
33040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 2);
33050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 3);
33060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base + 4);
33070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 1);
33080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v2.V16B(), v3.V16B(), MemOperand(x17, x22, PostIndex));
33090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v4.V16B(), v5.V16B(), MemOperand(x18, 32, PostIndex));
33100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v6.V8H(), v7.V8H(), MemOperand(x19, 32, PostIndex));
33110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v16.V4S(), v17.V4S(), MemOperand(x20, 32, PostIndex));
33120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v31.V2D(), v0.V2D(), MemOperand(x21, 32, PostIndex));
33130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
3314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
3316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1e1c1a1816141210, 0x0e0c0a0806040200, q2);
33180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q3);
33190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1d1b1917151311, 0x0f0d0b0907050301, q4);
33200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x201e1c1a18161412, 0x100e0c0a08060402, q5);
33210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1b1a17161312, 0x0f0e0b0a07060302, q6);
33220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x21201d1c19181514, 0x11100d0c09080504, q7);
33230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1e1d1c1b16151413, 0x0e0d0c0b06050403, q16);
33240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2221201f1a191817, 0x1211100f0a090807, q17);
33250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1b1a191817161514, 0x0b0a090807060504, q31);
33260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x232221201f1e1d1c, 0x131211100f0e0d0c, q0);
3327ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x17);
33310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1 + 32, x18);
33320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 + 32, x19);
33330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3 + 32, x20);
33340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 + 32, x21);
3335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
3337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3338ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33400cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld2_lane) {
334139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
334239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
33430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
33440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
33450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
33460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
33470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
334839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
334939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
335039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
33510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading whole register by element.
33520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
33530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
33540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld2(v0.B(), v1.B(), i, MemOperand(x17));
33550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
335639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  }
335739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
33580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
33590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
33600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld2(v2.H(), v3.H(), i, MemOperand(x17));
33610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
33620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
336339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
33640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
33650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
33660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld2(v4.S(), v5.S(), i, MemOperand(x17));
33670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
33680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
3369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
33710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
33720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld2(v6.D(), v7.D(), i, MemOperand(x17));
33730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
33740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
3375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading a single element into an initialised register.
33770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
33780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, x17);
33790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q8, MemOperand(x4, 16, PostIndex));
33800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q9, MemOperand(x4));
33810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v8.B(), v9.B(), 4, MemOperand(x17));
33820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, x17);
33830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q10, MemOperand(x5, 16, PostIndex));
33840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q11, MemOperand(x5));
33850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v10.H(), v11.H(), 3, MemOperand(x17));
33860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x6, x17);
33870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q12, MemOperand(x6, 16, PostIndex));
33880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q13, MemOperand(x6));
33890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v12.S(), v13.S(), 2, MemOperand(x17));
33900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x7, x17);
33910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q14, MemOperand(x7, 16, PostIndex));
33920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q15, MemOperand(x7));
33930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v14.D(), v15.D(), 1, MemOperand(x17));
339439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
33950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
3396ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
3398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
33990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
34000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1);
34010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100020103020403, 0x0504060507060807, q2);
34020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q3);
34030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010004030201, 0x0504030206050403, q4);
34040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050408070605, 0x090807060a090807, q5);
34050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0807060504030201, q6);
34060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q7);
34070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q8);
34080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q9);
34090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q10);
34100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q11);
34110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q12);
34120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q13);
34130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0706050403020100, q14);
34140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q15);
341539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
34160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
3417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3418ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3419ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
34200cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld2_lane_postindex) {
342139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
342239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
34230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
34240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
34250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
34260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
34270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
342839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
342939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
34300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
34310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
34320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
34330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base);
34340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base);
34350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, src_base);
34360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, src_base);
34370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base);
343839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
34390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading whole register by element.
34400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
34410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld2(v0.B(), v1.B(), i, MemOperand(x17, 2, PostIndex));
34420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
34430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
34440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
34450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld2(v2.H(), v3.H(), i, MemOperand(x18, 4, PostIndex));
34460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
34470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
34480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
34490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld2(v4.S(), v5.S(), i, MemOperand(x19, 8, PostIndex));
34500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
34510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
34520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
34530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld2(v6.D(), v7.D(), i, MemOperand(x20, 16, PostIndex));
345439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  }
34550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
34560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading a single element into an initialised register.
34570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 1);
34580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, x21);
34590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q8, MemOperand(x4, 16, PostIndex));
34600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q9, MemOperand(x4));
34610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v8.B(), v9.B(), 4, MemOperand(x21, x25, PostIndex));
34620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
34630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
34640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, x22);
34650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q10, MemOperand(x5, 16, PostIndex));
34660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q11, MemOperand(x5));
34670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v10.H(), v11.H(), 3, MemOperand(x22, x25, PostIndex));
34680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
34690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
34700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x6, x23);
34710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q12, MemOperand(x6, 16, PostIndex));
34720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q13, MemOperand(x6));
34730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v12.S(), v13.S(), 2, MemOperand(x23, x25, PostIndex));
34740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
34750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
34760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x7, x24);
34770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q14, MemOperand(x7, 16, PostIndex));
34780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q15, MemOperand(x7));
34790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2(v14.D(), v15.D(), 1, MemOperand(x24, x25, PostIndex));
34800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
348139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  END();
348239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
348339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  RUN();
348439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
34850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00020406080a0c0e, 0x10121416181a1c1e, q0);
34860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x01030507090b0d0f, 0x11131517191b1d1f, q1);
34870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100050409080d0c, 0x1110151419181d1c, q2);
34880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x030207060b0a0f0e, 0x131217161b1a1f1e, q3);
34890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x030201000b0a0908, 0x131211101b1a1918, q4);
34900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x070605040f0e0d0c, 0x171615141f1e1d1c, q5);
34910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x1716151413121110, q6);
34920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1f1e1d1c1b1a1918, q7);
34930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q8);
34940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q9);
34950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q10);
34960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q11);
34970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q12);
34980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q13);
34990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0706050403020100, q14);
35000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q15);
35010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
35020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
35030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
35040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
35050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 32, x17);
35060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 32, x18);
35070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 32, x19);
35080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 32, x20);
35090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x21);
35100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2, x22);
35110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3, x23);
35120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4, x24);
351339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
351439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
3515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
3516ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
3517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
35180cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld2_alllanes) {
35190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
3520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
35210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
35220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
35230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
35240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
35250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
3526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
35270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
35280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
35290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
35300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v0.V8B(), v1.V8B(), MemOperand(x17));
35310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 2);
35320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v2.V16B(), v3.V16B(), MemOperand(x17));
35330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
35340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v4.V4H(), v5.V4H(), MemOperand(x17));
35350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
35360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v6.V8H(), v7.V8H(), MemOperand(x17));
35370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 4);
35380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v8.V2S(), v9.V2S(), MemOperand(x17));
35390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
35400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v10.V4S(), v11.V4S(), MemOperand(x17));
35410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 8);
35420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v12.V2D(), v13.V2D(), MemOperand(x17));
35430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
354439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
35450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
35460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
35470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
35480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
35490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0303030303030303, 0x0303030303030303, q2);
35500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3);
35510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0504050405040504, q4);
35520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0706070607060706, q5);
35530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0605060506050605, 0x0605060506050605, q6);
35540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0807080708070807, 0x0807080708070807, q7);
35550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0c0b0a090c0b0a09, q8);
35560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x100f0e0d100f0e0d, q9);
35570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0d0c0b0a0d0c0b0a, 0x0d0c0b0a0d0c0b0a, q10);
35580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x11100f0e11100f0e, 0x11100f0e11100f0e, q11);
35590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1918171615141312, 0x1918171615141312, q12);
35600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x21201f1e1d1c1b1a, 0x21201f1e1d1c1b1a, q13);
35610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
35620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
356339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
356439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
356539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
35660cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld2_alllanes_postindex) {
356739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
356839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
35690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
35700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
35710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
35720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
35730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
357439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
357539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
35760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
35770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
35780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v0.V8B(), v1.V8B(), MemOperand(x17, 2, PostIndex));
35790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v2.V16B(), v3.V16B(), MemOperand(x17, x18, PostIndex));
35800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v4.V4H(), v5.V4H(), MemOperand(x17, x18, PostIndex));
35810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v6.V8H(), v7.V8H(), MemOperand(x17, 4, PostIndex));
35820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v8.V2S(), v9.V2S(), MemOperand(x17, x18, PostIndex));
35830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v10.V4S(), v11.V4S(), MemOperand(x17, 8, PostIndex));
35840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld2r(v12.V2D(), v13.V2D(), MemOperand(x17, 16, PostIndex));
35850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
358639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
35870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
35884a06316541258e3c058792321295ee36d409f419armvixl
35890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
35900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
35910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0303030303030303, 0x0303030303030303, q2);
35920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3);
35930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0504050405040504, q4);
35940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0706070607060706, q5);
35950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0605060506050605, 0x0605060506050605, q6);
35960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0807080708070807, 0x0807080708070807, q7);
35970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0c0b0a090c0b0a09, q8);
35980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x100f0e0d100f0e0d, q9);
35990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0d0c0b0a0d0c0b0a, 0x0d0c0b0a0d0c0b0a, q10);
36000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x11100f0e11100f0e, 0x11100f0e11100f0e, q11);
36010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1918171615141312, 0x1918171615141312, q12);
36020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x21201f1e1d1c1b1a, 0x21201f1e1d1c1b1a, q13);
36030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 34, x17);
36044a06316541258e3c058792321295ee36d409f419armvixl
36050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
36060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
36074a06316541258e3c058792321295ee36d409f419armvixl
36084a06316541258e3c058792321295ee36d409f419armvixl
36090cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld3_d) {
36100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
36110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
36120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
36130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
36140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
36150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
36160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
36170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
36180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
36190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
36200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v2.V8B(), v3.V8B(), v4.V8B(), MemOperand(x17));
36210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
36220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v5.V8B(), v6.V8B(), v7.V8B(), MemOperand(x17));
36230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
36240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v8.V4H(), v9.V4H(), v10.V4H(), MemOperand(x17));
36250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
36260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17));
362739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  END();
362839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
362939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  RUN();
363039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
36310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x15120f0c09060300, q2);
36320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1613100d0a070401, q3);
36330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1714110e0b080502, q4);
36340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1613100d0a070401, q5);
36350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1714110e0b080502, q6);
36360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1815120f0c090603, q7);
36370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x15140f0e09080302, q8);
36380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x171611100b0a0504, q9);
36390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x191813120d0c0706, q10);
36400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1211100f06050403, q31);
36410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x161514130a090807, q0);
36420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1a1918170e0d0c0b, q1);
36434a06316541258e3c058792321295ee36d409f419armvixl
36444a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
36454a06316541258e3c058792321295ee36d409f419armvixl}
36464a06316541258e3c058792321295ee36d409f419armvixl
36474a06316541258e3c058792321295ee36d409f419armvixl
36480cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld3_d_postindex) {
36494a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
36504a06316541258e3c058792321295ee36d409f419armvixl
36510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[32 + 4];
36520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
36530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
36540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
36550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
36564a06316541258e3c058792321295ee36d409f419armvixl
36574a06316541258e3c058792321295ee36d409f419armvixl  START();
36580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
36590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 1);
36600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 2);
36610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 3);
36620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base + 4);
36630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 1);
36640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v2.V8B(), v3.V8B(), v4.V8B(), MemOperand(x17, x22, PostIndex));
36650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v5.V8B(), v6.V8B(), v7.V8B(), MemOperand(x18, 24, PostIndex));
36660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v8.V4H(), v9.V4H(), v10.V4H(), MemOperand(x19, 24, PostIndex));
36670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v11.V2S(), v12.V2S(), v13.V2S(), MemOperand(x20, 24, PostIndex));
36680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x21, 24, PostIndex));
36690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
36704a06316541258e3c058792321295ee36d409f419armvixl
36710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
36724a06316541258e3c058792321295ee36d409f419armvixl
36730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x15120f0c09060300, q2);
36740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1613100d0a070401, q3);
36750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1714110e0b080502, q4);
36760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1613100d0a070401, q5);
36770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1714110e0b080502, q6);
36780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1815120f0c090603, q7);
36790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x15140f0e09080302, q8);
36800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x171611100b0a0504, q9);
36810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x191813120d0c0706, q10);
36820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1211100f06050403, q11);
36830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x161514130a090807, q12);
36840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1a1918170e0d0c0b, q13);
36850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1312111007060504, q31);
36860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x171615140b0a0908, q0);
36870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1b1a19180f0e0d0c, q1);
36880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
36890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x17);
36900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1 + 24, x18);
36910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 + 24, x19);
36920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3 + 24, x20);
36930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 + 24, x21);
36944a06316541258e3c058792321295ee36d409f419armvixl
36950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
36960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
36974a06316541258e3c058792321295ee36d409f419armvixl
36984a06316541258e3c058792321295ee36d409f419armvixl
36990cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld3_q) {
37000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
37010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
37020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
37030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
37040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
37050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
37060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
37070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
37080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
37090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
37100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v2.V16B(), v3.V16B(), v4.V16B(), MemOperand(x17));
37110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
37120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x17));
37130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
37140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v8.V8H(), v9.V8H(), v10.V8H(), MemOperand(x17));
37150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
37160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v11.V4S(), v12.V4S(), v13.V4S(), MemOperand(x17));
37170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
37180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x17));
37194a06316541258e3c058792321295ee36d409f419armvixl  END();
37204a06316541258e3c058792321295ee36d409f419armvixl
37214a06316541258e3c058792321295ee36d409f419armvixl  RUN();
37224a06316541258e3c058792321295ee36d409f419armvixl
37230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2d2a2724211e1b18, 0x15120f0c09060300, q2);
37240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q3);
37250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q4);
37260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q5);
37270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q6);
37280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x302d2a2724211e1b, 0x1815120f0c090603, q7);
37290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2d2c272621201b1a, 0x15140f0e09080302, q8);
37300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e292823221d1c, 0x171611100b0a0504, q9);
37310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x31302b2a25241f1e, 0x191813120d0c0706, q10);
37320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2a2928271e1d1c1b, 0x1211100f06050403, q11);
37330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2d2c2b2221201f, 0x161514130a090807, q12);
37340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3231302f26252423, 0x1a1918170e0d0c0b, q13);
37350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x232221201f1e1d1c, 0x0b0a090807060504, q31);
37360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2b2a292827262524, 0x131211100f0e0d0c, q0);
37370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x333231302f2e2d2c, 0x1b1a191817161514, q1);
37384a06316541258e3c058792321295ee36d409f419armvixl
37394a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
37404a06316541258e3c058792321295ee36d409f419armvixl}
37414a06316541258e3c058792321295ee36d409f419armvixl
37424a06316541258e3c058792321295ee36d409f419armvixl
37430cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld3_q_postindex) {
37444a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
37454a06316541258e3c058792321295ee36d409f419armvixl
37460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
37470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
37480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
37490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
37500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
37510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
37524a06316541258e3c058792321295ee36d409f419armvixl  START();
37530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
37540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 1);
37550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 2);
37560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 3);
37570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base + 4);
37580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 1);
37590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
37600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v2.V16B(), v3.V16B(), v4.V16B(), MemOperand(x17, x22, PostIndex));
37610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x18, 48, PostIndex));
37620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v8.V8H(), v9.V8H(), v10.V8H(), MemOperand(x19, 48, PostIndex));
37630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v11.V4S(), v12.V4S(), v13.V4S(), MemOperand(x20, 48, PostIndex));
37640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v31.V2D(), v0.V2D(), v1.V2D(), MemOperand(x21, 48, PostIndex));
37650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
37664a06316541258e3c058792321295ee36d409f419armvixl
37670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
37684a06316541258e3c058792321295ee36d409f419armvixl
37690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2d2a2724211e1b18, 0x15120f0c09060300, q2);
37700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q3);
37710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q4);
37720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2b2825221f1c19, 0x1613100d0a070401, q5);
37730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2c292623201d1a, 0x1714110e0b080502, q6);
37740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x302d2a2724211e1b, 0x1815120f0c090603, q7);
37750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2d2c272621201b1a, 0x15140f0e09080302, q8);
37760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e292823221d1c, 0x171611100b0a0504, q9);
37770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x31302b2a25241f1e, 0x191813120d0c0706, q10);
37780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2a2928271e1d1c1b, 0x1211100f06050403, q11);
37790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2d2c2b2221201f, 0x161514130a090807, q12);
37800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3231302f26252423, 0x1a1918170e0d0c0b, q13);
37810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x232221201f1e1d1c, 0x0b0a090807060504, q31);
37820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2b2a292827262524, 0x131211100f0e0d0c, q0);
37830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x333231302f2e2d2c, 0x1b1a191817161514, q1);
37840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
37850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x17);
37860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1 + 48, x18);
37870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 + 48, x19);
37880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3 + 48, x20);
37890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 + 48, x21);
37904a06316541258e3c058792321295ee36d409f419armvixl
37914a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
37924a06316541258e3c058792321295ee36d409f419armvixl}
37934a06316541258e3c058792321295ee36d409f419armvixl
37944a06316541258e3c058792321295ee36d409f419armvixl
37950cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld3_lane) {
37964a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
37974a06316541258e3c058792321295ee36d409f419armvixl
37980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
37990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
38000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
38010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
38020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
38030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
38044a06316541258e3c058792321295ee36d409f419armvixl  START();
38054a06316541258e3c058792321295ee36d409f419armvixl
38060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading whole register by element.
38070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
38080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
38090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld3(v0.B(), v1.B(), v2.B(), i, MemOperand(x17));
38100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
38110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
38124a06316541258e3c058792321295ee36d409f419armvixl
38130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
38140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
38150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld3(v3.H(), v4.H(), v5.H(), i, MemOperand(x17));
38160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
38170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
38184a06316541258e3c058792321295ee36d409f419armvixl
38190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
38200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
38210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld3(v6.S(), v7.S(), v8.S(), i, MemOperand(x17));
38220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
38230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
38240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
38250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
38260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
38270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld3(v9.D(), v10.D(), v11.D(), i, MemOperand(x17));
38280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
38294a06316541258e3c058792321295ee36d409f419armvixl  }
38304a06316541258e3c058792321295ee36d409f419armvixl
38310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading a single element into an initialised register.
38320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
38330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, x17);
38340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q12, MemOperand(x4, 16, PostIndex));
38350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q13, MemOperand(x4, 16, PostIndex));
38360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q14, MemOperand(x4));
38370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v12.B(), v13.B(), v14.B(), 4, MemOperand(x17));
38380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, x17);
38390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q15, MemOperand(x5, 16, PostIndex));
38400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x5, 16, PostIndex));
38410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x5));
38420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v15.H(), v16.H(), v17.H(), 3, MemOperand(x17));
38430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x6, x17);
38440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x6, 16, PostIndex));
38450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x6, 16, PostIndex));
38460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x6));
38470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v18.S(), v19.S(), v20.S(), 2, MemOperand(x17));
38480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x7, x17);
38490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x7, 16, PostIndex));
38500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x7, 16, PostIndex));
38510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x7));
38520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v21.D(), v22.D(), v23.D(), 1, MemOperand(x17));
38530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
38544a06316541258e3c058792321295ee36d409f419armvixl  END();
38550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
38564a06316541258e3c058792321295ee36d409f419armvixl  RUN();
38570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
38580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
38590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1);
38600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0203040506070809, 0x0a0b0c0d0e0f1011, q2);
38610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100020103020403, 0x0504060507060807, q3);
38620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q4);
38630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0504060507060807, 0x09080a090b0a0c0b, q5);
38640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010004030201, 0x0504030206050403, q6);
38650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050408070605, 0x090807060a090807, q7);
38660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0b0a09080c0b0a09, 0x0d0c0b0a0e0d0c0b, q8);
38670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0807060504030201, q9);
38680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q10);
38690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x1817161514131211, q11);
38700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q12);
38710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q13);
38720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q14);
38730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q15);
38740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q16);
38750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q17);
38760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
38774a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
38784a06316541258e3c058792321295ee36d409f419armvixl}
38794a06316541258e3c058792321295ee36d409f419armvixl
38804a06316541258e3c058792321295ee36d409f419armvixl
38810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld3_lane_postindex) {
38824a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
38830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
38840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
38850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
38860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
38870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
38880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
38890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
38904a06316541258e3c058792321295ee36d409f419armvixl  START();
38914a06316541258e3c058792321295ee36d409f419armvixl
38920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading whole register by element.
38930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
38940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
38950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
38960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base);
38970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base);
38980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, src_base);
38990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, src_base);
39000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base);
39010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
39020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld3(v0.B(), v1.B(), v2.B(), i, MemOperand(x17, 3, PostIndex));
39030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
39044a06316541258e3c058792321295ee36d409f419armvixl
39050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
39060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld3(v3.H(), v4.H(), v5.H(), i, MemOperand(x18, 6, PostIndex));
39070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
39080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
39100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld3(v6.S(), v7.S(), v8.S(), i, MemOperand(x19, 12, PostIndex));
39114a06316541258e3c058792321295ee36d409f419armvixl  }
39124a06316541258e3c058792321295ee36d409f419armvixl
39130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
39140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld3(v9.D(), v10.D(), v11.D(), i, MemOperand(x20, 24, PostIndex));
39150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
39160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading a single element into an initialised register.
39190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 1);
39200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, x21);
39210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q12, MemOperand(x4, 16, PostIndex));
39220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q13, MemOperand(x4, 16, PostIndex));
39230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q14, MemOperand(x4));
39240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v12.B(), v13.B(), v14.B(), 4, MemOperand(x21, x25, PostIndex));
39250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
39260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, x22);
39280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q15, MemOperand(x5, 16, PostIndex));
39290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x5, 16, PostIndex));
39300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x5));
39310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v15.H(), v16.H(), v17.H(), 3, MemOperand(x22, x25, PostIndex));
39320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
39330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x6, x23);
39350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x6, 16, PostIndex));
39360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x6, 16, PostIndex));
39370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x6));
39380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v18.S(), v19.S(), v20.S(), 2, MemOperand(x23, x25, PostIndex));
39390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
39400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x7, x24);
39420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x7, 16, PostIndex));
39430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x7, 16, PostIndex));
39440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x7));
39450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3(v21.D(), v22.D(), v23.D(), 1, MemOperand(x24, x25, PostIndex));
39460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39474a06316541258e3c058792321295ee36d409f419armvixl  END();
39480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39494a06316541258e3c058792321295ee36d409f419armvixl  RUN();
39500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000306090c0f1215, 0x181b1e2124272a2d, q0);
39520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0104070a0d101316, 0x191c1f2225282b2e, q1);
39530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0205080b0e111417, 0x1a1d202326292c2f, q2);
39540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x010007060d0c1312, 0x19181f1e25242b2a, q3);
39550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x030209080f0e1514, 0x1b1a212027262d2c, q4);
39560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x05040b0a11101716, 0x1d1c232229282f2e, q5);
39570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x030201000f0e0d0c, 0x1b1a191827262524, q6);
39580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050413121110, 0x1f1e1d1c2b2a2928, q7);
39590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0b0a090817161514, 0x232221202f2e2d2c, q8);
39600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x1f1e1d1c1b1a1918, q9);
39610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x2726252423222120, q10);
39620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x2f2e2d2c2b2a2928, q11);
39630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q12);
39640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q13);
39650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q14);
39660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q15);
39670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q16);
39680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q17);
39690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q18);
39700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q19);
39710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q20);
39720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0706050403020100, q21);
39730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q22);
39740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x2726252423222120, q23);
39750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 48, x17);
39770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 48, x18);
39780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 48, x19);
39790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 48, x20);
39800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x21);
39810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2, x22);
39820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3, x23);
39830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4, x24);
39840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
39854a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
39864a06316541258e3c058792321295ee36d409f419armvixl}
39874a06316541258e3c058792321295ee36d409f419armvixl
39884a06316541258e3c058792321295ee36d409f419armvixl
39890cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld3_alllanes) {
39904a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
39914a06316541258e3c058792321295ee36d409f419armvixl
39920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
39930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
39940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
39950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
39960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
39974a06316541258e3c058792321295ee36d409f419armvixl
39984a06316541258e3c058792321295ee36d409f419armvixl  START();
39990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
40000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
40010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x17));
40020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 3);
40030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17));
40040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
40050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v6.V4H(), v7.V4H(), v8.V4H(), MemOperand(x17));
40060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
40070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v9.V8H(), v10.V8H(), v11.V8H(), MemOperand(x17));
40080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 6);
40090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v12.V2S(), v13.V2S(), v14.V2S(), MemOperand(x17));
40100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
40110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17));
40120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 12);
40130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v18.V2D(), v19.V2D(), v20.V2D(), MemOperand(x17));
40140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
40154a06316541258e3c058792321295ee36d409f419armvixl
40160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
40174a06316541258e3c058792321295ee36d409f419armvixl
40180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
40190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
40200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2);
40210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3);
40220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4);
40230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5);
40240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0605060506050605, q6);
40250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0807080708070807, q7);
40260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0a090a090a090a09, q8);
40270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706070607060706, 0x0706070607060706, q9);
40280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0908090809080908, 0x0908090809080908, q10);
40290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0b0a0b0a0b0a0b0a, 0x0b0a0b0a0b0a0b0a, q11);
40300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0f0e0d0c0f0e0d0c, q12);
40310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1312111013121110, q13);
40320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1716151417161514, q14);
40330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x100f0e0d100f0e0d, 0x100f0e0d100f0e0d, q15);
40340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1413121114131211, 0x1413121114131211, q16);
40350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1817161518171615, 0x1817161518171615, q17);
40360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x201f1e1d1c1b1a19, 0x201f1e1d1c1b1a19, q18);
40370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2827262524232221, 0x2827262524232221, q19);
40380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x302f2e2d2c2b2a29, 0x302f2e2d2c2b2a29, q20);
40394a06316541258e3c058792321295ee36d409f419armvixl
40400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
40410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
40424a06316541258e3c058792321295ee36d409f419armvixl
40434a06316541258e3c058792321295ee36d409f419armvixl
40440cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld3_alllanes_postindex) {
40450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
40460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
40470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
40480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
40490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
40500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
40510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
40520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
40530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
40540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
40550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
40560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
40570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
40580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x17, 3, PostIndex));
40590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17, x18, PostIndex));
40600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v6.V4H(), v7.V4H(), v8.V4H(), MemOperand(x17, x18, PostIndex));
40610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v9.V8H(), v10.V8H(), v11.V8H(), MemOperand(x17, 6, PostIndex));
40620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v12.V2S(), v13.V2S(), v14.V2S(), MemOperand(x17, x18, PostIndex));
40630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17, 12, PostIndex));
40640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld3r(v18.V2D(), v19.V2D(), v20.V2D(), MemOperand(x17, 24, PostIndex));
40654a06316541258e3c058792321295ee36d409f419armvixl  END();
40660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
40674a06316541258e3c058792321295ee36d409f419armvixl  RUN();
40680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
40690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
40700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
40710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2);
40720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0404040404040404, 0x0404040404040404, q3);
40730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4);
40740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5);
40750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0605060506050605, q6);
40760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0807080708070807, q7);
40770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0a090a090a090a09, q8);
40780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706070607060706, 0x0706070607060706, q9);
40790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0908090809080908, 0x0908090809080908, q10);
40800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0b0a0b0a0b0a0b0a, 0x0b0a0b0a0b0a0b0a, q11);
40810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0f0e0d0c0f0e0d0c, q12);
40820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1312111013121110, q13);
40830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1716151417161514, q14);
40840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x100f0e0d100f0e0d, 0x100f0e0d100f0e0d, q15);
40850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1413121114131211, 0x1413121114131211, q16);
40860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1817161518171615, 0x1817161518171615, q17);
40870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x201f1e1d1c1b1a19, 0x201f1e1d1c1b1a19, q18);
40880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2827262524232221, 0x2827262524232221, q19);
40890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x302f2e2d2c2b2a29, 0x302f2e2d2c2b2a29, q20);
40900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
40914a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
40924a06316541258e3c058792321295ee36d409f419armvixl}
40934a06316541258e3c058792321295ee36d409f419armvixl
40944a06316541258e3c058792321295ee36d409f419armvixl
40950cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld4_d) {
40964a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
40974a06316541258e3c058792321295ee36d409f419armvixl
40980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
40990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
41000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
41014a06316541258e3c058792321295ee36d409f419armvixl  }
41020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
41034a06316541258e3c058792321295ee36d409f419armvixl
41040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
41050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
41060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v2.V8B(), v3.V8B(), v4.V8B(), v5.V8B(), MemOperand(x17));
41070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
41080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v6.V8B(), v7.V8B(), v8.V8B(), v9.V8B(), MemOperand(x17));
41090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
41100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v10.V4H(), v11.V4H(), v12.V4H(), v13.V4H(), MemOperand(x17));
41110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
41120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(), MemOperand(x17));
41134a06316541258e3c058792321295ee36d409f419armvixl  END();
41140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
41154a06316541258e3c058792321295ee36d409f419armvixl  RUN();
41160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
41170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1c1814100c080400, q2);
41180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1d1915110d090501, q3);
41190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1e1a16120e0a0602, q4);
41200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1b17130f0b0703, q5);
41210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1d1915110d090501, q6);
41220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1e1a16120e0a0602, q7);
41230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1b17130f0b0703, q8);
41240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x201c1814100c0804, q9);
41250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1b1a13120b0a0302, q10);
41260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1d1c15140d0c0504, q11);
41270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1e17160f0e0706, q12);
41280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2120191811100908, q13);
41290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1615141306050403, q30);
41300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1a1918170a090807, q31);
41310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1e1d1c1b0e0d0c0b, q0);
41320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2221201f1211100f, q1);
41330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
41344a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
41354a06316541258e3c058792321295ee36d409f419armvixl}
41364a06316541258e3c058792321295ee36d409f419armvixl
41374a06316541258e3c058792321295ee36d409f419armvixl
41380cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld4_d_postindex) {
41394a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
41404a06316541258e3c058792321295ee36d409f419armvixl
41410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[32 + 4];
41420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
41430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
41440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
41450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
41464a06316541258e3c058792321295ee36d409f419armvixl
41474a06316541258e3c058792321295ee36d409f419armvixl  START();
41480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
41490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 1);
41500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 2);
41510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 3);
41520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base + 4);
41530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 1);
41540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v2.V8B(), v3.V8B(), v4.V8B(), v5.V8B(),
41550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x17, x22, PostIndex));
41560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v6.V8B(), v7.V8B(), v8.V8B(), v9.V8B(),
41570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18, 32, PostIndex));
41580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v10.V4H(), v11.V4H(), v12.V4H(), v13.V4H(),
41590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x19, 32, PostIndex));
41600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v14.V2S(), v15.V2S(), v16.V2S(), v17.V2S(),
41610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x20, 32, PostIndex));
41620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v30.V2S(), v31.V2S(), v0.V2S(), v1.V2S(),
41630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x21, 32, PostIndex));
41640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
41654a06316541258e3c058792321295ee36d409f419armvixl
41660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
41674a06316541258e3c058792321295ee36d409f419armvixl
41680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1c1814100c080400, q2);
41690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1d1915110d090501, q3);
41700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1e1a16120e0a0602, q4);
41710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1b17130f0b0703, q5);
41720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1d1915110d090501, q6);
41730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1e1a16120e0a0602, q7);
41740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1b17130f0b0703, q8);
41750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x201c1814100c0804, q9);
41760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1b1a13120b0a0302, q10);
41770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1d1c15140d0c0504, q11);
41780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1e17160f0e0706, q12);
41790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2120191811100908, q13);
41800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1615141306050403, q14);
41810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1a1918170a090807, q15);
41820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1e1d1c1b0e0d0c0b, q16);
41830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2221201f1211100f, q17);
41840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1716151407060504, q30);
41850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1b1a19180b0a0908, q31);
41860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1f1e1d1c0f0e0d0c, q0);
41870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2322212013121110, q1);
41880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
41890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
41900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x17);
41910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1 + 32, x18);
41920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 + 32, x19);
41930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3 + 32, x20);
41940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 + 32, x21);
41950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
41960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
41974a06316541258e3c058792321295ee36d409f419armvixl
41984a06316541258e3c058792321295ee36d409f419armvixl
41990cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld4_q) {
42000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
42010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
42020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
42030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
42040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
42054a06316541258e3c058792321295ee36d409f419armvixl  }
42060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
42074a06316541258e3c058792321295ee36d409f419armvixl
42080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
42090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
42100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v2.V16B(), v3.V16B(), v4.V16B(), v5.V16B(), MemOperand(x17));
42110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
42120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v6.V16B(), v7.V16B(), v8.V16B(), v9.V16B(), MemOperand(x17));
42130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
42140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v10.V8H(), v11.V8H(), v12.V8H(), v13.V8H(), MemOperand(x17));
42150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
42160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v14.V4S(), v15.V4S(), v16.V4S(), v17.V4S(), MemOperand(x17));
42170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
42180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v18.V2D(), v19.V2D(), v20.V2D(), v21.V2D(), MemOperand(x17));
42190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
42204a06316541258e3c058792321295ee36d409f419armvixl
42210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
42224a06316541258e3c058792321295ee36d409f419armvixl
42230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3c3834302c282420, 0x1c1814100c080400, q2);
42240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q3);
42250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q4);
42260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q5);
42270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q6);
42280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q7);
42290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q8);
42300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x403c3834302c2824, 0x201c1814100c0804, q9);
42310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3b3a33322b2a2322, 0x1b1a13120b0a0302, q10);
42320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3d3c35342d2c2524, 0x1d1c15140d0c0504, q11);
42330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e37362f2e2726, 0x1f1e17160f0e0706, q12);
42340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4140393831302928, 0x2120191811100908, q13);
42350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3635343326252423, 0x1615141306050403, q14);
42360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3a3938372a292827, 0x1a1918170a090807, q15);
42370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3e3d3c3b2e2d2c2b, 0x1e1d1c1b0e0d0c0b, q16);
42380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4241403f3231302f, 0x2221201f1211100f, q17);
42390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2b2a292827262524, 0x0b0a090807060504, q18);
42400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x333231302f2e2d2c, 0x131211100f0e0d0c, q19);
42410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3b3a393837363534, 0x1b1a191817161514, q20);
42420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x434241403f3e3d3c, 0x232221201f1e1d1c, q21);
42430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
42440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
42450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
42460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
42470cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld4_q_postindex) {
42480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
42490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
42500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 4];
42510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
42520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
42530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
42540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
42554a06316541258e3c058792321295ee36d409f419armvixl
42560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
42570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
42580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 1);
42590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 2);
42600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 3);
42610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base + 4);
42620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 1);
42630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
42640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v2.V16B(), v3.V16B(), v4.V16B(), v5.V16B(),
42650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x17, x22, PostIndex));
42660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v6.V16B(), v7.V16B(), v8.V16B(), v9.V16B(),
42670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18, 64, PostIndex));
42680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v10.V8H(), v11.V8H(), v12.V8H(), v13.V8H(),
42690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x19, 64, PostIndex));
42700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v14.V4S(), v15.V4S(), v16.V4S(), v17.V4S(),
42710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x20, 64, PostIndex));
42720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v30.V2D(), v31.V2D(), v0.V2D(), v1.V2D(),
42730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x21, 64, PostIndex));
42744a06316541258e3c058792321295ee36d409f419armvixl  END();
42754a06316541258e3c058792321295ee36d409f419armvixl
42764a06316541258e3c058792321295ee36d409f419armvixl  RUN();
42774a06316541258e3c058792321295ee36d409f419armvixl
42780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3c3834302c282420, 0x1c1814100c080400, q2);
42790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q3);
42800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q4);
42810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q5);
42820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3d3935312d292521, 0x1d1915110d090501, q6);
42830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3e3a36322e2a2622, 0x1e1a16120e0a0602, q7);
42840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3b37332f2b2723, 0x1f1b17130f0b0703, q8);
42850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x403c3834302c2824, 0x201c1814100c0804, q9);
42860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3b3a33322b2a2322, 0x1b1a13120b0a0302, q10);
42870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3d3c35342d2c2524, 0x1d1c15140d0c0504, q11);
42880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e37362f2e2726, 0x1f1e17160f0e0706, q12);
42890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4140393831302928, 0x2120191811100908, q13);
42900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3635343326252423, 0x1615141306050403, q14);
42910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3a3938372a292827, 0x1a1918170a090807, q15);
42920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3e3d3c3b2e2d2c2b, 0x1e1d1c1b0e0d0c0b, q16);
42930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4241403f3231302f, 0x2221201f1211100f, q17);
42940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2b2a292827262524, 0x0b0a090807060504, q30);
42950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x333231302f2e2d2c, 0x131211100f0e0d0c, q31);
42960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3b3a393837363534, 0x1b1a191817161514, q0);
42970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x434241403f3e3d3c, 0x232221201f1e1d1c, q1);
42980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
42990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
43000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
43010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x17);
43020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1 + 64, x18);
43030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 + 64, x19);
43040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3 + 64, x20);
43050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 + 64, x21);
43064a06316541258e3c058792321295ee36d409f419armvixl
430739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
4308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4309ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4310ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43110cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld4_lane) {
4312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
43150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
43160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
43170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
43180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
43190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
4320ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
4321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading whole register by element.
43230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
43240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
43250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld4(v0.B(), v1.B(), v2.B(), v3.B(), i, MemOperand(x17));
43260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
43270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
4328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
43300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
43310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld4(v4.H(), v5.H(), v6.H(), v7.H(), i, MemOperand(x17));
43320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
43330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
4334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
43360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
43370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld4(v8.S(), v9.S(), v10.S(), v11.S(), i, MemOperand(x17));
43380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
43390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
4340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
43420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
43430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld4(v12.D(), v13.D(), v14.D(), v15.D(), i, MemOperand(x17));
43440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
43450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
4346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading a single element into an initialised register.
43480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
43490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, x17);
43500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x4, 16, PostIndex));
43510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x4, 16, PostIndex));
43520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x4, 16, PostIndex));
43530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x4));
43540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v16.B(), v17.B(), v18.B(), v19.B(), 4, MemOperand(x17));
43550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
43560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, x17);
43570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x5, 16, PostIndex));
43580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x5, 16, PostIndex));
43590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x5, 16, PostIndex));
43600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x5));
43610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v20.H(), v21.H(), v22.H(), v23.H(), 3, MemOperand(x17));
43620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
43630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x6, x17);
43640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x6, 16, PostIndex));
43650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q25, MemOperand(x6, 16, PostIndex));
43660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q26, MemOperand(x6, 16, PostIndex));
43670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q27, MemOperand(x6));
43680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v24.S(), v25.S(), v26.S(), v27.S(), 2, MemOperand(x17));
43690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
43700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x7, x17);
43710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q28, MemOperand(x7, 16, PostIndex));
43720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q29, MemOperand(x7, 16, PostIndex));
43730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q30, MemOperand(x7, 16, PostIndex));
43740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q31, MemOperand(x7));
43750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v28.D(), v29.D(), v30.D(), v31.D(), 1, MemOperand(x17));
4376ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
4378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
4380ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
43810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
43820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0102030405060708, 0x090a0b0c0d0e0f10, q1);
43830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0203040506070809, 0x0a0b0c0d0e0f1011, q2);
43840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x030405060708090a, 0x0b0c0d0e0f101112, q3);
43850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100020103020403, 0x0504060507060807, q4);
43860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302040305040605, 0x0706080709080a09, q5);
43870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0504060507060807, 0x09080a090b0a0c0b, q6);
43880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706080709080a09, 0x0b0a0c0b0d0c0e0d, q7);
43890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010004030201, 0x0504030206050403, q8);
43900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050408070605, 0x090807060a090807, q9);
43910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0b0a09080c0b0a09, 0x0d0c0b0a0e0d0c0b, q10);
43920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c100f0e0d, 0x11100f0e1211100f, q11);
43930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0807060504030201, q12);
43940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x100f0e0d0c0b0a09, q13);
43950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x1817161514131211, q14);
43960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x201f1e1d1c1b1a19, q15);
43970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q16);
43980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q17);
43990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q18);
44000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736350333323130, q19);
44010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q20);
44020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q21);
44030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q22);
44040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x0706353433323130, q23);
44050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q24);
44060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q25);
44070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q26);
44080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c0f0e0d0c, 0x3736353433323130, q27);
44090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0706050403020100, q28);
44100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q29);
44110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x2726252423222120, q30);
44120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3736353433323130, q31);
4413ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
44190cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld4_lane_postindex) {
4420ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
44230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
44240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
44250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
44260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
4427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
4429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading whole register by element.
44310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
44320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
44330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld4(v0.B(), v1.B(), v2.B(), v3.B(), i,
44340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl           MemOperand(x17, 4, PostIndex));
44350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
4436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
44380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
44390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld4(v4.H(), v5.H(), v6.H(), v7.H(), i,
44400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl           MemOperand(x18, 8, PostIndex));
44410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
4442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
44440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
44450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld4(v8.S(), v9.S(), v10.S(), v11.S(), i,
44460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl           MemOperand(x19, 16, PostIndex));
44470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
444890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
44490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base);
44500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
44510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld4(v12.D(), v13.D(), v14.D(), v15.D(), i,
44520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl           MemOperand(x20, 32, PostIndex));
44530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
4454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading a single element into an initialised register.
44560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 1);
44570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base);
44580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, src_base);
44590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, src_base);
44600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base);
4461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, x21);
44630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x4, 16, PostIndex));
44640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x4, 16, PostIndex));
44650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x4, 16, PostIndex));
44660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x4));
44670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v16.B(), v17.B(), v18.B(), v19.B(), 4,
44680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x21, x25, PostIndex));
44690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
44700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
44710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, x22);
44720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x5, 16, PostIndex));
44730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x5, 16, PostIndex));
44740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x5, 16, PostIndex));
44750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x5));
44760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v20.H(), v21.H(), v22.H(), v23.H(), 3,
44770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x22, x25, PostIndex));
44780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
44790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
44800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x6, x23);
44810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x6, 16, PostIndex));
44820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q25, MemOperand(x6, 16, PostIndex));
44830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q26, MemOperand(x6, 16, PostIndex));
44840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q27, MemOperand(x6));
44850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v24.S(), v25.S(), v26.S(), v27.S(), 2,
44860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x23, x25, PostIndex));
44870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
44880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
44890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x7, x24);
44900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q28, MemOperand(x7, 16, PostIndex));
44910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q29, MemOperand(x7, 16, PostIndex));
44920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q30, MemOperand(x7, 16, PostIndex));
44930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q31, MemOperand(x7));
44940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4(v28.D(), v29.D(), v30.D(), v31.D(), 1,
44950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x24, x25, PostIndex));
4496ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
4498ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
44990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
4500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
45010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0004080c1014181c, 0x2024282c3034383c, q0);
45020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0105090d1115191d, 0x2125292d3135393d, q1);
45030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x02060a0e12161a1e, 0x22262a2e32363a3e, q2);
45040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x03070b0f13171b1f, 0x23272b2f33373b3f, q3);
45050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100090811101918, 0x2120292831303938, q4);
45060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x03020b0a13121b1a, 0x23222b2a33323b3a, q5);
45070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x05040d0c15141d1c, 0x25242d2c35343d3c, q6);
45080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x07060f0e17161f1e, 0x27262f2e37363f3e, q7);
45090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010013121110, 0x2322212033323130, q8);
45100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050417161514, 0x2726252437363534, q9);
45110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0b0a09081b1a1918, 0x2b2a29283b3a3938, q10);
45120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c1f1e1d1c, 0x2f2e2d2c3f3e3d3c, q11);
45130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x2726252423222120, q12);
45140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x2f2e2d2c2b2a2928, q13);
45150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x3736353433323130, q14);
45160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3f3e3d3c3b3a3938, q15);
45170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q16);
45180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716150113121110, q17);
45190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726250223222120, q18);
45200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736350333323130, q19);
45210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q20);
45220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0302151413121110, q21);
45230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x0504252423222120, q22);
45240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x0706353433323130, q23);
45250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q24);
45260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c07060504, 0x1716151413121110, q25);
45270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c0b0a0908, 0x2726252423222120, q26);
45280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c0f0e0d0c, 0x3736353433323130, q27);
45290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0706050403020100, q28);
45300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x1716151413121110, q29);
45310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x2726252423222120, q30);
45320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x3736353433323130, q31);
45330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
45340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 64, x17);
45350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 64, x18);
45360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 64, x19);
45370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 64, x20);
45380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x21);
45390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2, x22);
45400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3, x23);
45410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4, x24);
4542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4546ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
45470cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld4_alllanes) {
4548ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
45500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
45510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
45520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
45530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
45540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
45550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
4556ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
45570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
45580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
45590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(), MemOperand(x17));
45600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 4);
45610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v4.V16B(), v5.V16B(), v6.V16B(), v7.V16B(), MemOperand(x17));
45620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
45630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v8.V4H(), v9.V4H(), v10.V4H(), v11.V4H(), MemOperand(x17));
45640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
45650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v12.V8H(), v13.V8H(), v14.V8H(), v15.V8H(), MemOperand(x17));
45660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 8);
45670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(), MemOperand(x17));
45680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
45690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v20.V4S(), v21.V4S(), v22.V4S(), v23.V4S(), MemOperand(x17));
45700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 16);
45710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v24.V2D(), v25.V2D(), v26.V2D(), v27.V2D(), MemOperand(x17));
4572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4573ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4574ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4575ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4577ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
45780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
45790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
45800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2);
45810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0404040404040404, q3);
45820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4);
45830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5);
45840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0707070707070707, 0x0707070707070707, q6);
45850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0808080808080808, 0x0808080808080808, q7);
45860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0706070607060706, q8);
45870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0908090809080908, q9);
45880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0b0a0b0a0b0a0b0a, q10);
45890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0d0c0d0c0d0c0d0c, q11);
45900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0807080708070807, 0x0807080708070807, q12);
45910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0a090a090a090a09, 0x0a090a090a090a09, q13);
45920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0c0b0c0b0c0b0c0b, 0x0c0b0c0b0c0b0c0b, q14);
45930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0e0d0e0d0e0d0e0d, 0x0e0d0e0d0e0d0e0d, q15);
45940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1211100f1211100f, q16);
45950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1615141316151413, q17);
45960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1a1918171a191817, q18);
45970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1e1d1c1b1e1d1c1b, q19);
45980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1312111013121110, 0x1312111013121110, q20);
45990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151417161514, 0x1716151417161514, q21);
46000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1b1a19181b1a1918, 0x1b1a19181b1a1918, q22);
46010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1f1e1d1c, 0x1f1e1d1c1f1e1d1c, q23);
46020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2726252423222120, 0x2726252423222120, q24);
46030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2f2e2d2c2b2a2928, q25);
46040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3736353433323130, 0x3736353433323130, q26);
46050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3f3e3d3c3b3a3938, q27);
4606ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4607ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4608ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4610ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46110cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld4_alllanes_postindex) {
4612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
46150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
46160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
46170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
46180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
46190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
46200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
4621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
46230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
46240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
46250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(),
46260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          MemOperand(x17, 4, PostIndex));
46270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v4.V16B(), v5.V16B(), v6.V16B(), v7.V16B(),
46280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          MemOperand(x17, x18, PostIndex));
46290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v8.V4H(), v9.V4H(), v10.V4H(), v11.V4H(),
46300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          MemOperand(x17, x18, PostIndex));
46310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v12.V8H(), v13.V8H(), v14.V8H(), v15.V8H(),
46320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          MemOperand(x17, 8, PostIndex));
46330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v16.V2S(), v17.V2S(), v18.V2S(), v19.V2S(),
46340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          MemOperand(x17, x18, PostIndex));
46350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v20.V4S(), v21.V4S(), v22.V4S(), v23.V4S(),
46360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          MemOperand(x17, 16, PostIndex));
46370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld4r(v24.V2D(), v25.V2D(), v26.V2D(), v27.V2D(),
46380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          MemOperand(x17, 32, PostIndex));
4639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0101010101010101, q0);
46440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0202020202020202, q1);
46450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0303030303030303, q2);
46460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0404040404040404, q3);
46470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0505050505050505, 0x0505050505050505, q4);
46480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0606060606060606, 0x0606060606060606, q5);
46490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0707070707070707, 0x0707070707070707, q6);
46500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0808080808080808, 0x0808080808080808, q7);
46510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0706070607060706, q8);
46520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0908090809080908, q9);
46530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0b0a0b0a0b0a0b0a, q10);
46540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0d0c0d0c0d0c0d0c, q11);
46550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0807080708070807, 0x0807080708070807, q12);
46560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0a090a090a090a09, 0x0a090a090a090a09, q13);
46570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0c0b0c0b0c0b0c0b, 0x0c0b0c0b0c0b0c0b, q14);
46580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0e0d0e0d0e0d0e0d, 0x0e0d0e0d0e0d0e0d, q15);
46590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1211100f1211100f, q16);
46600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1615141316151413, q17);
46610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1a1918171a191817, q18);
46620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x1e1d1c1b1e1d1c1b, q19);
46630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1312111013121110, 0x1312111013121110, q20);
46640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151417161514, 0x1716151417161514, q21);
46650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1b1a19181b1a1918, 0x1b1a19181b1a1918, q22);
46660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1f1e1d1c, 0x1f1e1d1c1f1e1d1c, q23);
46670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2726252423222120, 0x2726252423222120, q24);
46680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2f2e2d2c2b2a2928, q25);
46690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3736353433323130, 0x3736353433323130, q26);
46700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3f3e3d3c3b3a3938, q27);
46710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 64, x17);
4672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4676ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46770cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st1_lane) {
4678ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4679ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
46810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
46820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
46830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
46840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
46850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
4686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
46870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
46880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, -16);
46890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17));
4690ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
46920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St1(v0.B(), i, MemOperand(x17));
46930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 1);
46940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
46950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, x18));
4696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
46970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
46980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St1(v0.H(), i, MemOperand(x17));
46990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 2);
47000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, x18));
4702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
47030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
47040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St1(v0.S(), i, MemOperand(x17));
47050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 4);
47060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, x18));
47080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
47090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
47100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St1(v0.D(), i, MemOperand(x17));
47110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x17, x17, 8);
47120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x17, x18));
4714ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
4716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
4718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
47190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q1);
47200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q2);
47210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q3);
47220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q4);
4723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
4725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
4726ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
47280cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st2_lane) {
4729f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
4730f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
47310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Struct size * addressing modes * element sizes * vector size.
47320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t dst[2 * 2 * 4 * 16];
47330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  memset(dst, 0, sizeof(dst));
47340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
47350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
4736f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
47370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
47380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base);
47390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
47400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f);
4741f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
47420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test B stores with and without post index.
47430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
47440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St2(v0.B(), v1.B(), i, MemOperand(x18));
47450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x18, x18, 2);
47460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
47480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St2(v0.B(), v1.B(), i, MemOperand(x18, 2, PostIndex));
47490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 0 * 16));
47510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 1 * 16));
47520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x17, 2 * 16));
47530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x17, 3 * 16));
47540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
47550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test H stores with and without post index.
47560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 4);
47570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
47580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St2(v0.H(), v1.H(), i, MemOperand(x18));
47590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x18, x18, 4);
47600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
47620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St2(v0.H(), v1.H(), i, MemOperand(x18, x0, PostIndex));
47630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x17, 4 * 16));
47650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q7, MemOperand(x17, 5 * 16));
47660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x17, 6 * 16));
47670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x17, 7 * 16));
47680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
47690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test S stores with and without post index.
47700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
47710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St2(v0.S(), v1.S(), i, MemOperand(x18));
47720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x18, x18, 8);
47730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
47750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St2(v0.S(), v1.S(), i, MemOperand(x18, 8, PostIndex));
47760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
47770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x17, 8 * 16));
47780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x17, 9 * 16));
47790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x17, 10 * 16));
47800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x17, 11 * 16));
47810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
47820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test D stores with and without post index.
47830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 16);
47840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.D(), v1.D(), 1, MemOperand(x18));
47850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 16);
47860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.D(), v1.D(), 0, MemOperand(x18, 16, PostIndex));
47870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.D(), v1.D(), 1, MemOperand(x18, x0, PostIndex));
47880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.D(), v1.D(), 0, MemOperand(x18, x0, PostIndex));
47890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x17, 12 * 16));
47900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x17, 13 * 16));
47910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x17, 14 * 16));
47920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q25, MemOperand(x17, 15 * 16));
47930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
4794f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
47950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
4796f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
47970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1707160615051404, 0x1303120211011000, q2);
47980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f0f1e0e1d0d1c0c, 0x1b0b1a0a19091808, q3);
47990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1707160615051404, 0x1303120211011000, q4);
48000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f0f1e0e1d0d1c0c, 0x1b0b1a0a19091808, q5);
4801f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
48020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1617060714150405, 0x1213020310110001, q6);
48030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1e1f0e0f1c1d0c0d, 0x1a1b0a0b18190809, q7);
48040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1617060714150405, 0x1213020310110001, q16);
48050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1e1f0e0f1c1d0c0d, 0x1a1b0a0b18190809, q17);
4806f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
48070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1415161704050607, 0x1011121300010203, q18);
48080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1c1d1e1f0c0d0e0f, 0x18191a1b08090a0b, q19);
48090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1415161704050607, 0x1011121300010203, q20);
48100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1c1d1e1f0c0d0e0f, 0x18191a1b08090a0b, q21);
4811f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
48120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1011121314151617, 0x0001020304050607, q22);
48130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q23);
48140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1011121314151617, 0x0001020304050607, q22);
48150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q23);
4816f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4817f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
4818f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4819f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4820f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
48210cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st3_lane) {
4822f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
4823f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
48240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Struct size * addressing modes * element sizes * vector size.
48250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t dst[3 * 2 * 4 * 16];
48260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  memset(dst, 0, sizeof(dst));
48270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
4828f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
48290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
48300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
48310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base);
48320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
48330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f);
48340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f);
48350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
48360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test B stores with and without post index.
48370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
48380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St3(v0.B(), v1.B(), v2.B(), i, MemOperand(x18));
48390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x18, x18, 3);
48400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
48410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
48420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St3(v0.B(), v1.B(), v2.B(), i, MemOperand(x18, 3, PostIndex));
48430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
48440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 0 * 16));
48450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x17, 1 * 16));
48460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x17, 2 * 16));
48470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x17, 3 * 16));
48480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q7, MemOperand(x17, 4 * 16));
48490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x17, 5 * 16));
48500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
48510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test H stores with and without post index.
48520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 6);
48530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
48540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St3(v0.H(), v1.H(), v2.H(), i, MemOperand(x18));
48550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x18, x18, 6);
48560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
48570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
48580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St3(v0.H(), v1.H(), v2.H(), i, MemOperand(x18, x0, PostIndex));
48590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
48600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x17, 6 * 16));
48610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x17, 7 * 16));
48620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x17, 8 * 16));
48630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x17, 9 * 16));
48640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x17, 10 * 16));
48650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x17, 11 * 16));
48660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
48670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test S stores with and without post index.
48680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
48690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St3(v0.S(), v1.S(), v2.S(), i, MemOperand(x18));
48700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x18, x18, 12);
48710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
48720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
48730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St3(v0.S(), v1.S(), v2.S(), i, MemOperand(x18, 12, PostIndex));
48740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
48750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x17, 12 * 16));
48760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x17, 13 * 16));
48770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q25, MemOperand(x17, 14 * 16));
48780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q26, MemOperand(x17, 15 * 16));
48790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q27, MemOperand(x17, 16 * 16));
48800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q28, MemOperand(x17, 17 * 16));
48810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
48820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test D stores with and without post index.
48830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 24);
48840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.D(), v1.D(), v2.D(), 1, MemOperand(x18));
48850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 24);
48860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.D(), v1.D(), v2.D(), 0, MemOperand(x18, 24, PostIndex));
48870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.D(), v1.D(), v2.D(), 1, MemOperand(x18, x0, PostIndex));
48880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q29, MemOperand(x17, 18 * 16));
48890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q30, MemOperand(x17, 19 * 16));
48900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q31, MemOperand(x17, 20 * 16));
4891f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
4892f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4893f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
4894f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
48950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0524140423130322, 0x1202211101201000, q3);
48960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1a0a291909281808, 0x2717072616062515, q4);
48970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f1f0f2e1e0e2d1d, 0x0d2c1c0c2b1b0b2a, q5);
48980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0524140423130322, 0x1202211101201000, q6);
48990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1a0a291909281808, 0x2717072616062515, q7);
49000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f1f0f2e1e0e2d1d, 0x0d2c1c0c2b1b0b2a, q16);
49010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
49020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1415040522231213, 0x0203202110110001, q17);
49030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0a0b282918190809, 0x2627161706072425, q18);
49040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2f1e1f0e0f2c2d, 0x1c1d0c0d2a2b1a1b, q19);
49050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1415040522231213, 0x0203202110110001, q20);
49060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0a0b282918190809, 0x2627161706072425, q21);
49070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2f1e1f0e0f2c2d, 0x1c1d0c0d2a2b1a1b, q22);
49080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
49090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0405060720212223, 0x1011121300010203, q23);
49100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x18191a1b08090a0b, 0x2425262714151617, q24);
49110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2c2d2e2f1c1d1e1f, 0x0c0d0e0f28292a2b, q25);
49120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0405060720212223, 0x1011121300010203, q26);
49130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x18191a1b08090a0b, 0x2425262714151617, q27);
49140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2c2d2e2f1c1d1e1f, 0x0c0d0e0f28292a2b, q28);
49150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
4916f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
4917f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
4918f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
4919f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
49200cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st4_lane) {
4921ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
4922ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
49230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Struct size * element sizes * vector size.
49240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t dst[4 * 4 * 16];
49250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  memset(dst, 0, sizeof(dst));
49260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
49270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
4928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
49290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
49300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base);
49310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
49320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f);
49330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f);
49340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x2021222324252627, 0x28292a2b2c2d2e2f);
49350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
49360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test B stores without post index.
49370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
49380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St4(v0.B(), v1.B(), v2.B(), v3.B(), i, MemOperand(x18));
49390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x18, x18, 4);
49400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
49410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x17, 0 * 16));
49420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x17, 1 * 16));
49430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x17, 2 * 16));
49440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q7, MemOperand(x17, 3 * 16));
49450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
49460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test H stores with post index.
49470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 8);
49480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
49490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St4(v0.H(), v1.H(), v2.H(), v3.H(), i, MemOperand(x18, x0, PostIndex));
49500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
49510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x17, 4 * 16));
49520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x17, 5 * 16));
49530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x17, 6 * 16));
49540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x17, 7 * 16));
49550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
49560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test S stores without post index.
49570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
49580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St4(v0.S(), v1.S(), v2.S(), v3.S(), i, MemOperand(x18));
49590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(x18, x18, 16);
49600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
49610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x17, 8 * 16));
49620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x17, 9 * 16));
49630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x17, 10 * 16));
49640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x17, 11 * 16));
49650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
49660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test D stores with post index.
49670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 32);
49680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.D(), v1.D(), v2.D(), v3.D(), 0, MemOperand(x18, 32, PostIndex));
49690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.D(), v1.D(), v2.D(), v3.D(), 1, MemOperand(x18, x0, PostIndex));
49700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
49710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x17, 12 * 16));
49720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q25, MemOperand(x17, 13 * 16));
49730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q26, MemOperand(x17, 14 * 16));
49740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q27, MemOperand(x17, 15 * 16));
49750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
4976ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
49770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
4978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
49790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2323130322221202, 0x2121110120201000, q4);
49800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2727170726261606, 0x2525150524241404, q5);
49810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2b2b1b0b2a2a1a0a, 0x2929190928281808, q6);
49820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2f1f0f2e2e1e0e, 0x2d2d1d0d2c2c1c0c, q7);
4983ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
49840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2223222312130203, 0x2021202110110001, q16);
49850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2627262716170607, 0x2425242514150405, q17);
49860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2a2b2a2b1a1b0a0b, 0x2829282918190809, q18);
49870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2e2f2e2f1e1f0e0f, 0x2c2d2c2d1c1d0c0d, q19);
4988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
49890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2021222320212223, 0x1011121300010203, q20);
49900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2425262724252627, 0x1415161704050607, q21);
49910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x28292a2b28292a2b, 0x18191a1b08090a0b, q22);
49920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2c2d2e2f2c2d2e2f, 0x1c1d1e1f0c0d0e0f, q23);
4993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
49940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x18191a1b1c1d1e1f, 0x08090a0b0c0d0e0f, q24);
49950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x28292a2b2c2d2e2f, 0x28292a2b2c2d2e2f, q25);
49960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1011121314151617, 0x0001020304050607, q26);
49970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2021222324252627, 0x2021222324252627, q27);
4998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
4999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50030cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld1_lane_postindex) {
5004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
50070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
50080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
50090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
50100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
50110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5012ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
50130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
50140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
50150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
50160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base);
50170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, src_base);
50180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, src_base);
50190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, src_base);
50200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base);
5021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading whole register by element.
50230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
50240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld1(v0.B(), i, MemOperand(x17, 1, PostIndex));
50250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
5026ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
50280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld1(v1.H(), i, MemOperand(x18, 2, PostIndex));
50290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
5030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
50320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld1(v2.S(), i, MemOperand(x19, 4, PostIndex));
50330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
5034ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
50360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ld1(v3.D(), i, MemOperand(x20, 8, PostIndex));
50370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
5038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test loading a single element into an initialised register.
50400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 1);
50410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x21));
50420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v4.B(), 4, MemOperand(x21, x25, PostIndex));
50430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
50440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
50450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x22));
50460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v5.H(), 3, MemOperand(x22, x25, PostIndex));
50470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
50480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
50490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x23));
50500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v6.S(), 2, MemOperand(x23, x25, PostIndex));
50510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, 1);
50520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
50530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q7, MemOperand(x24));
50540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1(v7.D(), 1, MemOperand(x24, x25, PostIndex));
5055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q0);
50610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q1);
50620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q2);
50630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q3);
50640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050003020100, q4);
50650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0100050403020100, q5);
50660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c03020100, 0x0706050403020100, q6);
50670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0706050403020100, q7);
50680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 16, x17);
50690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 16, x18);
50700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 16, x19);
50710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 16, x20);
50720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 1, x21);
50730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2, x22);
50740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 3, x23);
50750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4, x24);
5076ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
50780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st1_lane_postindex) {
50820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
5083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
50850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
50860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
50870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
50880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
50910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
50920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, -16);
50930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17));
5094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
50950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 15; i >= 0; i--) {
50960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St1(v0.B(), i, MemOperand(x17, 1, PostIndex));
50970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
50980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, x18));
5099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
51000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 7; i >= 0; i--) {
51010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St1(v0.H(), i, MemOperand(x17, 2, PostIndex));
51020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
51030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, x18));
5104ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
51050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 3; i >= 0; i--) {
51060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St1(v0.S(), i, MemOperand(x17, 4, PostIndex));
51070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
51080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, x18));
5109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
51100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 1; i >= 0; i--) {
51110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ St1(v0.D(), i, MemOperand(x17, 8, PostIndex));
51120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
51130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x17, x18));
5114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5115ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
51190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x08090a0b0c0d0e0f, q1);
51200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q2);
51210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q3);
51220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q4);
5123f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
51240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
51250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5126f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5127f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
51280cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld1_alllanes) {
51290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
51300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
51310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
51320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
51330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
51340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
51350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5136f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5137f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
51380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
51390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v0.V8B(), MemOperand(x17));
51400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
51410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v1.V16B(), MemOperand(x17));
51420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
51430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v2.V4H(), MemOperand(x17));
51440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
51450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v3.V8H(), MemOperand(x17));
51460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
51470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v4.V2S(), MemOperand(x17));
51480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
51490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v5.V4S(), MemOperand(x17));
51500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
51510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v6.V1D(), MemOperand(x17));
51520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x17, 1);
51530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v7.V2D(), MemOperand(x17));
5154f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
5155f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5156f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
5157f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
51580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0101010101010101, q0);
51590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0202020202020202, 0x0202020202020202, q1);
51600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0403040304030403, q2);
51610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0504050405040504, 0x0504050405040504, q3);
51620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0807060508070605, q4);
51630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0908070609080706, 0x0908070609080706, q5);
51640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0e0d0c0b0a090807, q6);
51650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0f0e0d0c0b0a0908, q7);
5166f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
51670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
51680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5169f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5170f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
51710cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ld1_alllanes_postindex) {
51720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
51730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
51740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64];
51750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
51760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
51770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
51780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5179f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
51801123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
51810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base + 1);
51820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 1);
51830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v0.V8B(), MemOperand(x17, 1, PostIndex));
51840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v1.V16B(), MemOperand(x17, x18, PostIndex));
51850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v2.V4H(), MemOperand(x17, x18, PostIndex));
51860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v3.V8H(), MemOperand(x17, 2, PostIndex));
51870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v4.V2S(), MemOperand(x17, x18, PostIndex));
51880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v5.V4S(), MemOperand(x17, 4, PostIndex));
51890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ld1r(v6.V2D(), MemOperand(x17, 8, PostIndex));
5190f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
5191f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5192f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
5193f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
51940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0101010101010101, q0);
51950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0202020202020202, 0x0202020202020202, q1);
51960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0403040304030403, q2);
51970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0504050405040504, 0x0504050405040504, q3);
51980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0908070609080706, q4);
51990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0a0908070a090807, 0x0a0908070a090807, q5);
52000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1211100f0e0d0c0b, 0x1211100f0e0d0c0b, q6);
52010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 19, x17);
5202f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
52030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
52040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5205f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5206f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
52070cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st1_d) {
52080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
52090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
52100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[14 * kDRegSizeInBytes];
52110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
52120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
52130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
52140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5215f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
52161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
52170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
52180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
52190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
52200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
52210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 16, PostIndex));
52220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
5223f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
52240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V8B(), MemOperand(x17));
52250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d16, MemOperand(x17, 8, PostIndex));
5226f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
52270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V8B(), v1.V8B(), MemOperand(x17));
52280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x17, 16, PostIndex));
5229f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
52300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x17));
52310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d18, MemOperand(x17, 8, PostIndex));
52320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d19, MemOperand(x17, 8, PostIndex));
52330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d20, MemOperand(x17, 8, PostIndex));
52340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
52350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), MemOperand(x17));
52360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x17, 16, PostIndex));
52370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x17, 16, PostIndex));
52380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
52390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V1D(), v1.V1D(), v2.V1D(), v3.V1D(), MemOperand(x17));
52400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x17, 16, PostIndex));
52410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x17));
5242f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
5243f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
5244f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
5245f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
52460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q0);
52470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q1);
52480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q2);
52490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q3);
52500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0706050403020100, q16);
52510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x0706050403020100, q17);
52520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0706050403020100, q18);
52530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1716151413121110, q19);
52540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2726252423222120, q20);
52550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x0706050403020100, q21);
52560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3736353433323130, 0x2726252423222120, q22);
52570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x0706050403020100, q23);
52580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3736353433323130, 0x2726252423222120, q24);
5259ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5261ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5262ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
52640cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st1_d_postindex) {
5265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
52670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 14 * kDRegSizeInBytes];
52680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
52690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
52700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
52710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
52720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
52740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
52750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, -8);
52760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, -16);
52770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, -24);
52780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, -32);
52790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
52800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
52810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
52820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 16, PostIndex));
52830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
5284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
52850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V8B(), MemOperand(x17, 8, PostIndex));
52860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d16, MemOperand(x17, x18));
5287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
52880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V8B(), v1.V8B(), MemOperand(x17, 16, PostIndex));
52890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x17, x19));
5290ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
52910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x17, 24, PostIndex));
52920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d18, MemOperand(x17, x20));
52930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d19, MemOperand(x17, x19));
52940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d20, MemOperand(x17, x18));
5295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
52960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(),
52970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x17, 32, PostIndex));
52980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x17, x21));
52990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x17, x19));
5300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
53010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V1D(), v1.V1D(), v2.V1D(), v3.V1D(),
53020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x17, 32, PostIndex));
53030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x17, x21));
53040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x17, x19));
5305ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5307ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5308ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
53090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0706050403020100, q16);
53100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x0706050403020100, q17);
53110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0706050403020100, q18);
53120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x1716151413121110, q19);
53130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2726252423222120, q20);
53140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x0706050403020100, q21);
53150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3736353433323130, 0x2726252423222120, q22);
53160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x0706050403020100, q23);
53170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3736353433323130, 0x2726252423222120, q24);
5318ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
53190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
53200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
53230cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st1_q) {
53240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
53250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
53260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 160];
53270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
53280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
53290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
53300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5332ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
53330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
53340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
53350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
53360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
53370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 16, PostIndex));
53380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
53390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V16B(), MemOperand(x17));
53400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x17, 16, PostIndex));
53410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
53420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V8H(), v1.V8H(), MemOperand(x17));
53430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x17, 16, PostIndex));
53440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x17, 16, PostIndex));
53450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
53460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x17));
53470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x17, 16, PostIndex));
53480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x17, 16, PostIndex));
53490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x17, 16, PostIndex));
53500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
53510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x17));
53520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x17, 16, PostIndex));
53530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x17, 16, PostIndex));
53540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x17, 16, PostIndex));
53550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q25, MemOperand(x17));
5356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5357ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5358ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
53600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q16);
53610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q17);
53620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q18);
53630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q19);
53640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q20);
53650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q21);
53660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q22);
53670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q23);
53680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q24);
53690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q25);
5370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
53710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
53720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
53750cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st1_q_postindex) {
53760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
53770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
53780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[64 + 160];
53790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
53800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
53810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
53820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5383ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5384ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
53850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
53860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, -16);
53870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, -32);
53880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, -48);
53890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, -64);
53900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
53910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
53920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
53930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 16, PostIndex));
53940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
53950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V16B(), MemOperand(x17, 16, PostIndex));
53960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q16, MemOperand(x17, x18));
53970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
53980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V8H(), v1.V8H(), MemOperand(x17, 32, PostIndex));
53990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q17, MemOperand(x17, x19));
54000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q18, MemOperand(x17, x18));
54010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
54020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x17, 48, PostIndex));
54030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q19, MemOperand(x17, x20));
54040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q20, MemOperand(x17, x19));
54050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q21, MemOperand(x17, x18));
54060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
54070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St1(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(),
54080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x17, 64, PostIndex));
54090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q22, MemOperand(x17, x21));
54100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q23, MemOperand(x17, x20));
54110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q24, MemOperand(x17, x19));
54120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q25, MemOperand(x17, x18));
54130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5414ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5415ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5416ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q16);
54190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q17);
54200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q18);
54210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q19);
54220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q20);
54230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q21);
54240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q22);
54250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x1716151413121110, q23);
54260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726252423222120, q24);
54270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323130, q25);
5428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5430ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5432ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54330cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st2_d) {
5434ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5435ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[4*16];
54370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
54380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
54390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
54400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
54430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
54440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
54450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
54460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
5447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V8B(), v1.V8B(), MemOperand(x18));
54490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 22);
54500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V4H(), v1.V4H(), MemOperand(x18));
54510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 11);
54520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V2S(), v1.V2S(), MemOperand(x18));
5453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
54550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
54560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
54570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
54580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
5459ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5460ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5461ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5463ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1707160615051404, 0x1303120211011000, q0);
54650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0504131203021110, 0x0100151413121110, q1);
54660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1615140706050413, 0x1211100302010014, q2);
54670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736353433323117, q3);
5468ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5471ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
54730cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st2_d_postindex) {
5474ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5475ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[4*16];
54770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
54780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
54790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
54800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
54810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
54830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 5);
54840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
54850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
54860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
54870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
5488ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V8B(), v1.V8B(), MemOperand(x18, x22, PostIndex));
54900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V4H(), v1.V4H(), MemOperand(x18, 16, PostIndex));
54910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V2S(), v1.V2S(), MemOperand(x18));
5492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
54940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
54950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
54960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
54970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
54980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5499ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1405041312030211, 0x1001000211011000, q0);
55040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0605041312111003, 0x0201001716070615, q1);
55050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2f2e2d2c2b2a2928, 0x2726251716151407, q2);
5506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
55080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55110cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st2_q) {
55120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
55130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
55140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[5*16];
55150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
55160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
55170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
55180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
55210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
55220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
55230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
55240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
55250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
55260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V16B(), v1.V16B(), MemOperand(x18));
55270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 8);
55280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V8H(), v1.V8H(), MemOperand(x18));
55290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 22);
55300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V4S(), v1.V4S(), MemOperand(x18));
55310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 2);
55320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V2D(), v1.V2D(), MemOperand(x18));
55330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
55340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
55350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
55360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
55370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
55380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
55390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1312030211100100, 0x1303120211011000, q0);
55450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x01000b0a19180908, 0x1716070615140504, q1);
55460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1716151413121110, 0x0706050403020100, q2);
55470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d1c1b1a1918, 0x0f0e0d0c0b0a0908, q3);
55480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
55490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55520cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st2_q_postindex) {
55530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
5554ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[5*16];
55560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
55570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
55580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
55590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5560ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5561ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
55620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 5);
55630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
55640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
55650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
55660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
5567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V16B(), v1.V16B(), MemOperand(x18, x22, PostIndex));
55690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V8H(), v1.V8H(), MemOperand(x18, 32, PostIndex));
55700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V4S(), v1.V4S(), MemOperand(x18, x22, PostIndex));
55710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St2(v0.V2D(), v1.V2D(), MemOperand(x18));
5572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
55740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
55750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
55760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
55770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
55780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x19, 16, PostIndex));
5579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5583ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1405041312030211, 0x1001000211011000, q0);
55850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1c0d0c1b1a0b0a19, 0x1809081716070615, q1);
55860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0504030201001003, 0x0201001f1e0f0e1d, q2);
55870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0d0c0b0a09081716, 0x1514131211100706, q3);
55880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4f4e4d4c4b4a1f1e, 0x1d1c1b1a19180f0e, q4);
5589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
55910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
55940cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st3_d) {
55950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
55960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
55970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[3*16];
55980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
55990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
56000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
56010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5602ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5603ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
56040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
56050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
56060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
56070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
56080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
5609ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x18));
56110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 3);
56120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x18));
56130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 2);
56140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V2S(), v1.V2S(), v2.V2S(), MemOperand(x18));
5615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5616ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
56180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
56190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
56200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2221201312111003, 0x0201000100201000, q0);
56260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1f1e1d2726252417, 0x1615140706050423, q1);
5627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
56290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56320cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st3_d_postindex) {
56330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
56340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
56350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[4*16];
56360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
56370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
56380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
56390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5640ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
56420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 5);
56430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
56440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
56450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
56460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
56470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
5648ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V8B(), v1.V8B(), v2.V8B(), MemOperand(x18, x22, PostIndex));
56500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V4H(), v1.V4H(), v2.V4H(), MemOperand(x18, 24, PostIndex));
56510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V2S(), v1.V2S(), v2.V2S(), MemOperand(x18));
5652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
56550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
56560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
56570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
56580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
56590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0);
56650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0201002726171607, 0x0625241514050423, q1);
56660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1615140706050423, 0x2221201312111003, q2);
56670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b3a3938, 0x3736352726252417, q3);
5668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56730cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st3_q) {
5674ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[6*16];
56770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
56780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
56790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
56800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
56810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
56830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
56840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
56850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
56860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
56870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
56880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
56890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V16B(), v1.V16B(), v2.V16B(), MemOperand(x18));
56900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 5);
56910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V8H(), v1.V8H(), v2.V8H(), MemOperand(x18));
56920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 12);
56930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x18));
56940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 22);
56950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V2D(), v1.V2D(), v2.V2D(), MemOperand(x18));
5696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
56970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
56980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
56990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
57000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
57010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
57020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x19, 16, PostIndex));
57030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x19, 16, PostIndex));
5704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
5706ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
5708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0);
57100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0605042322212013, 0x1211100302010023, q1);
57110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1007060504030201, 0x0025241716151407, q2);
57120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0827262524232221, 0x2017161514131211, q3);
57130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x281f1e1d1c1b1a19, 0x180f0e0d0c0b0a09, q4);
57140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x5f5e5d5c5b5a5958, 0x572f2e2d2c2b2a29, q5);
5715ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
57170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
5718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57200cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st3_q_postindex) {
57210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
57220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
57230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[7*16];
57240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
57250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
57260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
57270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
57280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
57290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
57300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 5);
57310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
57320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
57330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
57340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
57350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
57360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
57370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V16B(), v1.V16B(), v2.V16B(), MemOperand(x18, x22, PostIndex));
57380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V8H(), v1.V8H(), v2.V8H(), MemOperand(x18, 48, PostIndex));
57390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V4S(), v1.V4S(), v2.V4S(), MemOperand(x18, x22, PostIndex));
57400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St3(v0.V2D(), v1.V2D(), v2.V2D(), MemOperand(x18));
57410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
57420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
57430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
57440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
57450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
57460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
57470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x19, 16, PostIndex));
57480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x19, 16, PostIndex));
57490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x19, 16, PostIndex));
5750ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2213120302212011, 0x1001001101201000, q0);
57560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1809082726171607, 0x0625241514050423, q1);
57570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0e2d2c1d1c0d0c2b, 0x2a1b1a0b0a292819, q2);
57580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0504030201001003, 0x0201002f2e1f1e0f, q3);
57590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2524232221201716, 0x1514131211100706, q4);
57600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1d1c1b1a19180f0e, 0x0d0c0b0a09082726, q5);
57610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x6f6e6d6c6b6a2f2e, 0x2d2c2b2a29281f1e, q6);
5762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5765ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5766ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57670cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st4_d) {
5768ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[4*16];
57710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
57720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
57730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
57740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
57770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
57780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
57790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
57800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
57810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
57820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 16, PostIndex));
5783ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(), MemOperand(x18));
57850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 12);
57860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V4H(), v1.V4H(), v2.V4H(), v3.V4H(), MemOperand(x18));
57870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 15);
57880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(), MemOperand(x18));
5789ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5790ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
57910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
57920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
57930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
57940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
57950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
5796ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1110010032221202, 0X3121110130201000, q0);
58020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1003020100322322, 0X1312030231302120, q1);
58030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1407060504333231, 0X3023222120131211, q2);
58040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f3e3d3c3b373635, 0x3427262524171615, q3);
5805ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5806ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5807ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5808ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5809ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58100cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st4_d_postindex) {
5811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[5*16];
58140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
58150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
58160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
58170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
5818ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
58200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 5);
58210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
58220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
58230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
58240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
58250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
58260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 16, PostIndex));
5827ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V8B(), v1.V8B(), v2.V8B(), v3.V8B(),
58290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18, x22, PostIndex));
58300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V4H(), v1.V4H(), v2.V4H(), v3.V4H(),
58310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18, 32, PostIndex));
58320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V2S(), v1.V2S(), v2.V2S(), v3.V2S(),
58330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18));
5834578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5835578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
58360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
58370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
58380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
58390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
58400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
58410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x19, 16, PostIndex));
5842578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5843ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5844ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5845ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5846ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0);
58480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1607063534252415, 0x1405043332232213, q1);
58490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2221201312111003, 0x0201003736272617, q2);
58500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2625241716151407, 0x0605043332313023, q3);
58510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4f4e4d4c4b4a4948, 0x4746453736353427, q4);
5852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5855ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58570cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st4_q) {
5858ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5859ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[7*16];
58610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
58620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
58630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
58640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
58650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
58670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
58680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
58690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
58700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
58710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
58720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 16, PostIndex));
58730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
58740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V16B(), v1.V16B(), v2.V16B(), v3.V16B(), MemOperand(x18));
58750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 5);
58760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V8H(), v1.V8H(), v2.V8H(), v3.V8H(), MemOperand(x18));
58770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 12);
58780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V4S(), v1.V4S(), v2.V4S(), v3.V4S(), MemOperand(x18));
58790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 22);
58800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x18));
58810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, 10);
5882ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
58840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
58850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
58860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
58870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
58880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x19, 16, PostIndex));
58890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x19, 16, PostIndex));
58900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x19, 16, PostIndex));
5891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5895ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
58960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0);
58970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3231302322212013, 0x1211100302010013, q1);
58980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1007060504030201, 0x0015140706050433, q2);
58990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3027262524232221, 0x2017161514131211, q3);
59000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x180f0e0d0c0b0a09, 0x0837363534333231, q4);
59010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x382f2e2d2c2b2a29, 0x281f1e1d1c1b1a19, q5);
59020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x6f6e6d6c6b6a6968, 0x673f3e3d3c3b3a39, q6);
5903ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5905ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5906ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5907ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59080cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_st4_q_postindex) {
5909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
5910ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t src[9*16];
59120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < sizeof(src); i++) {
59130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    src[i] = i;
59140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
59150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
59160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
5917ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
59180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 5);
59190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
59200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base);
59210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x17, 16, PostIndex));
59220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x17, 16, PostIndex));
59230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x17, 16, PostIndex));
59240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x17, 16, PostIndex));
59250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
59260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V16B(), v1.V16B(), v2.V16B(), v3.V16B(),
59270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18, x22, PostIndex));
59280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V8H(), v1.V8H(), v2.V8H(), v3.V8H(),
59290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18, 64, PostIndex));
59300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V4S(), v1.V4S(), v2.V4S(), v3.V4S(),
59310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18, x22, PostIndex));
59320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ St4(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(),
59330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl         MemOperand(x18));
5934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base);
59360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q0, MemOperand(x19, 16, PostIndex));
59370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q1, MemOperand(x19, 16, PostIndex));
59380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, MemOperand(x19, 16, PostIndex));
59390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q3, MemOperand(x19, 16, PostIndex));
59400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x19, 16, PostIndex));
59410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q5, MemOperand(x19, 16, PostIndex));
59420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, MemOperand(x19, 16, PostIndex));
59430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q7, MemOperand(x19, 16, PostIndex));
59440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q8, MemOperand(x19, 16, PostIndex));
5945ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
5947ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
5949ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1203023130212011, 0x1001000130201000, q0);
59510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1607063534252415, 0x1405043332232213, q1);
59520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1a0b0a3938292819, 0x1809083736272617, q2);
59530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1e0f0e3d3c2d2c1d, 0x1c0d0c3b3a2b2a1b, q3);
59540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0504030201001003, 0x0201003f3e2f2e1f, q4);
59550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2524232221201716, 0x1514131211100706, q5);
59560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0d0c0b0a09083736, 0x3534333231302726, q6);
59570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x2d2c2b2a29281f1e, 0x1d1c1b1a19180f0e, q7);
59580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8f8e8d8c8b8a3f3e, 0x3d3c3b3a39382f2e, q8);
5959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
59610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
59620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
59630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
59640cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_float) {
59650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
59660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
59670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float src[2] = {1.0, 2.0};
59680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float dst[3] = {0.0, 0.0, 0.0};
59690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
59700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
59710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
59720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
59730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
59740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
59750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(s31, s0, MemOperand(x16, 2 * sizeof(src[0]), PostIndex));
59760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(s0, s31, MemOperand(x17, sizeof(dst[1]), PreIndex));
5977ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
5978ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5979ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
5980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s31);
59820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s0);
59830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, dst[0]);
59840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, dst[1]);
59850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, dst[2]);
59860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x16);
59870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[1]), x17);
5988ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
5990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
5991ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
5992ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
59930cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_double) {
5994ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
59950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
59960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double src[2] = {1.0, 2.0};
59970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double dst[3] = {0.0, 0.0, 0.0};
59980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
59990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
6000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6001ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
60020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
60030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
60040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(d31, d0, MemOperand(x16, 2 * sizeof(src[0]), PostIndex));
60050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(d0, d31, MemOperand(x17, sizeof(dst[1]), PreIndex));
60060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
6007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
60080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
6009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
60100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d31);
60110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d0);
60120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, dst[0]);
60130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, dst[1]);
60140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, dst[2]);
60150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 2 * sizeof(src[0]), x16);
60160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + sizeof(dst[1]), x17);
6017578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
60180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
60190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6020ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6021578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
60220cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_quad) {
60230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
60240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
60250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[4] = {0x0123456789abcdef, 0xaaaaaaaa55555555,
60260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0xfedcba9876543210, 0x55555555aaaaaaaa};
60270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[6] = {0, 0, 0, 0, 0, 0};
60280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
60290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
6030578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
60310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
60320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
60330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
60340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(q31, q0, MemOperand(x16, 4 * sizeof(src[0]), PostIndex));
60350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(q0, q31, MemOperand(x17, 2 * sizeof(dst[1]), PreIndex));
6036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6037ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6038ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6039ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
60400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xaaaaaaaa55555555, 0x0123456789abcdef, q31);
60410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55555555aaaaaaaa, 0xfedcba9876543210, q0);
60420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, dst[0]);
60430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, dst[1]);
60440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba9876543210, dst[2]);
60450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x55555555aaaaaaaa, dst[3]);
60460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0123456789abcdef, dst[4]);
60470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xaaaaaaaa55555555, dst[5]);
60480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4 * sizeof(src[0]), x16);
60490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 2 * sizeof(dst[1]), x17);
6050ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6052ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6053ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6054ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
60550cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_offset) {
6056f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
6057f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
60580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff,
60590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0xffeeddccbbaa9988};
60600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0};
60610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
60620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
6063f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
60640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
60650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
60660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
60670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 24);
60680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, dst_base + 56);
60690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w0, w1, MemOperand(x16));
60700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w2, w3, MemOperand(x16, 4));
60710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8));
60720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w6, w7, MemOperand(x18, -12));
60730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x8, x9, MemOperand(x18, -16));
60740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w0, w1, MemOperand(x17));
60750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w2, w3, MemOperand(x17, 8));
60760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x4, x5, MemOperand(x17, 16));
60770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w6, w7, MemOperand(x19, -24));
60780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x8, x9, MemOperand(x19, -16));
6079f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
6080f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6081f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
6082f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
60830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
60840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
60850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[0]);
60860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
60870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
60880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff00112233, dst[1]);
60890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x4);
60900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[2]);
60910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x5);
60920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[3]);
60930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabb, x6);
60940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbbaa9988, x7);
60950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbbaa99888899aabb, dst[4]);
60960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x8);
60970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[5]);
60980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x9);
60990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[6]);
61000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x16);
61010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x17);
61020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 24, x18);
61030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 56, x19);
6104f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6105f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
6106f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
6107f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6108f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
61090cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_offset_wide) {
6110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
61120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff,
61130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0xffeeddccbbaa9988};
61140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[7] = {0, 0, 0, 0, 0, 0, 0};
61150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
61160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
61170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Move base too far from the array to force multiple instructions
61180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // to be emitted.
61190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int64_t base_offset = 1024;
6120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6121ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
61220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base - base_offset);
61230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, dst_base - base_offset);
61240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + base_offset + 24);
61250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, dst_base + base_offset + 56);
61260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w0, w1, MemOperand(x20, base_offset));
61270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w2, w3, MemOperand(x20, base_offset + 4));
61280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x4, x5, MemOperand(x20, base_offset + 8));
61290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w6, w7, MemOperand(x18, -12 - base_offset));
61300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x8, x9, MemOperand(x18, -16 - base_offset));
61310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w0, w1, MemOperand(x21, base_offset));
61320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w2, w3, MemOperand(x21, base_offset + 8));
61330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x4, x5, MemOperand(x21, base_offset + 16));
61340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w6, w7, MemOperand(x19, -24 - base_offset));
61350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x8, x9, MemOperand(x19, -16 - base_offset));
6136ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6137ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6138ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6139ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
61400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
61410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
61420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[0]);
61430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
61440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
61450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff00112233, dst[1]);
61460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x4);
61470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[2]);
61480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x5);
61490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[3]);
61500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabb, x6);
61510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbbaa9988, x7);
61520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbbaa99888899aabb, dst[4]);
61530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x8);
61540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[5]);
61550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x9);
61560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[6]);
61570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base - base_offset, x20);
61580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base - base_offset, x21);
61590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + base_offset + 24, x18);
61600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + base_offset + 56, x19);
6161ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6162ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6163ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6164ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
61660cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldnp_stnp_offset) {
6167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
61690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[4] = {0x0011223344556677, 0x8899aabbccddeeff,
61700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0xffeeddccbbaa9988, 0x7766554433221100};
61710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
61720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
61730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
6174ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6175ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
61760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
61770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
61780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 24);
61790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, dst_base + 64);
61800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, src_base + 32);
6181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
61820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Ensure address set up has happened before executing non-temporal ops.
61830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(InnerShareable, BarrierAll);
6184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
61850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(w0, w1, MemOperand(x16));
61860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(w2, w3, MemOperand(x16, 4));
61870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(x4, x5, MemOperand(x16, 8));
61880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(w6, w7, MemOperand(x18, -12));
61890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(x8, x9, MemOperand(x18, -16));
61900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(q16, q17, MemOperand(x16));
61910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(q19, q18, MemOperand(x20, -32));
61920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(w0, w1, MemOperand(x17));
61930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(w2, w3, MemOperand(x17, 8));
61940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(x4, x5, MemOperand(x17, 16));
61950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(w6, w7, MemOperand(x19, -32));
61960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(x8, x9, MemOperand(x19, -24));
61970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(q17, q16, MemOperand(x19));
61980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(q18, q19, MemOperand(x19, 32));
6199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
62030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
62040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
62050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[0]);
62060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
62070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
62080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff00112233, dst[1]);
62090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x4);
62100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[2]);
62110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x5);
62120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[3]);
62130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabb, x6);
62140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbbaa9988, x7);
62150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbbaa99888899aabb, dst[4]);
62160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x8);
62170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[5]);
62180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x9);
62190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[6]);
62200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8899aabbccddeeff, 0x0011223344556677, q16);
62210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7766554433221100, 0xffeeddccbbaa9988, q17);
62220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7766554433221100, 0xffeeddccbbaa9988, q18);
62230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8899aabbccddeeff, 0x0011223344556677, q19);
62240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[8]);
62250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7766554433221100, dst[9]);
62260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[10]);
62270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[11]);
62280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[12]);
62290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7766554433221100, dst[13]);
62300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[14]);
62310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[15]);
62320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x16);
62330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x17);
62340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 24, x18);
62350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 64, x19);
62360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 32, x20);
6237ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6238ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6239ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6241ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
62420cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldnp_stnp_offset_float) {
6243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
62450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float src[3] = {1.2, 2.3, 3.4};
62460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float dst[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
62470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
62480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
6249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
62510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
62520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
62530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 12);
62540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, dst_base + 24);
6255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
62560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Ensure address set up has happened before executing non-temporal ops.
62570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(InnerShareable, BarrierAll);
6258ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
62590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(s0, s1, MemOperand(x16));
62600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(s2, s3, MemOperand(x16, 4));
62610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(s5, s4, MemOperand(x18, -8));
62620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(s1, s0, MemOperand(x17));
62630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(s3, s2, MemOperand(x17, 8));
62640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(s4, s5, MemOperand(x19, -8));
6265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6267ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
62690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.2, s0);
62700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.3, s1);
62710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.3, dst[0]);
62720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.2, dst[1]);
62730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.3, s2);
62740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(3.4, s3);
62750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(3.4, dst[2]);
62760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.3, dst[3]);
62770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(3.4, s4);
62780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.3, s5);
62790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(3.4, dst[4]);
62800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.3, dst[5]);
62810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x16);
62820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x17);
62830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 12, x18);
62840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 24, x19);
6285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6286ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6287ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6288ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6289ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
62900cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldnp_stnp_offset_double) {
6291ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6292ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
62930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double src[3] = {1.2, 2.3, 3.4};
62940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double dst[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
62950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
62960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
6297ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
62990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
63000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
63010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, src_base + 24);
63020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, dst_base + 48);
6303ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Ensure address set up has happened before executing non-temporal ops.
63050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(InnerShareable, BarrierAll);
6306ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(d0, d1, MemOperand(x16));
63080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(d2, d3, MemOperand(x16, 8));
63090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldnp(d5, d4, MemOperand(x18, -16));
63100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(d1, d0, MemOperand(x17));
63110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(d3, d2, MemOperand(x17, 16));
63120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stnp(d4, d5, MemOperand(x19, -16));
6313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6315ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6316ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.2, d0);
63180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.3, d1);
63190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.3, dst[0]);
63200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.2, dst[1]);
63210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.3, d2);
63220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(3.4, d3);
63230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(3.4, dst[2]);
63240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.3, dst[3]);
63250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(3.4, d4);
63260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.3, d5);
63270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(3.4, dst[4]);
63280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.3, dst[5]);
63290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x16);
63300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x17);
63310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 24, x18);
63320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 48, x19);
6333ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6334ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6335ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6337ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63380cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_preindex) {
6339ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff,
63420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0xffeeddccbbaa9988};
63430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
63440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
63450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
6346ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
63480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
63490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
63500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base + 16);
63510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w0, w1, MemOperand(x16, 4, PreIndex));
63520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, x16);
63530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w2, w3, MemOperand(x16, -4, PreIndex));
63540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w2, w3, MemOperand(x17, 4, PreIndex));
63550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, x17);
63560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w0, w1, MemOperand(x17, -4, PreIndex));
63570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8, PreIndex));
63580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, x16);
63590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x6, x7, MemOperand(x16, -8, PreIndex));
63600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x7, x6, MemOperand(x18, 8, PreIndex));
63610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, x18);
63620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x5, x4, MemOperand(x18, -8, PreIndex));
6363ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6364ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6365ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6366ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x0);
63680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff, x1);
63690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x44556677, x2);
63700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x3);
63710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff00112233, dst[0]);
63720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000112233, dst[1]);
63730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x4);
63740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x5);
63750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, x6);
63760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x7);
63770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[2]);
63780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[3]);
63790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[4]);
63800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x16);
63810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x17);
63820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 16, x18);
63830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4, x19);
63840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 4, x20);
63850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 8, x21);
63860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 24, x22);
6387ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6388ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6389ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6390ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6391ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63920cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_preindex_wide) {
6393ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6394ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
63950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[3] = {0x0011223344556677, 0x8899aabbccddeeff,
63960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0xffeeddccbbaa9988};
63970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
63980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
63990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
64000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Move base too far from the array to force multiple instructions
64010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // to be emitted.
64020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int64_t base_offset = 1024;
6403ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
64040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
64050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base - base_offset);
64060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, dst_base + base_offset);
64070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base + base_offset + 16);
64080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w0, w1, MemOperand(x24, base_offset + 4, PreIndex));
64090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, x24);
64100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base - base_offset + 4);
64110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w2, w3, MemOperand(x24, base_offset - 4, PreIndex));
64120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w2, w3, MemOperand(x25, 4 - base_offset , PreIndex));
64130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, x25);
64140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, dst_base + base_offset + 4);
64150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base - base_offset);
64160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w0, w1, MemOperand(x25, -4 - base_offset, PreIndex));
64170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x4, x5, MemOperand(x24, base_offset + 8, PreIndex));
64180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, x24);
64190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base - base_offset + 8);
64200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x6, x7, MemOperand(x24, base_offset - 8, PreIndex));
64210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x7, x6, MemOperand(x18, 8 - base_offset, PreIndex));
64220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, x18);
64230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base + base_offset + 16 + 8);
64240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x5, x4, MemOperand(x18, -8 - base_offset, PreIndex));
6425ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6426ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6428ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
64290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x0);
64300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff, x1);
64310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x44556677, x2);
64320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x3);
64330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff00112233, dst[0]);
64340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000112233, dst[1]);
64350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x4);
64360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x5);
64370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, x6);
64380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x7);
64390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[2]);
64400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[3]);
64410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[4]);
64420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x24);
64430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x25);
64440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 16, x18);
64450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4, x19);
64460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 4, x20);
64470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 8, x21);
64480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 24, x22);
6449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6450ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6452ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6453ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
64540cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_postindex) {
6455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
64570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[4] = {0x0011223344556677, 0x8899aabbccddeeff,
64580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0xffeeddccbbaa9988, 0x7766554433221100};
64590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
64600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
64610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
6462ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
64630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
64640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, src_base);
64650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, dst_base);
64660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base + 16);
64670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w0, w1, MemOperand(x16, 4, PostIndex));
64680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, x16);
64690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w2, w3, MemOperand(x16, -4, PostIndex));
64700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w2, w3, MemOperand(x17, 4, PostIndex));
64710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, x17);
64720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w0, w1, MemOperand(x17, -4, PostIndex));
64730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x4, x5, MemOperand(x16, 8, PostIndex));
64740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, x16);
64750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x6, x7, MemOperand(x16, -8, PostIndex));
64760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x7, x6, MemOperand(x18, 8, PostIndex));
64770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, x18);
64780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x5, x4, MemOperand(x18, -8, PostIndex));
6479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6480ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
64830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
64840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
64850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
64860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
64870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x4455667700112233, dst[0]);
64880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000112233, dst[1]);
64890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, x4);
64900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x5);
64910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x6);
64920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x7);
64930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[2]);
64940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[3]);
64950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[4]);
64960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x16);
64970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x17);
64980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 16, x18);
64990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 4, x19);
65000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 4, x20);
65010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 8, x21);
65020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 24, x22);
6503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6506ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6507ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65080cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_stp_postindex_wide) {
6509ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6510ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[4] = {0x0011223344556677, 0x8899aabbccddeeff,
65120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     0xffeeddccbbaa9988, 0x7766554433221100};
65130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t dst[5] = {0, 0, 0, 0, 0};
65140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
65150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
65160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Move base too far from the array to force multiple instructions
65170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // to be emitted.
65180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int64_t base_offset = 1024;
6519ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
65210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base);
65220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, dst_base);
65230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base + 16);
65240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w0, w1, MemOperand(x24, base_offset + 4, PostIndex));
65250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, x24);
65260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x24, x24, base_offset);
65270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(w2, w3, MemOperand(x24, base_offset - 4, PostIndex));
65280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w2, w3, MemOperand(x25, 4 - base_offset, PostIndex));
65290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, x25);
65300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x24, x24, base_offset);
65310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x25, x25, base_offset);
65320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(w0, w1, MemOperand(x25, -4 - base_offset, PostIndex));
65330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x4, x5, MemOperand(x24, base_offset + 8, PostIndex));
65340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, x24);
65350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x24, x24, base_offset);
65360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldp(x6, x7, MemOperand(x24, base_offset - 8, PostIndex));
65370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x7, x6, MemOperand(x18, 8 - base_offset, PostIndex));
65380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, x18);
65390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x18, base_offset);
65400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stp(x5, x4, MemOperand(x18, -8 - base_offset, PostIndex));
6541ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6543ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x44556677, x0);
65460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x1);
65470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00112233, x2);
65480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xccddeeff, x3);
65490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x4455667700112233, dst[0]);
65500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000112233, dst[1]);
65510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, x4);
65520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x5);
65530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, x6);
65540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, x7);
65550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffeeddccbbaa9988, dst[2]);
65560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8899aabbccddeeff, dst[3]);
65570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0011223344556677, dst[4]);
65580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + base_offset, x24);
65590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base - base_offset, x25);
65600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base - base_offset + 16, x18);
65610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + base_offset + 4, x19);
65620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base - base_offset + 4, x20);
65630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + base_offset + 8, x21);
65640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base - base_offset + 24, x22);
6565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6569ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65700cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldp_sign_extend) {
6571ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6572ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t src[2] = {0x80000000, 0x7fffffff};
65740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
65750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6576ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
65770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, src_base);
65780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldpsw(x0, x1, MemOperand(x24));
6579ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6580ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6581ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6582ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff80000000, x0);
65840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000000007fffffff, x1);
6585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6586ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6587ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6589ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65900cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldur_stur) {
6591ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6592ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
65930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t src[2] = {0x0123456789abcdef, 0x0123456789abcdef};
65940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t dst[5] = {0, 0, 0, 0, 0};
65950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
65960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
65970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
65990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
66000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base);
66010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, src_base + 16);
66020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, dst_base + 32);
66030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, dst_base + 40);
66040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(w0, MemOperand(x17, 1));
66050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(w0, MemOperand(x18, 2));
66060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(x1, MemOperand(x17, 3));
66070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(x1, MemOperand(x18, 9));
66080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(w2, MemOperand(x19, -9));
66090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(w2, MemOperand(x20, -5));
66100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldrb(w3, MemOperand(x19, -1));
66110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Strb(w3, MemOperand(x21, -1));
6612ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6613ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6614ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6615ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
66160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x6789abcd, x0);
66170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00006789abcd0000, dst[0]);
66180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xabcdef0123456789, x1);
66190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xcdef012345678900, dst[1]);
66200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000000ab, dst[2]);
66210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xabcdef01, x2);
66220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00abcdef01000000, dst[3]);
66230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00000001, x3);
66240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0100000000000000, dst[4]);
66250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base, x17);
66260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base, x18);
66270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(src_base + 16, x19);
66280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(dst_base + 32, x20);
6629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6631ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6632ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6633ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
66340cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldur_stur_fp) {
6635ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
66370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t src[3] = {0x0123456789abcdef, 0x0123456789abcdef,
66380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                    0x0123456789abcdef};
66390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t dst[5] = {0, 0, 0, 0, 0};
66400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t src_base = reinterpret_cast<uintptr_t>(src);
66410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t dst_base = reinterpret_cast<uintptr_t>(dst);
66420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
66440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, src_base);
66450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, dst_base);
66460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(b0, MemOperand(x17));
66470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(b0, MemOperand(x18));
66480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(h1, MemOperand(x17, 1));
66490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(h1, MemOperand(x18, 1));
66500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(s2, MemOperand(x17, 2));
66510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(s2, MemOperand(x18, 3));
66520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d3, MemOperand(x17, 3));
66530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(d3, MemOperand(x18, 7));
66540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q4, MemOperand(x17, 4));
66550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(q4, MemOperand(x18, 15));
66560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
6657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
66580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
6659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
66600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xef, q0);
66610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xabcd, q1);
66620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x456789ab, q2);
66630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xabcdef0123456789, q3);
66640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x89abcdef01234567, 0x89abcdef01234567, q4);
66650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x89456789ababcdef, dst[0]);
66660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x67abcdef01234567, dst[1]);
66670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x6789abcdef012345, dst[2]);
66680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0089abcdef012345, dst[3]);
6669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
66700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
66710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
66740cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal) {
66750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
66760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
66770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
66780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(x2, 0x1234567890abcdef);
66790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(w3, 0xfedcba09);
66800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldrsw(x4, 0x7fffffff);
66810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldrsw(x5, 0x80000000);
66820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q11, 0x1234000056780000, 0xabcd0000ef000000);
66830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d13, 1.234);
66840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(s25, 2.5);
66850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
66860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
66870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
66880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
66890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x2);
66900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba09, x3);
66910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
66920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff80000000, x5);
66930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1234000056780000, 0xabcd0000ef000000, q11);
66940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.234, d13);
66950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5, s25);
6696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6698ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6700ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67010cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal_range) {
6702ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6703ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6704ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
67050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Make sure the pool is empty;
67060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  masm.EmitLiteralPool(LiteralPool::kBranchRequired);
67070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_LITERAL_POOL_SIZE(0);
6708ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Create some literal pool entries.
67100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(x0, 0x1234567890abcdef);
67110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(w1, 0xfedcba09);
67120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldrsw(x2, 0x7fffffff);
67130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldrsw(x3, 0x80000000);
67140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q2, 0x1234000056780000, 0xabcd0000ef000000);
67150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d0, 1.234);
67160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(s1, 2.5);
67170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_LITERAL_POOL_SIZE(48);
6718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Emit more code than the maximum literal load range to ensure the pool
67200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // should be emitted.
67210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const ptrdiff_t end = masm.CursorOffset() + 2 * kMaxLoadLiteralRange;
67220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  while (masm.CursorOffset() < end) {
67230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Nop();
67240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
6725ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The pool should have been emitted.
67270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_LITERAL_POOL_SIZE(0);
67280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
67290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // These loads should be after the pool (and will require a new one).
67300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(x4, 0x34567890abcdef12);
67310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(w5, 0xdcba09fe);
67320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldrsw(x6, 0x7fffffff);
67330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldrsw(x7, 0x80000000);
67340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(q6, 0x1234000056780000, 0xabcd0000ef000000);
67350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(d4, 123.4);
67360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldr(s5, 250.0);
67370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_LITERAL_POOL_SIZE(48);
6738ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6739ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6741ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that the literals loaded correctly.
67430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x0);
67440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba09, x1);
67450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x2);
67460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff80000000, x3);
67470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1234000056780000, 0xabcd0000ef000000, q2);
67480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.234, d0);
67490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5, s1);
67500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x34567890abcdef12, x4);
67510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xdcba09fe, x5);
67520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x6);
67530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff80000000, x7);
67540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1234000056780000, 0xabcd0000ef000000, q6);
67550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(123.4, d4);
67560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(250.0, s5);
6757ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6758ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6759ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6760ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67620cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal_values_q) {
6763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const uint64_t kHalfValues[] = {
67660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    0x8000000000000000, 0x7fffffffffffffff, 0x0000000000000000,
67670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    0xffffffffffffffff, 0x00ff00ff00ff00ff, 0x1234567890abcdef
67680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  };
67690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int card = sizeof(kHalfValues) / sizeof(kHalfValues[0]);
67700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& ref_low64 = x1;
67710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& ref_high64 = x2;
67720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& loaded_low64 = x3;
67730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& loaded_high64 = x4;
67740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const VRegister& tgt = q0;
6775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
67770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
6778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < card; i++) {
67800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(ref_low64, kHalfValues[i]);
67810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int j = 0; j < card; j++) {
67820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(ref_high64, kHalfValues[j]);
67830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Ldr(tgt, kHalfValues[j], kHalfValues[i]);
67840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(loaded_low64, tgt.V2D(), 0);
67850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(loaded_high64, tgt.V2D(), 1);
67860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Cmp(loaded_low64, ref_low64);
67870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Ccmp(loaded_high64, ref_high64, NoFlag, eq);
67880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Cset(x0, ne);
67890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
67900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
6791ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
6792ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6793ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
6794ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
67950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // If one of the values differs, the trace can be used to identify which one.
67960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x0);
6797ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6799ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6800ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6801ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
68020cc8b6ece4b3e757e11a906a81ece292437713abarmvixltemplate <typename T>
68030cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid LoadIntValueHelper(T values[], int card) {
6804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
6805f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
68060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const bool is_32bits = (sizeof(T) == 4);
68070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& tgt1 = is_32bits ? w1 : x1;
68080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& tgt2 = is_32bits ? w2 : x2;
6809f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
68100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
68110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
68120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
68130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // If one of the values differ then x0 will be one.
68140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < card; ++i) {
68150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(tgt1, values[i]);
68160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ldr(tgt2, values[i]);
68170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Cmp(tgt1, tgt2);
68180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Cset(x0, ne);
68190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
6820f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
68210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6822f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
6823f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
68240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // If one of the values differs, the trace can be used to identify which one.
68250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x0);
6826f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6827f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
6828f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
6829f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
6830ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
68310cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal_values_x) {
68320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const uint64_t kValues[] = {
68330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    0x8000000000000000, 0x7fffffffffffffff, 0x0000000000000000,
68340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    0xffffffffffffffff, 0x00ff00ff00ff00ff, 0x1234567890abcdef
68350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  };
68361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  LoadIntValueHelper(kValues, sizeof(kValues) / sizeof(kValues[0]));
68380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
68391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68410cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal_values_w) {
68420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const uint32_t kValues[] = {
68430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    0x80000000, 0x7fffffff, 0x00000000, 0xffffffff, 0x00ff00ff, 0x12345678,
68440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    0x90abcdef
68450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  };
68460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
68470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  LoadIntValueHelper(kValues, sizeof(kValues) / sizeof(kValues[0]));
68481123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
68491123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68510cc8b6ece4b3e757e11a906a81ece292437713abarmvixltemplate <typename T>
68520cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid LoadFPValueHelper(T values[], int card) {
6853f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
6854ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
68550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const bool is_32bits = (sizeof(T) == 4);
68560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const FPRegister& fp_tgt = is_32bits ? s2 : d2;
68570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& tgt1 = is_32bits ? w1 : x1;
68580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& tgt2 = is_32bits ? w2 : x2;
68590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
68600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
68610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
6862f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
68630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // If one of the values differ then x0 will be one.
68640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < card; ++i) {
68650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(tgt1, is_32bits ? float_to_rawbits(values[i])
68660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                           : double_to_rawbits(values[i]));
68670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ldr(fp_tgt, values[i]);
68680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(tgt2, fp_tgt);
68690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Cmp(tgt1, tgt2);
68700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Cset(x0, ne);
68710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
6872f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
68730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6874f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
6875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
68760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // If one of the values differs, the trace can be used to identify which one.
68770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x0);
6878ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
6879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
6880ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
6881ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
68820cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal_values_d) {
68830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const double kValues[] = {
68840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    -0.0, 0.0, -1.0, 1.0, -1e10, 1e10
68850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  };
6886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
68870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  LoadFPValueHelper(kValues, sizeof(kValues) / sizeof(kValues[0]));
68880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
68891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68910cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal_values_s) {
68920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const float kValues[] = {
68930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    -0.0, 0.0, -1.0, 1.0, -1e10, 1e10
68940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  };
68951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  LoadFPValueHelper(kValues, sizeof(kValues) / sizeof(kValues[0]));
68971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
68981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
68991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69000cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal_custom) {
69010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
69020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
69031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end_of_pool_before;
69050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end_of_pool_after;
69060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> before_x(0x1234567890abcdef);
69070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> before_w(0xfedcba09);
69080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> before_sx(0x80000000);
69090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> before_q(0x1234000056780000, 0xabcd0000ef000000);
69100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<double> before_d(1.234);
69110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<float> before_s(2.5);
69120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> after_x(0x1234567890abcdef);
69130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> after_w(0xfedcba09);
69140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> after_sx(0x80000000);
69150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> after_q(0x1234000056780000, 0xabcd0000ef000000);
69160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<double> after_d(1.234);
69170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<float> after_s(2.5);
69181123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
6920ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
69210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Manually generate a pool.
69220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end_of_pool_before);
69230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_x);
69240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_w);
69250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_sx);
69260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_q);
69270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_d);
69280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_s);
69290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end_of_pool_before);
69301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(x2, &before_x);
69320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(w3, &before_w);
69330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldrsw(x5, &before_sx);
69340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(q11, &before_q);
69350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(d13, &before_d);
69360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(s25, &before_s);
69371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(x6, &after_x);
69390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(w7, &after_w);
69400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldrsw(x8, &after_sx);
69410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(q18, &after_q);
69420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(d14, &after_d);
69430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(s26, &after_s);
69441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Manually generate a pool.
69460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end_of_pool_after);
69470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_x);
69480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_w);
69490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_sx);
69500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_q);
69510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_d);
69520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_s);
69530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end_of_pool_after);
69541123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
69561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
69581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x2);
69600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba09, x3);
69610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff80000000, x5);
69620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1234000056780000, 0xabcd0000ef000000, q11);
69630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.234, d13);
69640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5, s25);
69651123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x6);
69670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba09, x7);
69680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff80000000, x8);
69690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1234000056780000, 0xabcd0000ef000000, q18);
69700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.234, d14);
69710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5, s26);
6972ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
69730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
69740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
69751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69761123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
69770cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldr_literal_custom_shared) {
69780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
69790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
69800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
69810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end_of_pool_before;
69820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end_of_pool_after;
69830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> before_x(0x1234567890abcdef);
69840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> before_w(0xfedcba09);
69850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> before_q(0x1234000056780000, 0xabcd0000ef000000);
69860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<double> before_d(1.234);
69870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<float> before_s(2.5);
69880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> after_x(0x1234567890abcdef);
69890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> after_w(0xfedcba09);
69900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> after_q(0x1234000056780000, 0xabcd0000ef000000);
69910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<double> after_d(1.234);
69920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<float> after_s(2.5);
69930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
69940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
69950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
69960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Manually generate a pool.
69970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end_of_pool_before);
69980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_x);
69990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_w);
70000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_q);
70010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_d);
70020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_s);
70030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end_of_pool_before);
70040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Load the entries several times to test that literals can be shared.
70060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < 50; i++) {
70070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(x2, &before_x);
70080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(w3, &before_w);
70090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldrsw(x5, &before_w);    // Re-use before_w.
70100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(q11, &before_q);
70110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(d13, &before_d);
70120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(s25, &before_s);
70130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(x6, &after_x);
70150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(w7, &after_w);
70160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldrsw(x8, &after_w);     // Re-use after_w.
70170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(q18, &after_q);
70180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(d14, &after_d);
70190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ ldr(s26, &after_s);
70200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
70210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Manually generate a pool.
70230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end_of_pool_after);
70240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_x);
70250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_w);
70260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_q);
70270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_d);
70280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_s);
70290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end_of_pool_after);
70300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
70320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
70340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x2);
70360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba09, x3);
70370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffedcba09, x5);
70380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1234000056780000, 0xabcd0000ef000000, q11);
70390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.234, d13);
70400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5, s25);
70410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x6);
70430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba09, x7);
70440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffedcba09, x8);
70450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1234000056780000, 0xabcd0000ef000000, q18);
70460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.234, d14);
70470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5, s26);
70480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
70500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
70510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70530cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(prfm_offset) {
70540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
70550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
70570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The address used in prfm doesn't have to be valid.
70580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0123456789abcdef);
70590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < (1 << ImmPrefetchOperation_width); i++) {
70610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Unallocated prefetch operations are ignored, so test all of them.
70620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PrefetchOperation op = static_cast<PrefetchOperation>(i);
70630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0));
70650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 8));
70660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 32760));
70670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 32768));
70680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 1));
70700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 9));
70710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 255));
70720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 257));
70730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, -1));
70740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, -9));
70750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, -255));
70760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, -257));
70770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 0xfedcba9876543210));
70790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
70800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
70820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
70830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
70840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
70850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70870cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(prfm_regoffset) {
70880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
70890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
70910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The address used in prfm doesn't have to be valid.
70920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0123456789abcdef);
70930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
70940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList inputs(CPURegister::kRegister, kXRegSize, 10, 18);
70950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, 0);
70960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, 1);
70970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x12, 8);
70980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x13, 255);
70990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x14, -0);
71000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x15, -1);
71010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, -8);
71020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x17, -255);
71030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 0xfedcba9876543210);
71040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < (1 << ImmPrefetchOperation_width); i++) {
71060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Unallocated prefetch operations are ignored, so test all of them.
71070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PrefetchOperation op = static_cast<PrefetchOperation>(i);
71080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    CPURegList loop = inputs;
71100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    while (!loop.IsEmpty()) {
71110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      Register input(loop.PopLowestIndex());
71120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input));
71130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input, UXTW));
71140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input, UXTW, 3));
71150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input, LSL));
71160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input, LSL, 3));
71170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input, SXTW));
71180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input, SXTW, 3));
71190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input, SXTX));
71200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Prfm(op, MemOperand(x0, input, SXTX, 3));
71210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
71220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
71230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
71250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
71260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
71270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
71280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71300cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(prfm_literal_imm19) {
71310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
71320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
71330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
71340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < (1 << ImmPrefetchOperation_width); i++) {
71360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Unallocated prefetch operations are ignored, so test all of them.
71370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PrefetchOperation op = static_cast<PrefetchOperation>(i);
71380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // The address used in prfm doesn't have to be valid.
71400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, 0);
71410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, 1);
71420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, -1);
71430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, 1000);
71440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, -1000);
71450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, 0x3ffff);
71460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, -0x40000);
71470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
71480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
71500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
71510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
71520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
71530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71550cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(prfm_literal) {
71560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
71570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
71580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end_of_pool_before;
71600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end_of_pool_after;
71610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> before(0);
71620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> after(0);
71630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
71650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Manually generate a pool.
71670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end_of_pool_before);
71680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before);
71690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end_of_pool_before);
71700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < (1 << ImmPrefetchOperation_width); i++) {
71720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Unallocated prefetch operations are ignored, so test all of them.
71730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PrefetchOperation op = static_cast<PrefetchOperation>(i);
71740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    CodeBufferCheckScope guard(&masm, 2 * kInstructionSize);
71760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &before);
71770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &after);
71780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
71790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Manually generate a pool.
71810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end_of_pool_after);
71820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after);
71830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end_of_pool_after);
71840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
71860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
71870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
71880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
71890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71910cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(prfm_wide) {
71920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
71930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
71950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The address used in prfm doesn't have to be valid.
71960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0123456789abcdef);
71970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
71980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < (1 << ImmPrefetchOperation_width); i++) {
71990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Unallocated prefetch operations are ignored, so test all of them.
72000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PrefetchOperation op = static_cast<PrefetchOperation>(i);
72010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, 0x40000));
72030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, -0x40001));
72040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, UINT64_C(0x5555555555555555)));
72050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Prfm(op, MemOperand(x0, UINT64_C(0xfedcba9876543210)));
72060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
72070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
72090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
72100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
72110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
72120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72140cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_prfm_literal) {
72150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test literals shared between both prfm and ldr.
72160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
72170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
72180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end_of_pool_before;
72200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end_of_pool_after;
72210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> before_x(0x1234567890abcdef);
72220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> before_w(0xfedcba09);
72230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> before_sx(0x80000000);
72240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<double> before_d(1.234);
72250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<float> before_s(2.5);
72260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint64_t> after_x(0x1234567890abcdef);
72270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> after_w(0xfedcba09);
72280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<uint32_t> after_sx(0x80000000);
72290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<double> after_d(1.234);
72300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Literal<float> after_s(2.5);
72310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
72330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Manually generate a pool.
72350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end_of_pool_before);
72360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_x);
72370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_w);
72380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_sx);
72390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_d);
72400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&before_s);
72410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end_of_pool_before);
72420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < (1 << ImmPrefetchOperation_width); i++) {
72440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Unallocated prefetch operations are ignored, so test all of them.
72450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PrefetchOperation op = static_cast<PrefetchOperation>(i);
72460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &before_x);
72480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &before_w);
72490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &before_sx);
72500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &before_d);
72510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &before_s);
72520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &after_x);
72540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &after_w);
72550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &after_sx);
72560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &after_d);
72570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ prfm(op, &after_s);
72580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
72590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(x2, &before_x);
72610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(w3, &before_w);
72620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldrsw(x5, &before_sx);
72630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(d13, &before_d);
72640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(s25, &before_s);
72650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(x6, &after_x);
72670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(w7, &after_w);
72680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldrsw(x8, &after_sx);
72690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(d14, &after_d);
72700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ldr(s26, &after_s);
72710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Manually generate a pool.
72730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end_of_pool_after);
72740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_x);
72750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_w);
72760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_sx);
72770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_d);
72780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ place(&after_s);
72790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end_of_pool_after);
72800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
72820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
72840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x2);
72860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba09, x3);
72870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff80000000, x5);
72880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.234, d13);
72890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5, s25);
72900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x6);
72920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba09, x7);
72930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff80000000, x8);
72940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.234, d14);
72950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5, s26);
72960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
72970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
72980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
72990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73010cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(add_sub_imm) {
73020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
73030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
73050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0);
73060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x1111);
73070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0xffffffffffffffff);
73080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x3, 0x8000000000000000);
73090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x10, x0, Operand(0x123));
73110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x11, x1, Operand(0x122000));
73120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x12, x0, Operand(0xabc << 12));
73130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x13, x2, Operand(1));
73140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w14, w0, Operand(0x123));
73160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w15, w1, Operand(0x122000));
73170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w16, w0, Operand(0xabc << 12));
73180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w17, w2, Operand(1));
73190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x20, x0, Operand(0x1));
73210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x21, x1, Operand(0x111));
73220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x22, x1, Operand(0x1 << 12));
73230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x23, x3, Operand(1));
73240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w24, w0, Operand(0x1));
73260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w25, w1, Operand(0x111));
73270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w26, w1, Operand(0x1 << 12));
73280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w27, w3, Operand(1));
73290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
73300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
73320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123, x10);
73340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123111, x11);
73350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xabc000, x12);
73360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0, x13);
73370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x123, w14);
73390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x123111, w15);
73400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xabc000, w16);
73410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x0, w17);
73420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
73440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1000, x21);
73450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x111, x22);
73460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x23);
73470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffffffff, w24);
73490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x1000, w25);
73500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x111, w26);
73510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffffffff, w27);
73520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
73540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
73550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73570cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(add_sub_wide_imm) {
73580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
73590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
73610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0);
73620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x1);
73630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x10, x0, Operand(0x1234567890abcdef));
73650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x11, x1, Operand(0xffffffff));
73660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w12, w0, Operand(0x12345678));
73680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w13, w1, Operand(0xffffffff));
73690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w18, w0, Operand(kWMinInt));
73710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w19, w0, Operand(kWMinInt));
73720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x20, x0, Operand(0x1234567890abcdef));
73740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w21, w0, Operand(0x12345678));
73750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
73770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
73790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x10);
73810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x100000000, x11);
73820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x12345678, w12);
73840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0, x13);
73850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(kWMinInt, w18);
73870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(kWMinInt, w19);
73880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(-0x1234567890abcdef, x20);
73900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(-0x12345678, w21);
73910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
73930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
73940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73960cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(add_sub_shifted) {
73970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
73980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
73990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
74000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
74010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x0123456789abcdef);
74020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0xfedcba9876543210);
74030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x3, 0xffffffffffffffff);
74040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x10, x1, Operand(x2));
74060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x11, x0, Operand(x1, LSL, 8));
74070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x12, x0, Operand(x1, LSR, 8));
74080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x13, x0, Operand(x1, ASR, 8));
74090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x14, x0, Operand(x2, ASR, 8));
74100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w15, w0, Operand(w1, ASR, 8));
74110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w18, w3, Operand(w1, ROR, 8));
74120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x19, x3, Operand(x1, ROR, 8));
74130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x20, x3, Operand(x2));
74150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x21, x3, Operand(x1, LSL, 8));
74160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x22, x3, Operand(x1, LSR, 8));
74170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x23, x3, Operand(x1, ASR, 8));
74180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x24, x3, Operand(x2, ASR, 8));
74190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w25, w3, Operand(w1, ASR, 8));
74200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w26, w3, Operand(w1, ROR, 8));
74210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x27, x3, Operand(x1, ROR, 8));
74220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
74230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
74250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x10);
74270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x23456789abcdef00, x11);
74280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000123456789abcd, x12);
74290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000123456789abcd, x13);
74300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffedcba98765432, x14);
74310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xff89abcd, x15);
74320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xef89abcc, x18);
74330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xef0123456789abcc, x19);
74340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x20);
74360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xdcba9876543210ff, x21);
74370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffedcba98765432, x22);
74380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffedcba98765432, x23);
74390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000123456789abcd, x24);
74400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00765432, x25);
74410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x10765432, x26);
74420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x10fedcba98765432, x27);
74430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
74450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
74460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74480cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(add_sub_extended) {
74490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
74500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
74520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
74530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x0123456789abcdef);
74540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0xfedcba9876543210);
74550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, 0x80);
74560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x10, x0, Operand(x1, UXTB, 0));
74580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x11, x0, Operand(x1, UXTB, 1));
74590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x12, x0, Operand(x1, UXTH, 2));
74600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x13, x0, Operand(x1, UXTW, 4));
74610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x14, x0, Operand(x1, SXTB, 0));
74630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x15, x0, Operand(x1, SXTB, 1));
74640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x16, x0, Operand(x1, SXTH, 2));
74650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x17, x0, Operand(x1, SXTW, 3));
74660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x18, x0, Operand(x2, SXTB, 0));
74670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x19, x0, Operand(x2, SXTB, 1));
74680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x20, x0, Operand(x2, SXTH, 2));
74690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x21, x0, Operand(x2, SXTW, 3));
74700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x22, x1, Operand(x2, SXTB, 1));
74720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x23, x1, Operand(x2, SXTB, 1));
74730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w24, w1, Operand(w2, UXTB, 2));
74750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w25, w0, Operand(w1, SXTB, 0));
74760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w26, w0, Operand(w1, SXTB, 1));
74770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w27, w2, Operand(w1, SXTW, 3));
74780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w28, w0, Operand(w1, SXTW, 3));
74800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x29, x0, Operand(w1, SXTW, 3));
74810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x30, x0, Operand(w3, SXTB, 1));
74830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
74840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
74860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xef, x10);
74880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1de, x11);
74890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x337bc, x12);
74900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x89abcdef0, x13);
74910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
74920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffef, x14);
74930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffde, x15);
74940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffff37bc, x16);
74950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffc4d5e6f78, x17);
74960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x10, x18);
74970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x20, x19);
74980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xc840, x20);
74990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3b2a19080, x21);
75000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0123456789abce0f, x22);
75020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0123456789abcdcf, x23);
75030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x89abce2f, w24);
75050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffffffef, w25);
75060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffffffde, w26);
75070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xc3b2a188, w27);
75080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x4d5e6f78, w28);
75100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffc4d5e6f78, x29);
75110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(256, x30);
75130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
75150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
75160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75180cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(add_sub_negative) {
75190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
75200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
75220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
75230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 4687);
75240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0x1122334455667788);
75250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, 0x11223344);
75260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w4, 400000);
75270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x10, x0, -42);
75290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x11, x1, -687);
75300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x12, x2, -0x88);
75310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x13, x0, -600);
75330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x14, x1, -313);
75340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x15, x2, -0x555);
75350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w19, w3, -0x344);
75370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w20, w4, -2000);
75380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w21, w3, -0xbc);
75400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w22, w4, -2000);
75410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
75420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
75440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(-42, x10);
75460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(4000, x11);
75470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1122334455667700, x12);
75480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(600, x13);
75500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(5000, x14);
75510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1122334455667cdd, x15);
75520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x11223000, w19);
75540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(398000, w20);
75550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x11223400, w21);
75570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(402000, w22);
75580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
75600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
75610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75630cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(add_sub_zero) {
75640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
75650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
75670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
75680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
75690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0);
75700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label blob1;
75720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&blob1);
75730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 0);
75740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x1, x1, 0);
75750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x2, x2, xzr);
75760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&blob1) == 0);
75770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label blob2;
75790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&blob2);
75800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w3, w3, 0);
75810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&blob2) != 0);
75820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label blob3;
75840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&blob3);
75850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(w3, w3, wzr);
75860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&blob3) != 0);
75870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
75890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
75910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x0);
75930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x1);
75940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x2);
75950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
75970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
75980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
75990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76000cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(claim_drop_zero) {
76010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
76020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
76040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label start;
76060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&start);
76070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(Operand(0));
76080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Drop(Operand(0));
76090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(Operand(xzr));
76100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Drop(Operand(xzr));
76110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
76120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
76140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
76160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
76180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
76190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76210cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neg) {
76220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
76230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
76250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0xf123456789abcdef);
76260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Immediate.
76280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x1, 0x123);
76290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(w2, 0x123);
76300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Shifted.
76320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x3, Operand(x0, LSL, 1));
76330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(w4, Operand(w0, LSL, 2));
76340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x5, Operand(x0, LSR, 3));
76350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(w6, Operand(w0, LSR, 4));
76360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x7, Operand(x0, ASR, 5));
76370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(w8, Operand(w0, ASR, 6));
76380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Extended.
76400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(w9, Operand(w0, UXTB));
76410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x10, Operand(x0, SXTB, 1));
76420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(w11, Operand(w0, UXTH, 2));
76430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x12, Operand(x0, SXTH, 3));
76440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(w13, Operand(w0, UXTW, 4));
76450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x14, Operand(x0, SXTW, 4));
76460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
76470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
76490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffedd, x1);
76510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffedd, x2);
76520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1db97530eca86422, x3);
76530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xd950c844, x4);
76540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xe1db97530eca8643, x5);
76550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xf7654322, x6);
76560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0076e5d4c3b2a191, x7);
76570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x01d950c9, x8);
76580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffff11, x9);
76590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000000022, x10);
76600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffcc844, x11);
76610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000019088, x12);
76620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x65432110, x13);
76630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000765432110, x14);
76640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
76660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
76670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
76699795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wangtemplate<typename T, typename Op>
76709795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wangstatic void AdcsSbcsHelper(Op op, T left, T right, int carry,
76719795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                           T expected, StatusFlags expected_flags) {
76729795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  int reg_size = sizeof(T) * 8;
76739795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  Register left_reg(0, reg_size);
76749795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  Register right_reg(1, reg_size);
76759795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  Register result_reg(2, reg_size);
76769795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
76779795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  SETUP();
76789795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  START();
76799795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
76809795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  __ Mov(left_reg, left);
76819795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  __ Mov(right_reg, right);
76829795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  __ Mov(x10, (carry ? CFlag : NoFlag));
76839795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
76849795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  __ Msr(NZCV, x10);
76859795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  (masm.*op)(result_reg, left_reg, right_reg);
76869795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
76879795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  END();
76889795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  RUN();
76899795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
76909795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  ASSERT_EQUAL_64(left, left_reg.X());
76919795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  ASSERT_EQUAL_64(right, right_reg.X());
76929795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  ASSERT_EQUAL_64(expected, result_reg.X());
76939795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  ASSERT_EQUAL_NZCV(expected_flags);
76949795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
76959795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  TEARDOWN();
76969795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang}
76979795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
76989795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
76999795cffa6b242fddee25847d17136a8da5b5c2d7Phil WangTEST(adcs_sbcs_x) {
77009795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  uint64_t inputs[] = {
77019795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    0x0000000000000000, 0x0000000000000001,
77029795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    0x7ffffffffffffffe, 0x7fffffffffffffff,
77039795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    0x8000000000000000, 0x8000000000000001,
77049795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    0xfffffffffffffffe, 0xffffffffffffffff,
77059795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  };
77069795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  static const size_t input_count = sizeof(inputs) / sizeof(inputs[0]);
77079795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
77089795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  struct Expected {
77099795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    uint64_t carry0_result;
77109795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    StatusFlags carry0_flags;
77119795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    uint64_t carry1_result;
77129795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    StatusFlags carry1_flags;
77139795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  };
77149795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
77159795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  static const Expected expected_adcs_x[input_count][input_count] = {
77169795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x0000000000000000, ZFlag, 0x0000000000000001, NoFlag},
77179795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag},
77189795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag},
77199795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag},
77209795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NFlag, 0x8000000000000001, NFlag},
77219795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000001, NFlag, 0x8000000000000002, NFlag},
77229795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag},
77239795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}},
77249795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag},
77259795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000002, NoFlag, 0x0000000000000003, NoFlag},
77269795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag},
77279795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag},
77289795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000001, NFlag, 0x8000000000000002, NFlag},
77299795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000002, NFlag, 0x8000000000000003, NFlag},
77309795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77319795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}},
77329795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag},
77339795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag},
77349795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffc, NVFlag, 0xfffffffffffffffd, NVFlag},
77359795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag},
77369795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag},
77379795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77389795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag},
77399795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}},
77409795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag},
77419795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag},
77429795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag},
77439795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NVFlag, 0xffffffffffffffff, NVFlag},
77449795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77459795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag},
77469795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag},
77479795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}},
77489795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x8000000000000000, NFlag, 0x8000000000000001, NFlag},
77499795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000001, NFlag, 0x8000000000000002, NFlag},
77509795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag},
77519795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77529795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCVFlag, 0x0000000000000001, CVFlag},
77539795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag},
77549795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag},
77559795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}},
77569795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x8000000000000001, NFlag, 0x8000000000000002, NFlag},
77579795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000002, NFlag, 0x8000000000000003, NFlag},
77589795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77599795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag},
77609795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag},
77619795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000002, CVFlag, 0x0000000000000003, CVFlag},
77629795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag},
77639795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}},
77649795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag},
77659795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77669795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag},
77679795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag},
77689795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag},
77699795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag},
77709795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffc, NCFlag, 0xfffffffffffffffd, NCFlag},
77719795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}},
77729795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77739795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag},
77749795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag},
77759795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag},
77769795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag},
77779795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag},
77789795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag},
77799795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NCFlag, 0xffffffffffffffff, NCFlag}}
77809795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  };
77819795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
77829795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  static const Expected expected_sbcs_x[input_count][input_count] = {
77839795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77849795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag},
77859795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000001, NFlag, 0x8000000000000002, NFlag},
77869795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NFlag, 0x8000000000000001, NFlag},
77879795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag},
77889795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag},
77899795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag},
77909795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZFlag, 0x0000000000000001, NoFlag}},
77919795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag},
77929795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
77939795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000002, NFlag, 0x8000000000000003, NFlag},
77949795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000001, NFlag, 0x8000000000000002, NFlag},
77959795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag},
77969795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag},
77979795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000002, NoFlag, 0x0000000000000003, NoFlag},
77989795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}},
77999795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag},
78009795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag},
78019795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
78029795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag},
78039795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag},
78049795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffc, NVFlag, 0xfffffffffffffffd, NVFlag},
78059795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag},
78069795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}},
78079795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag},
78089795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag},
78099795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag},
78109795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
78119795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NVFlag, 0xffffffffffffffff, NVFlag},
78129795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag},
78139795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag},
78149795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}},
78159795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag},
78169795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag},
78179795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag},
78189795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCVFlag, 0x0000000000000001, CVFlag},
78199795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
78209795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag},
78219795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000001, NFlag, 0x8000000000000002, NFlag},
78229795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NFlag, 0x8000000000000001, NFlag}},
78239795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag},
78249795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag},
78259795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000002, CVFlag, 0x0000000000000003, CVFlag},
78269795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag},
78279795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag},
78289795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
78299795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000002, NFlag, 0x8000000000000003, NFlag},
78309795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}},
78319795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag},
78329795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffc, NCFlag, 0xfffffffffffffffd, NCFlag},
78339795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag},
78349795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag},
78359795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag},
78369795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag},
78379795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag},
78389795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}},
78399795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xfffffffffffffffe, NCFlag, 0xffffffffffffffff, NCFlag},
78409795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag},
78419795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag},
78429795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag},
78439795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag},
78449795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag},
78459795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag},
78469795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}}
78479795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  };
78489795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
78499795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  for (size_t left = 0; left < input_count; left++) {
78509795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    for (size_t right = 0; right < input_count; right++) {
78519795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      const Expected & expected = expected_adcs_x[left][right];
78529795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 0,
78539795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                     expected.carry0_result, expected.carry0_flags);
78549795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 1,
78559795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                     expected.carry1_result, expected.carry1_flags);
78569795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    }
78579795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  }
78589795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
78599795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  for (size_t left = 0; left < input_count; left++) {
78609795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    for (size_t right = 0; right < input_count; right++) {
78619795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      const Expected & expected = expected_sbcs_x[left][right];
78629795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 0,
78639795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                     expected.carry0_result, expected.carry0_flags);
78649795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 1,
78659795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                     expected.carry1_result, expected.carry1_flags);
78669795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    }
78679795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  }
78689795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang}
78699795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
78709795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
78719795cffa6b242fddee25847d17136a8da5b5c2d7Phil WangTEST(adcs_sbcs_w) {
78729795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  uint32_t inputs[] = {
78739795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    0x00000000, 0x00000001, 0x7ffffffe, 0x7fffffff,
78749795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    0x80000000, 0x80000001, 0xfffffffe, 0xffffffff,
78759795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  };
78769795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  static const size_t input_count = sizeof(inputs) / sizeof(inputs[0]);
78779795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
78789795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  struct Expected {
78799795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    uint32_t carry0_result;
78809795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    StatusFlags carry0_flags;
78819795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    uint32_t carry1_result;
78829795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    StatusFlags carry1_flags;
78839795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  };
78849795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
78859795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  static const Expected expected_adcs_w[input_count][input_count] = {
78869795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x00000000, ZFlag, 0x00000001, NoFlag},
78879795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000001, NoFlag, 0x00000002, NoFlag},
78889795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag},
78899795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, NoFlag, 0x80000000, NVFlag},
78909795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NFlag, 0x80000001, NFlag},
78919795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000001, NFlag, 0x80000002, NFlag},
78929795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NFlag, 0xffffffff, NFlag},
78939795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag}},
78949795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x00000001, NoFlag, 0x00000002, NoFlag},
78959795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000002, NoFlag, 0x00000003, NoFlag},
78969795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, NoFlag, 0x80000000, NVFlag},
78979795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NVFlag, 0x80000001, NVFlag},
78989795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000001, NFlag, 0x80000002, NFlag},
78999795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000002, NFlag, 0x80000003, NFlag},
79009795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79019795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCFlag, 0x00000001, CFlag}},
79029795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7ffffffe, NoFlag, 0x7fffffff, NoFlag},
79039795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, NoFlag, 0x80000000, NVFlag},
79049795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffc, NVFlag, 0xfffffffd, NVFlag},
79059795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffd, NVFlag, 0xfffffffe, NVFlag},
79069795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NFlag, 0xffffffff, NFlag},
79079795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79089795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffc, CFlag, 0x7ffffffd, CFlag},
79099795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}},
79109795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7fffffff, NoFlag, 0x80000000, NVFlag},
79119795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NVFlag, 0x80000001, NVFlag},
79129795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffd, NVFlag, 0xfffffffe, NVFlag},
79139795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NVFlag, 0xffffffff, NVFlag},
79149795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79159795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCFlag, 0x00000001, CFlag},
79169795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffd, CFlag, 0x7ffffffe, CFlag},
79179795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, CFlag, 0x7fffffff, CFlag}},
79189795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x80000000, NFlag, 0x80000001, NFlag},
79199795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000001, NFlag, 0x80000002, NFlag},
79209795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NFlag, 0xffffffff, NFlag},
79219795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79229795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCVFlag, 0x00000001, CVFlag},
79239795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000001, CVFlag, 0x00000002, CVFlag},
79249795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag},
79259795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, CVFlag, 0x80000000, NCFlag}},
79269795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x80000001, NFlag, 0x80000002, NFlag},
79279795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000002, NFlag, 0x80000003, NFlag},
79289795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79299795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCFlag, 0x00000001, CFlag},
79309795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000001, CVFlag, 0x00000002, CVFlag},
79319795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000002, CVFlag, 0x00000003, CVFlag},
79329795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, CVFlag, 0x80000000, NCFlag},
79339795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NCFlag, 0x80000001, NCFlag}},
79349795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xfffffffe, NFlag, 0xffffffff, NFlag},
79359795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79369795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffc, CFlag, 0x7ffffffd, CFlag},
79379795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffd, CFlag, 0x7ffffffe, CFlag},
79389795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag},
79399795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, CVFlag, 0x80000000, NCFlag},
79409795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffc, NCFlag, 0xfffffffd, NCFlag},
79419795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffd, NCFlag, 0xfffffffe, NCFlag}},
79429795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xffffffff, NFlag, 0x00000000, ZCFlag},
79439795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCFlag, 0x00000001, CFlag},
79449795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffd, CFlag, 0x7ffffffe, CFlag},
79459795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, CFlag, 0x7fffffff, CFlag},
79469795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, CVFlag, 0x80000000, NCFlag},
79479795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NCFlag, 0x80000001, NCFlag},
79489795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffd, NCFlag, 0xfffffffe, NCFlag},
79499795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NCFlag, 0xffffffff, NCFlag}}
79509795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  };
79519795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
79529795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  static const Expected expected_sbcs_w[input_count][input_count] = {
79539795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xffffffff, NFlag, 0x00000000, ZCFlag},
79549795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NFlag, 0xffffffff, NFlag},
79559795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000001, NFlag, 0x80000002, NFlag},
79569795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NFlag, 0x80000001, NFlag},
79579795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, NoFlag, 0x80000000, NVFlag},
79589795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag},
79599795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000001, NoFlag, 0x00000002, NoFlag},
79609795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZFlag, 0x00000001, NoFlag}},
79619795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x00000000, ZCFlag, 0x00000001, CFlag},
79629795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79639795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000002, NFlag, 0x80000003, NFlag},
79649795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000001, NFlag, 0x80000002, NFlag},
79659795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NVFlag, 0x80000001, NVFlag},
79669795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, NoFlag, 0x80000000, NVFlag},
79679795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000002, NoFlag, 0x00000003, NoFlag},
79689795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000001, NoFlag, 0x00000002, NoFlag}},
79699795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7ffffffd, CFlag, 0x7ffffffe, CFlag},
79709795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffc, CFlag, 0x7ffffffd, CFlag},
79719795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79729795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NFlag, 0xffffffff, NFlag},
79739795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffd, NVFlag, 0xfffffffe, NVFlag},
79749795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffc, NVFlag, 0xfffffffd, NVFlag},
79759795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, NoFlag, 0x80000000, NVFlag},
79769795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}},
79779795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7ffffffe, CFlag, 0x7fffffff, CFlag},
79789795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffd, CFlag, 0x7ffffffe, CFlag},
79799795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCFlag, 0x00000001, CFlag},
79809795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79819795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NVFlag, 0xffffffff, NVFlag},
79829795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffd, NVFlag, 0xfffffffe, NVFlag},
79839795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NVFlag, 0x80000001, NVFlag},
79849795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, NoFlag, 0x80000000, NVFlag}},
79859795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x7fffffff, CVFlag, 0x80000000, NCFlag},
79869795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag},
79879795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000001, CVFlag, 0x00000002, CVFlag},
79889795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCVFlag, 0x00000001, CVFlag},
79899795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79909795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NFlag, 0xffffffff, NFlag},
79919795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000001, NFlag, 0x80000002, NFlag},
79929795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NFlag, 0x80000001, NFlag}},
79939795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0x80000000, NCFlag, 0x80000001, NCFlag},
79949795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, CVFlag, 0x80000000, NCFlag},
79959795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000002, CVFlag, 0x00000003, CVFlag},
79969795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000001, CVFlag, 0x00000002, CVFlag},
79979795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCFlag, 0x00000001, CFlag},
79989795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
79999795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000002, NFlag, 0x80000003, NFlag},
80009795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000001, NFlag, 0x80000002, NFlag}},
80019795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xfffffffd, NCFlag, 0xfffffffe, NCFlag},
80029795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffc, NCFlag, 0xfffffffd, NCFlag},
80039795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, CVFlag, 0x80000000, NCFlag},
80049795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag},
80059795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffd, CFlag, 0x7ffffffe, CFlag},
80069795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffc, CFlag, 0x7ffffffd, CFlag},
80079795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag},
80089795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffe, NFlag, 0xffffffff, NFlag}},
80099795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    {{0xfffffffe, NCFlag, 0xffffffff, NCFlag},
80109795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xfffffffd, NCFlag, 0xfffffffe, NCFlag},
80119795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x80000000, NCFlag, 0x80000001, NCFlag},
80129795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7fffffff, CVFlag, 0x80000000, NCFlag},
80139795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffe, CFlag, 0x7fffffff, CFlag},
80149795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x7ffffffd, CFlag, 0x7ffffffe, CFlag},
80159795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0x00000000, ZCFlag, 0x00000001, CFlag},
80169795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang     {0xffffffff, NFlag, 0x00000000, ZCFlag}}
80179795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  };
80189795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
80199795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  for (size_t left = 0; left < input_count; left++) {
80209795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    for (size_t right = 0; right < input_count; right++) {
80219795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      const Expected & expected = expected_adcs_w[left][right];
80229795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 0,
80239795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                     expected.carry0_result, expected.carry0_flags);
80249795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 1,
80259795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                     expected.carry1_result, expected.carry1_flags);
80269795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    }
80279795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  }
80289795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
80299795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  for (size_t left = 0; left < input_count; left++) {
80309795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    for (size_t right = 0; right < input_count; right++) {
80319795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      const Expected & expected = expected_sbcs_w[left][right];
80329795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 0,
80339795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                     expected.carry0_result, expected.carry0_flags);
80349795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 1,
80359795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang                     expected.carry1_result, expected.carry1_flags);
80369795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang    }
80379795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  }
80389795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang}
80399795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
80409795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang
80410cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(adc_sbc_shift) {
80420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
80430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
80450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
80460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 1);
80470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0x0123456789abcdef);
80480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x3, 0xfedcba9876543210);
80490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, 0xffffffffffffffff);
80500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Clear the C flag.
80520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(x0, x0, Operand(0));
80530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x5, x2, Operand(x3));
80550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x6, x0, Operand(x1, LSL, 60));
80560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(x7, x4, Operand(x3, LSR, 4));
80570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x8, x2, Operand(x3, ASR, 4));
80580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x9, x2, Operand(x3, ROR, 8));
80590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w10, w2, Operand(w3));
80610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w11, w0, Operand(w1, LSL, 30));
80620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(w12, w4, Operand(w3, LSR, 4));
80630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w13, w2, Operand(w3, ASR, 4));
80640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w14, w2, Operand(w3, ROR, 8));
80650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Set the C flag.
80670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, Operand(w0));
80680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x18, x2, Operand(x3));
80700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x19, x0, Operand(x1, LSL, 60));
80710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(x20, x4, Operand(x3, LSR, 4));
80720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x21, x2, Operand(x3, ASR, 4));
80730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x22, x2, Operand(x3, ROR, 8));
80740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w23, w2, Operand(w3));
80760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w24, w0, Operand(w1, LSL, 30));
80770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(w25, w4, Operand(w3, LSR, 4));
80780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w26, w2, Operand(w3, ASR, 4));
80790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w27, w2, Operand(w3, ROR, 8));
80800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
80810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
80830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x5);
80850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(1) << 60, x6);
80860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xf0123456789abcdd, x7);
80870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0111111111111110, x8);
80880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1222222222222221, x9);
80890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffffffff, w10);
80910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(INT32_C(1) << 30, w11);
80920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xf89abcdd, w12);
80930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x91111110, w13);
80940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x9a222221, w14);
80950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
80960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff + 1, x18);
80970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64((INT64_C(1) << 60) + 1, x19);
80980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xf0123456789abcdd + 1, x20);
80990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0111111111111110 + 1, x21);
81000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1222222222222221 + 1, x22);
81010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffffffff + 1, w23);
81030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32((INT32_C(1) << 30) + 1, w24);
81040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xf89abcdd + 1, w25);
81050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x91111110 + 1, w26);
81060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x9a222221 + 1, w27);
81070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
81090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
81100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81120cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(adc_sbc_extend) {
81130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
81140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
81160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Clear the C flag.
81170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(x0, x0, Operand(0));
81180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
81200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 1);
81210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0x0123456789abcdef);
81220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x10, x1, Operand(w2, UXTB, 1));
81240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x11, x1, Operand(x2, SXTH, 2));
81250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(x12, x1, Operand(w2, UXTW, 4));
81260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x13, x1, Operand(x2, UXTX, 4));
81270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w14, w1, Operand(w2, UXTB, 1));
81290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w15, w1, Operand(w2, SXTH, 2));
81300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w9, w1, Operand(w2, UXTW, 4));
81310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Set the C flag.
81330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, Operand(w0));
81340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x20, x1, Operand(w2, UXTB, 1));
81360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x21, x1, Operand(x2, SXTH, 2));
81370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(x22, x1, Operand(w2, UXTW, 4));
81380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x23, x1, Operand(x2, UXTX, 4));
81390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w24, w1, Operand(w2, UXTB, 1));
81410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w25, w1, Operand(w2, SXTH, 2));
81420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w26, w1, Operand(w2, UXTW, 4));
81430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
81440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
81460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1df, x10);
81480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffff37bd, x11);
81490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffff765432110, x12);
81500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1, x13);
81510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x1df, w14);
81530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffff37bd, w15);
81540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x9abcdef1, w9);
81550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1df + 1, x20);
81570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffff37bd + 1, x21);
81580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffff765432110 + 1, x22);
81590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1 + 1, x23);
81600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x1df + 1, w24);
81620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffff37bd + 1, w25);
81630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x9abcdef1 + 1, w26);
81640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that adc correctly sets the condition flags.
81660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
81670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0xff);
81680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0xffffffffffffffff);
81690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Clear the C flag.
81700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(x0, x0, Operand(0));
81710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adcs(x10, x0, Operand(x1, SXTX, 1));
81720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
81730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
81750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(CFlag);
81770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
81790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x7fffffffffffffff);
81800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 1);
81810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Clear the C flag.
81820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(x0, x0, Operand(0));
81830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adcs(x10, x0, Operand(x1, UXTB, 2));
81840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
81850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
81870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
81890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
81910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x7fffffffffffffff);
81920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Clear the C flag.
81930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(x0, x0, Operand(0));
81940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adcs(x10, x0, Operand(1));
81950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
81960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
81980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
81990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
82000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
82020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
82030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82050cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(adc_sbc_wide_imm) {
82060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
82070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
82090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
82100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Clear the C flag.
82120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(x0, x0, Operand(0));
82130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x7, x0, Operand(0x1234567890abcdef));
82150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w8, w0, Operand(0xffffffff));
82160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(x9, x0, Operand(0x1234567890abcdef));
82170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(w10, w0, Operand(0xffffffff));
82180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ngc(x11, Operand(0xffffffff00000000));
82190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ngc(w12, Operand(0xffff0000));
82200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Set the C flag.
82220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, Operand(w0));
82230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(x18, x0, Operand(0x1234567890abcdef));
82250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adc(w19, w0, Operand(0xffffffff));
82260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(x20, x0, Operand(0x1234567890abcdef));
82270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbc(w21, w0, Operand(0xffffffff));
82280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ngc(x22, Operand(0xffffffff00000000));
82290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ngc(w23, Operand(0xffff0000));
82300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
82310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
82330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef, x7);
82350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x8);
82360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xedcba9876f543210, x9);
82370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x10);
82380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x11);
82390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffff, x12);
82400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1234567890abcdef + 1, x18);
82420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x19);
82430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xedcba9876f543211, x20);
82440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x21);
82450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000100000000, x22);
82460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000010000, x23);
82470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
82490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
82500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82510cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(flags) {
82520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
82530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
82550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
82560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x1111111111111111);
82570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x10, Operand(x0));
82580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(x11, Operand(x1));
82590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(w12, Operand(w1));
82600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Clear the C flag.
82610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(x0, x0, Operand(0));
82620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ngc(x13, Operand(x0));
82630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Set the C flag.
82640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x0, Operand(x0));
82650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ngc(w14, Operand(w0));
82660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
82670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
82690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x10);
82710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(-0x1111111111111111, x11);
82720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(-0x11111111, w12);
82730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(-1, x13);
82740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w14);
82750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
82770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
82780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x0, Operand(x0));
82790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
82800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
82820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
82840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
82860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
82870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, Operand(w0));
82880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
82890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
82910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
82930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
82940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
82950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
82960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x1111111111111111);
82970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x0, Operand(x1));
82980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
82990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(NFlag);
83030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
83060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x11111111);
83070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, Operand(w1));
83080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(NFlag);
83130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x1111111111111111);
83160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x1, Operand(0));
83170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(CFlag);
83220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x11111111);
83250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w1, Operand(0));
83260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(CFlag);
83310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 1);
83340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x7fffffffffffffff);
83350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmn(x1, Operand(x0));
83360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
83410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 1);
83440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x7fffffff);
83450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmn(w1, Operand(w0));
83460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(NVFlag);
83510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 1);
83540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0xffffffffffffffff);
83550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmn(x1, Operand(x0));
83560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
83610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 1);
83640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0xffffffff);
83650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmn(w1, Operand(w0));
83660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
83710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
83740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 1);
83750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Clear the C flag.
83760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(w0, w0, Operand(0));
83770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ngcs(w0, Operand(w1));
83780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(NFlag);
83830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
83850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
83860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0);
83870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Set the C flag.
83880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, Operand(w0));
83890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ngcs(w0, Operand(w1));
83900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
83910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
83930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
83950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
83970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
83980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84000cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(cmp_shift) {
84010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
84020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
84040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 0xf0000000);
84050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, 0xf000000010000000);
84060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, 0xf0000000f0000000);
84070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, 0x7800000078000000);
84080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 0x3c0000003c000000);
84090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, 0x8000000780000000);
84100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, 0x0000000f00000000);
84110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 0x00000003c0000000);
84120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x26, 0x8000000780000000);
84130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x27, 0xc0000003);
84140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w21, LSL, 1));
84160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x0, NZCV);
84170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, Operand(x22, LSL, 2));
84190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x1, NZCV);
84200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w19, Operand(w23, LSR, 3));
84220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x2, NZCV);
84230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x18, Operand(x24, LSR, 4));
84250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x3, NZCV);
84260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w25, ASR, 2));
84280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x4, NZCV);
84290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, Operand(x26, ASR, 3));
84310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x5, NZCV);
84320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w27, Operand(w22, ROR, 28));
84340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x6, NZCV);
84350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, Operand(x21, ROR, 31));
84370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x7, NZCV);
84380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
84390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
84410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
84430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
84440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
84450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w3);
84460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
84470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
84480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w6);
84490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w7);
84500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
84520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
84530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84550cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(cmp_extend) {
84560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
84570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
84590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w20, 0x2);
84600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w21, 0x1);
84610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 0xffffffffffffffff);
84620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, 0xff);
84630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, 0xfffffffffffffffe);
84640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 0xffff);
84650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x26, 0xffffffff);
84660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w21, LSL, 1));
84680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x0, NZCV);
84690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x22, Operand(x23, SXTB, 0));
84710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x1, NZCV);
84720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x24, Operand(x23, SXTB, 1));
84740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x2, NZCV);
84750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x24, Operand(x23, UXTB, 1));
84770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x3, NZCV);
84780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w22, Operand(w25, UXTH));
84800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x4, NZCV);
84810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x22, Operand(x25, SXTH));
84830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x5, NZCV);
84840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x22, Operand(x26, UXTW));
84860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x6, NZCV);
84870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x24, Operand(x26, SXTW, 1));
84890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x7, NZCV);
84900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
84910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
84930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
84940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
84950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
84960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
84970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NCFlag, w3);
84980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NCFlag, w4);
84990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
85000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NCFlag, w6);
85010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w7);
85020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
85040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
85050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85070cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ccmp) {
85080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
85090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
85100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
85120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w16, 0);
85130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w17, 1);
85140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w16, w16);
85150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(w16, w17, NCFlag, eq);
85160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x0, NZCV);
85170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w16, w16);
85190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(w16, w17, NCFlag, ne);
85200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x1, NZCV);
85210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x16, x16);
85230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmn(x16, 2, NZCVFlag, eq);
85240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x2, NZCV);
85250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x16, x16);
85270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmn(x16, 2, NZCVFlag, ne);
85280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x3, NZCV);
85290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler does not allow al as a condition.
85310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ccmp(x16, x16, NZCVFlag, al);
85320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x4, NZCV);
85330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler does not allow nv as a condition.
85350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ccmp(x16, x16, NZCVFlag, nv);
85360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x5, NZCV);
85370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
85390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
85410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w0);
85430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NCFlag, w1);
85440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NoFlag, w2);
85450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NZCVFlag, w3);
85460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
85470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
85480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
85500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
85510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85530cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ccmp_wide_imm) {
85540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
85550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
85570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w20, 0);
85580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w20));
85600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(w20, Operand(0x12345678), NZCVFlag, eq);
85610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x0, NZCV);
85620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w20));
85640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(x20, Operand(0xffffffffffffffff), NZCVFlag, eq);
85650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x1, NZCV);
85660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
85670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
85690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w0);
85710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NoFlag, w1);
85720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
85740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
85750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85770cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ccmp_shift_extend) {
85780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
85790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
85810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w20, 0x2);
85820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w21, 0x1);
85830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, 0xffffffffffffffff);
85840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, 0xff);
85850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, 0xfffffffffffffffe);
85860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w20));
85880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(w20, Operand(w21, LSL, 1), NZCVFlag, eq);
85890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x0, NZCV);
85900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w20));
85920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(x22, Operand(x23, SXTB, 0), NZCVFlag, eq);
85930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x1, NZCV);
85940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w20));
85960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(x24, Operand(x23, SXTB, 1), NZCVFlag, eq);
85970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x2, NZCV);
85980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
85990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w20));
86000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(x24, Operand(x23, UXTB, 1), NZCVFlag, eq);
86010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x3, NZCV);
86020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w20, Operand(w20));
86040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ccmp(x24, Operand(x23, UXTB, 1), NZCVFlag, ne);
86050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x4, NZCV);
86060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
86070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
86090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
86110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w1);
86120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w2);
86130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NCFlag, w3);
86140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NZCVFlag, w4);
86150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
86170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
86180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86200cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(csel) {
86210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
86220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
86230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
86250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, 0);
86260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, 0x0000000f0000000f);
86270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, 0x0000001f0000001f);
86280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w16, Operand(0));
86300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w0, w24, w25, eq);
86310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w1, w24, w25, ne);
86320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csinc(w2, w24, w25, mi);
86330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csinc(w3, w24, w25, pl);
86340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler does not allow al or nv as a condition.
86360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ csel(w13, w24, w25, al);
86370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ csel(x14, x24, x25, nv);
86380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x16, Operand(1));
86400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csinv(x4, x24, x25, gt);
86410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csinv(x5, x24, x25, le);
86420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csneg(x6, x24, x25, hs);
86430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csneg(x7, x24, x25, lo);
86440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cset(w8, ne);
86460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csetm(w9, ne);
86470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x10, x25, ne);
86480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinv(x11, x24, ne);
86490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cneg(x12, x24, ne);
86500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler does not allow al or nv as a condition.
86520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ csel(w15, w24, w25, al);
86530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ csel(x17, x24, x25, nv);
86540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
86560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
86580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000f, x0);
86600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000001f, x1);
86610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00000020, x2);
86620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000f, x3);
86630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffe0ffffffe0, x4);
86640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000f0000000f, x5);
86650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffe0ffffffe1, x6);
86660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000f0000000f, x7);
86670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00000001, x8);
86680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x9);
86690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000001f00000020, x10);
86700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffff0fffffff0, x11);
86710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffff0fffffff1, x12);
86720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000f, x13);
86730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000f0000000f, x14);
86740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000f, x15);
86750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000f0000000f, x17);
86760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
86780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
86790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(csel_imm) {
86820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
86830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
86850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x18, 0);
86860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, 0x80000000);
86870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, 0x8000000000000000);
86880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x18, Operand(0));
86900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w0, w19, -2, ne);
86910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w1, w19, -1, ne);
86920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w2, w19, 0, ne);
86930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w3, w19, 1, ne);
86940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w4, w19, 2, ne);
86950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w5, w19, Operand(w19, ASR, 31), ne);
86960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w6, w19, Operand(w19, ROR, 1), ne);
86970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(w7, w19, 3, eq);
86980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
86990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(x8, x20, -2, ne);
87000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(x9, x20, -1, ne);
87010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(x10, x20, 0, ne);
87020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(x11, x20, 1, ne);
87030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(x12, x20, 2, ne);
87040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(x13, x20, Operand(x20, ASR, 63), ne);
87050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(x14, x20, Operand(x20, ROR, 1), ne);
87060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Csel(x15, x20, 3, eq);
87070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
87090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
87110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(-2, w0);
87130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(-1, w1);
87140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w2);
87150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(1, w3);
87160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(2, w4);
87170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(-1, w5);
87180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x40000000, w6);
87190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x80000000, w7);
87200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(-2, x8);
87220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(-1, x9);
87230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x10);
87240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x11);
87250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x12);
87260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(-1, x13);
87270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x4000000000000000, x14);
87280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x15);
87290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
87310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
87320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87340cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(lslv) {
87350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
87360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
87370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t value = 0x0123456789abcdef;
87390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
87400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
87420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, value);
87430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, shift[0]);
87440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w2, shift[1]);
87450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, shift[2]);
87460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w4, shift[3]);
87470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w5, shift[4]);
87480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w6, shift[5]);
87490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler does not allow zr as an argument.
87510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ lslv(x0, x0, xzr);
87520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(x16, x0, x1);
87540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(x17, x0, x2);
87550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(x18, x0, x3);
87560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(x19, x0, x4);
87570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(x20, x0, x5);
87580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(x21, x0, x6);
87590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(w22, w0, w1);
87610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(w23, w0, w2);
87620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(w24, w0, w3);
87630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(w25, w0, w4);
87640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(w26, w0, w5);
87650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(w27, w0, w6);
87660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
87670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
87690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value, x0);
87710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value << (shift[0] & 63), x16);
87720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value << (shift[1] & 63), x17);
87730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value << (shift[2] & 63), x18);
87740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value << (shift[3] & 63), x19);
87750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value << (shift[4] & 63), x20);
87760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value << (shift[5] & 63), x21);
87770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value << (shift[0] & 31), w22);
87780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value << (shift[1] & 31), w23);
87790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value << (shift[2] & 31), w24);
87800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value << (shift[3] & 31), w25);
87810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value << (shift[4] & 31), w26);
87820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value << (shift[5] & 31), w27);
87830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
87850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
87860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87880cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(lsrv) {
87890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
87900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
87910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t value = 0x0123456789abcdef;
87930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
87940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
87950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
87960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, value);
87970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, shift[0]);
87980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w2, shift[1]);
87990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, shift[2]);
88000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w4, shift[3]);
88010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w5, shift[4]);
88020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w6, shift[5]);
88030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler does not allow zr as an argument.
88050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ lsrv(x0, x0, xzr);
88060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(x16, x0, x1);
88080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(x17, x0, x2);
88090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(x18, x0, x3);
88100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(x19, x0, x4);
88110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(x20, x0, x5);
88120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(x21, x0, x6);
88130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(w22, w0, w1);
88150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(w23, w0, w2);
88160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(w24, w0, w3);
88170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(w25, w0, w4);
88180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(w26, w0, w5);
88190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(w27, w0, w6);
88200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
88210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
88230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value, x0);
88250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[0] & 63), x16);
88260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[1] & 63), x17);
88270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[2] & 63), x18);
88280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[3] & 63), x19);
88290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[4] & 63), x20);
88300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[5] & 63), x21);
88310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  value &= 0xffffffff;
88330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value >> (shift[0] & 31), w22);
88340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value >> (shift[1] & 31), w23);
88350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value >> (shift[2] & 31), w24);
88360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value >> (shift[3] & 31), w25);
88370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value >> (shift[4] & 31), w26);
88380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value >> (shift[5] & 31), w27);
88390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
88410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
88420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88440cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(asrv) {
88450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
88460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
88470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t value = 0xfedcba98fedcba98;
88490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int shift[] = {1, 3, 5, 9, 17, 33};
88500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
88520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, value);
88530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, shift[0]);
88540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w2, shift[1]);
88550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, shift[2]);
88560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w4, shift[3]);
88570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w5, shift[4]);
88580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w6, shift[5]);
88590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler does not allow zr as an argument.
88610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ asrv(x0, x0, xzr);
88620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(x16, x0, x1);
88640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(x17, x0, x2);
88650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(x18, x0, x3);
88660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(x19, x0, x4);
88670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(x20, x0, x5);
88680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(x21, x0, x6);
88690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(w22, w0, w1);
88710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(w23, w0, w2);
88720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(w24, w0, w3);
88730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(w25, w0, w4);
88740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(w26, w0, w5);
88750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(w27, w0, w6);
88760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
88770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
88790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value, x0);
88810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[0] & 63), x16);
88820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[1] & 63), x17);
88830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[2] & 63), x18);
88840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[3] & 63), x19);
88850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[4] & 63), x20);
88860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value >> (shift[5] & 63), x21);
88870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int32_t value32 = static_cast<int32_t>(value & 0xffffffff);
88890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value32 >> (shift[0] & 31), w22);
88900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value32 >> (shift[1] & 31), w23);
88910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value32 >> (shift[2] & 31), w24);
88920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value32 >> (shift[3] & 31), w25);
88930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value32 >> (shift[4] & 31), w26);
88940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(value32 >> (shift[5] & 31), w27);
88950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
88970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
88980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
88990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89000cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(rorv) {
89010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
89020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
89030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t value = 0x0123456789abcdef;
89050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int shift[] = {4, 8, 12, 16, 24, 36};
89060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
89080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, value);
89090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, shift[0]);
89100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w2, shift[1]);
89110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, shift[2]);
89120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w4, shift[3]);
89130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w5, shift[4]);
89140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w6, shift[5]);
89150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler does not allow zr as an argument.
89170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ rorv(x0, x0, xzr);
89180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x16, x0, x1);
89200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x17, x0, x2);
89210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x18, x0, x3);
89220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x19, x0, x4);
89230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x20, x0, x5);
89240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x21, x0, x6);
89250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w22, w0, w1);
89270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w23, w0, w2);
89280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w24, w0, w3);
89290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w25, w0, w4);
89300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w26, w0, w5);
89310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w27, w0, w6);
89320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
89330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
89350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(value, x0);
89370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xf0123456789abcde, x16);
89380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xef0123456789abcd, x17);
89390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xdef0123456789abc, x18);
89400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xcdef0123456789ab, x19);
89410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xabcdef0123456789, x20);
89420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x789abcdef0123456, x21);
89430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xf89abcde, w22);
89440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xef89abcd, w23);
89450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xdef89abc, w24);
89460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xcdef89ab, w25);
89470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xabcdef89, w26);
89480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xf89abcde, w27);
89490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
89510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
89520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89540cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(bfm) {
89550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
89560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
89570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
89590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x0123456789abcdef);
89600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, 0x8888888888888888);
89620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, 0x8888888888888888);
89630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x12, 0x8888888888888888);
89640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x13, 0x8888888888888888);
89650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w20, 0x88888888);
89660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w21, 0x88888888);
89670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // There are no macro instruction for bfm.
89690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bfm(x10, x1, 16, 31);
89700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bfm(x11, x1, 32, 15);
89710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bfm(w20, w1, 16, 23);
89730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bfm(w21, w1, 24, 15);
89740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Aliases.
89760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bfi(x12, x1, 16, 8);
89770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bfxil(x13, x1, 16, 8);
89780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
89790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
89810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x88888888888889ab, x10);
89840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8888cdef88888888, x11);
89850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x888888ab, w20);
89870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x88cdef88, w21);
89880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8888888888ef8888, x12);
89900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x88888888888888ab, x13);
89910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
89930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
89940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
89960cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(sbfm) {
89970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
89980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
89990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
90010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x0123456789abcdef);
90020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0xfedcba9876543210);
90030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // There are no macro instruction for sbfm.
90050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfm(x10, x1, 16, 31);
90060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfm(x11, x1, 32, 15);
90070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfm(x12, x1, 32, 47);
90080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfm(x13, x1, 48, 35);
90090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfm(w14, w1, 16, 23);
90110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfm(w15, w1, 24, 15);
90120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfm(w16, w2, 16, 23);
90130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfm(w17, w2, 24, 15);
90140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Aliases.
90160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(x18, x1, 32);
90170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Asr(x19, x2, 32);
90180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfiz(x20, x1, 8, 16);
90190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfiz(x21, x2, 8, 16);
90200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfx(x22, x1, 8, 16);
90210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sbfx(x23, x2, 8, 16);
90220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtb(x24, w1);
90230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtb(x25, x2);
90240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxth(x26, w1);
90250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxth(x27, x2);
90260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtw(x28, w1);
90270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtw(x29, x2);
90280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
90290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
90310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffff89ab, x10);
90340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffcdef00000000, x11);
90350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000004567, x12);
90360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000789abcdef0000, x13);
90370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffffffab, w14);
90390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xffcdef00, w15);
90400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00000054, w16);
90410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00321000, w17);
90420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000001234567, x18);
90440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffedcba98, x19);
90450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffcdef00, x20);
90460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000321000, x21);
90470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffabcd, x22);
90480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000005432, x23);
90490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffef, x24);
90500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000000010, x25);
90510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffcdef, x26);
90520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000003210, x27);
90530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff89abcdef, x28);
90540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000076543210, x29);
90550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
90570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
90580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90600cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ubfm) {
90610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
90620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
90630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
90650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x0123456789abcdef);
90660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0xfedcba9876543210);
90670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, 0x8888888888888888);
90690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, 0x8888888888888888);
90700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // There are no macro instruction for ubfm.
90720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfm(x10, x1, 16, 31);
90730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfm(x11, x1, 32, 15);
90740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfm(x12, x1, 32, 47);
90750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfm(x13, x1, 48, 35);
90760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfm(w25, w1, 16, 23);
90780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfm(w26, w1, 24, 15);
90790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfm(w27, w2, 16, 23);
90800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfm(w28, w2, 24, 15);
90810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Aliases
90830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(x15, x1, 63);
90840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsl(x16, x1, 0);
90850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Lsr(x17, x1, 32);
90860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfiz(x18, x1, 8, 16);
90870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ubfx(x19, x1, 8, 16);
90880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxtb(x20, x1);
90890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxth(x21, x1);
90900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxtw(x22, x1);
90910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
90920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
90940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
90950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00000000000089ab, x10);
90960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000cdef00000000, x11);
90970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000004567, x12);
90980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000789abcdef0000, x13);
90990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x000000ab, w25);
91010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00cdef00, w26);
91020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00000054, w27);
91030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00321000, w28);
91040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x15);
91060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x16);
91070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000001234567, x17);
91080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000cdef00, x18);
91090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000000000000abcd, x19);
91100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00000000000000ef, x20);
91110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x000000000000cdef, x21);
91120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000089abcdef, x22);
91130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
91150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
91160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91180cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(extr) {
91190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
91200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
91220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x0123456789abcdef);
91230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0xfedcba9876543210);
91240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Extr(w10, w1, w2, 0);
91260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Extr(w11, w1, w2, 1);
91270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Extr(x12, x2, x1, 2);
91280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w13, w1, 0);
91300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w14, w2, 17);
91310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(w15, w1, 31);
91320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x18, x2, 0);
91330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x19, x2, 1);
91340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ror(x20, x1, 63);
91350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
91360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
91380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x76543210, x10);
91400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbb2a1908, x11);
91410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0048d159e26af37b, x12);
91420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x89abcdef, x13);
91430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x19083b2a, x14);
91440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x13579bdf, x15);
91450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfedcba9876543210, x18);
91460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7f6e5d4c3b2a1908, x19);
91470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x02468acf13579bde, x20);
91480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
91500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
91510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91530cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmov_imm) {
91540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
91550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
91570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s11, 1.0);
91580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -13.0);
91590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 255.0);
91600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d2, 12.34567);
91610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, 0.0);
91620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d4, 0.0);
91630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32PositiveInfinity);
91640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d6, kFP64NegativeInfinity);
91650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
91660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
91680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s11);
91700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-13.0, d22);
91710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(255.0, s1);
91720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(12.34567, d2);
91730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s3);
91740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d4);
91750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
91760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d6);
91770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
91790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
91800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91820cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmov_reg) {
91830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
91840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
91860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 1.0);
91870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(w10, s20);
91880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s30, w10);
91890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, s20);
91900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d1, -13.0);
91910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(x1, d1);
91920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d2, x1);
91930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d4, d1);
91940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d6, rawbits_to_double(0x0123456789abcdef));
91950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, s6);
91960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
91970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d0, 0.0);
91980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v0.D(), 1, x1);
91990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(x2, v0.D(), 1);
92000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
92020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
92040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(float_to_rawbits(1.0), w10);
92060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s30);
92070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s5);
92080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(double_to_rawbits(-13.0), x1);
92090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-13.0, d2);
92100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-13.0, d4);
92110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(0x89abcdef), s6);
92120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(double_to_rawbits(-13.0), 0x0000000000000000, q0);
92130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(double_to_rawbits(-13.0), x2);
92140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
92150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
92160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92180cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fadd) {
92190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
92200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
92220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s14, -0.0f);
92230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s15, kFP32PositiveInfinity);
92240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, kFP32NegativeInfinity);
92250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 3.25f);
92260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.0f);
92270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 0.0f);
92280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
92300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
92310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
92320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0.0);
92330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d30, -2.0);
92340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d31, 2.25);
92350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(s0, s17, s18);
92370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(s1, s18, s19);
92380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(s2, s14, s18);
92390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(s3, s15, s18);
92400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(s4, s16, s18);
92410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(s5, s15, s16);
92420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(s6, s16, s15);
92430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(d7, d30, d31);
92450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(d8, d29, d31);
92460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(d9, d26, d31);
92470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(d10, d27, d31);
92480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(d11, d28, d31);
92490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(d12, d27, d28);
92500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(d13, d28, d27);
92510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
92520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
92540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(4.25, s0);
92560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
92570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s2);
92580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s3);
92590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s4);
92600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s5);
92610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
92620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.25, d7);
92630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.25, d8);
92640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.25, d9);
92650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d10);
92660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d11);
92670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d12);
92680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
92690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
92710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
92720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92740cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fsub) {
92750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
92760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
92780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s14, -0.0f);
92790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s15, kFP32PositiveInfinity);
92800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, kFP32NegativeInfinity);
92810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 3.25f);
92820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.0f);
92830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 0.0f);
92840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
92860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
92870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
92880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0.0);
92890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d30, -2.0);
92900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d31, 2.25);
92910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
92920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(s0, s17, s18);
92930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(s1, s18, s19);
92940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(s2, s14, s18);
92950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(s3, s18, s15);
92960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(s4, s18, s16);
92970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(s5, s15, s15);
92980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(s6, s16, s16);
92990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(d7, d30, d31);
93010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(d8, d29, d31);
93020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(d9, d26, d31);
93030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(d10, d31, d27);
93040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(d11, d31, d28);
93050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(d12, d27, d27);
93060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(d13, d28, d28);
93070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
93080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
93100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.25, s0);
93120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
93130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-1.0, s2);
93140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s3);
93150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s4);
93160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s5);
93170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
93180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-4.25, d7);
93190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.25, d8);
93200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.25, d9);
93210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d10);
93220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d11);
93230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d12);
93240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
93250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
93270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
93280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93300cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmul) {
93310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
93320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
93340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s14, -0.0f);
93350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s15, kFP32PositiveInfinity);
93360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, kFP32NegativeInfinity);
93370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 3.25f);
93380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 2.0f);
93390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 0.0f);
93400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, -2.0f);
93410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
93430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
93440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
93450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0.0);
93460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d30, -2.0);
93470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d31, 2.25);
93480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(s0, s17, s18);
93500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(s1, s18, s19);
93510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(s2, s14, s14);
93520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(s3, s15, s20);
93530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(s4, s16, s20);
93540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(s5, s15, s19);
93550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(s6, s19, s16);
93560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(d7, d30, d31);
93580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(d8, d29, d31);
93590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(d9, d26, d26);
93600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(d10, d27, d30);
93610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(d11, d28, d30);
93620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(d12, d27, d29);
93630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(d13, d29, d28);
93640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
93650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
93670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(6.5, s0);
93690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s1);
93700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s2);
93710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s3);
93720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s4);
93730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s5);
93740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
93750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-4.5, d7);
93760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d8);
93770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d9);
93780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d10);
93790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d11);
93800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d12);
93810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
93820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
93840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
93850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93870cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void FmaddFmsubHelper(double n, double m, double a,
93880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                             double fmadd, double fmsub,
93890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                             double fnmadd, double fnmsub) {
93900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
93910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
93920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
93930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d0, n);
93940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d1, m);
93950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d2, a);
93960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmadd(d28, d0, d1, d2);
93970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmsub(d29, d0, d1, d2);
93980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fnmadd(d30, d0, d1, d2);
93990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fnmsub(d31, d0, d1, d2);
94000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
94020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
94030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(fmadd, d28);
94050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(fmsub, d29);
94060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(fnmadd, d30);
94070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(fnmsub, d31);
94080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
94100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
94110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94130cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmadd_fmsub_double) {
94140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // It's hard to check the result of fused operations because the only way to
94150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // calculate the result is using fma, which is what the simulator uses anyway.
94160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Basic operation.
94180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(1.0, 2.0, 3.0, 5.0, 1.0, -5.0, -1.0);
94190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-1.0, 2.0, 3.0, 1.0, 5.0, -1.0, -5.0);
94200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check the sign of exact zeroes.
94220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //               n     m     a     fmadd  fmsub  fnmadd fnmsub
94230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-0.0, +0.0, -0.0, -0.0,  +0.0,  +0.0,  +0.0);
94240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(+0.0, +0.0, -0.0, +0.0,  -0.0,  +0.0,  +0.0);
94250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(+0.0, +0.0, +0.0, +0.0,  +0.0,  -0.0,  +0.0);
94260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-0.0, +0.0, +0.0, +0.0,  +0.0,  +0.0,  -0.0);
94270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(+0.0, -0.0, -0.0, -0.0,  +0.0,  +0.0,  +0.0);
94280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-0.0, -0.0, -0.0, +0.0,  -0.0,  +0.0,  +0.0);
94290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-0.0, -0.0, +0.0, +0.0,  +0.0,  -0.0,  +0.0);
94300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(+0.0, -0.0, +0.0, +0.0,  +0.0,  +0.0,  -0.0);
94310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check NaN generation.
94330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP64PositiveInfinity, 0.0, 42.0,
94340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
94350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
94360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0.0, kFP64PositiveInfinity, 42.0,
94370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
94380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
94390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP64PositiveInfinity, 1.0, kFP64PositiveInfinity,
94400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64PositiveInfinity,   //  inf + ( inf * 1) = inf
94410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN,         //  inf + (-inf * 1) = NaN
94420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64NegativeInfinity,   // -inf + (-inf * 1) = -inf
94430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN);        // -inf + ( inf * 1) = NaN
94440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP64NegativeInfinity, 1.0, kFP64PositiveInfinity,
94450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN,         //  inf + (-inf * 1) = NaN
94460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64PositiveInfinity,   //  inf + ( inf * 1) = inf
94470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN,         // -inf + ( inf * 1) = NaN
94480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64NegativeInfinity);  // -inf + (-inf * 1) = -inf
94490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
94500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94520cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void FmaddFmsubHelper(float n, float m, float a,
94530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                             float fmadd, float fmsub,
94540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                             float fnmadd, float fnmsub) {
94550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
94560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
94570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, n);
94590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, m);
94600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, a);
94610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmadd(s28, s0, s1, s2);
94620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmsub(s29, s0, s1, s2);
94630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fnmadd(s30, s0, s1, s2);
94640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fnmsub(s31, s0, s1, s2);
94650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
94670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
94680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(fmadd, s28);
94700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(fmsub, s29);
94710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(fnmadd, s30);
94720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(fnmsub, s31);
94730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
94750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
94760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94780cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmadd_fmsub_float) {
94790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // It's hard to check the result of fused operations because the only way to
94800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // calculate the result is using fma, which is what the simulator uses anyway.
94810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Basic operation.
94830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(1.0f, 2.0f, 3.0f, 5.0f, 1.0f, -5.0f, -1.0f);
94840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-1.0f, 2.0f, 3.0f, 1.0f, 5.0f, -1.0f, -5.0f);
94850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check the sign of exact zeroes.
94870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //               n      m      a      fmadd  fmsub  fnmadd fnmsub
94880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-0.0f, +0.0f, -0.0f, -0.0f, +0.0f, +0.0f, +0.0f);
94890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(+0.0f, +0.0f, -0.0f, +0.0f, -0.0f, +0.0f, +0.0f);
94900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(+0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f, +0.0f);
94910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f);
94920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(+0.0f, -0.0f, -0.0f, -0.0f, +0.0f, +0.0f, +0.0f);
94930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-0.0f, -0.0f, -0.0f, +0.0f, -0.0f, +0.0f, +0.0f);
94940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(-0.0f, -0.0f, +0.0f, +0.0f, +0.0f, -0.0f, +0.0f);
94950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(+0.0f, -0.0f, +0.0f, +0.0f, +0.0f, +0.0f, -0.0f);
94960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
94970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check NaN generation.
94980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP32PositiveInfinity, 0.0f, 42.0f,
94990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
95000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
95010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0.0f, kFP32PositiveInfinity, 42.0f,
95020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
95030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
95040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP32PositiveInfinity, 1.0f, kFP32PositiveInfinity,
95050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32PositiveInfinity,   //  inf + ( inf * 1) = inf
95060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN,         //  inf + (-inf * 1) = NaN
95070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32NegativeInfinity,   // -inf + (-inf * 1) = -inf
95080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN);        // -inf + ( inf * 1) = NaN
95090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP32NegativeInfinity, 1.0f, kFP32PositiveInfinity,
95100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN,         //  inf + (-inf * 1) = NaN
95110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32PositiveInfinity,   //  inf + ( inf * 1) = inf
95120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN,         // -inf + ( inf * 1) = NaN
95130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32NegativeInfinity);  // -inf + (-inf * 1) = -inf
95140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
95150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95170cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmadd_fmsub_double_nans) {
95180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Make sure that NaN propagation works correctly.
95190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double s1 = rawbits_to_double(0x7ff5555511111111);
95200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double s2 = rawbits_to_double(0x7ff5555522222222);
95210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sa = rawbits_to_double(0x7ff55555aaaaaaaa);
95220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double q1 = rawbits_to_double(0x7ffaaaaa11111111);
95230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double q2 = rawbits_to_double(0x7ffaaaaa22222222);
95240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa);
95250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(s1));
95260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(s2));
95270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sa));
95280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q1));
95290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q2));
95300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qa));
95310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The input NaNs after passing through ProcessNaN.
95330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double s1_proc = rawbits_to_double(0x7ffd555511111111);
95340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double s2_proc = rawbits_to_double(0x7ffd555522222222);
95350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sa_proc = rawbits_to_double(0x7ffd5555aaaaaaaa);
95360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double q1_proc = q1;
95370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double q2_proc = q2;
95380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qa_proc = qa;
95390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(s1_proc));
95400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(s2_proc));
95410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sa_proc));
95420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q1_proc));
95430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q2_proc));
95440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qa_proc));
95450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Negated NaNs as it would be done on ARMv8 hardware.
95470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double s1_proc_neg = rawbits_to_double(0xfffd555511111111);
95480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sa_proc_neg = rawbits_to_double(0xfffd5555aaaaaaaa);
95490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double q1_proc_neg = rawbits_to_double(0xfffaaaaa11111111);
95500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qa_proc_neg = rawbits_to_double(0xfffaaaaaaaaaaaaa);
95510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(s1_proc_neg));
95520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sa_proc_neg));
95530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q1_proc_neg));
95540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qa_proc_neg));
95550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Quiet NaNs are propagated.
95570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
95580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc);
95590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
95600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
95610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
95620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
95630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
95640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Signalling NaNs are propagated, and made quiet.
95660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, 0, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
95670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, s2, 0, s2_proc, s2_proc, s2_proc, s2_proc);
95680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
95690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, s2, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
95700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
95710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
95720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
95730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Signalling NaNs take precedence over quiet NaNs.
95750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, q2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
95760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, s2, qa, s2_proc, s2_proc, s2_proc, s2_proc);
95770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
95780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, s2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
95790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
95800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
95810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
95820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // A NaN generated by the intermediate op1 * op2 overrides a quiet NaN in a.
95840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, kFP64PositiveInfinity, qa,
95850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
95860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
95870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP64PositiveInfinity, 0, qa,
95880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
95890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
95900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, kFP64NegativeInfinity, qa,
95910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
95920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
95930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP64NegativeInfinity, 0, qa,
95940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN,
95950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP64DefaultNaN, kFP64DefaultNaN);
95960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
95970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
95990cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmadd_fmsub_float_nans) {
96000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Make sure that NaN propagation works correctly.
96010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float s1 = rawbits_to_float(0x7f951111);
96020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float s2 = rawbits_to_float(0x7f952222);
96030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sa = rawbits_to_float(0x7f95aaaa);
96040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float q1 = rawbits_to_float(0x7fea1111);
96050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float q2 = rawbits_to_float(0x7fea2222);
96060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qa = rawbits_to_float(0x7feaaaaa);
96070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(s1));
96080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(s2));
96090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sa));
96100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q1));
96110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q2));
96120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qa));
96130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The input NaNs after passing through ProcessNaN.
96150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float s1_proc = rawbits_to_float(0x7fd51111);
96160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float s2_proc = rawbits_to_float(0x7fd52222);
96170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sa_proc = rawbits_to_float(0x7fd5aaaa);
96180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float q1_proc = q1;
96190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float q2_proc = q2;
96200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qa_proc = qa;
96210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(s1_proc));
96220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(s2_proc));
96230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sa_proc));
96240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q1_proc));
96250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q2_proc));
96260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qa_proc));
96270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Negated NaNs as it would be done on ARMv8 hardware.
96290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float s1_proc_neg = rawbits_to_float(0xffd51111);
96300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sa_proc_neg = rawbits_to_float(0xffd5aaaa);
96310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float q1_proc_neg = rawbits_to_float(0xffea1111);
96320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qa_proc_neg = rawbits_to_float(0xffeaaaaa);
96330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(s1_proc_neg));
96340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sa_proc_neg));
96350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(q1_proc_neg));
96360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qa_proc_neg));
96370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Quiet NaNs are propagated.
96390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, 0, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
96400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, q2, 0, q2_proc, q2_proc, q2_proc, q2_proc);
96410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
96420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, q2, 0, q1_proc, q1_proc_neg, q1_proc_neg, q1_proc);
96430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
96440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, 0, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
96450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(q1, q2, qa, qa_proc, qa_proc, qa_proc_neg, qa_proc_neg);
96460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Signalling NaNs are propagated, and made quiet.
96480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, 0, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
96490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, s2, 0, s2_proc, s2_proc, s2_proc, s2_proc);
96500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
96510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, s2, 0, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
96520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
96530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, 0, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
96540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
96550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Signalling NaNs take precedence over quiet NaNs.
96570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(s1, q2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
96581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  FmaddFmsubHelper(q1, s2, qa, s2_proc, s2_proc, s2_proc, s2_proc);
9659ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
9660ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, qa, s1_proc, s1_proc_neg, s1_proc_neg, s1_proc);
9661ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(q1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
9662ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, q2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
9663ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  FmaddFmsubHelper(s1, s2, sa, sa_proc, sa_proc, sa_proc_neg, sa_proc_neg);
96641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
96650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // A NaN generated by the intermediate op1 * op2 overrides a quiet NaN in a.
96660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, kFP32PositiveInfinity, qa,
96670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
96680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
96690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP32PositiveInfinity, 0, qa,
96700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
96710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
96720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(0, kFP32NegativeInfinity, qa,
96730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
96740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
96750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FmaddFmsubHelper(kFP32NegativeInfinity, 0, qa,
96760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN,
96770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                   kFP32DefaultNaN, kFP32DefaultNaN);
96780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
96790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fdiv) {
96820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
96830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
96850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s14, -0.0f);
96860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s15, kFP32PositiveInfinity);
96870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, kFP32NegativeInfinity);
96880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 3.25f);
96890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 2.0f);
96900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 2.0f);
96910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, -2.0f);
96920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
96930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
96940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
96950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
96960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0.0);
96970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d30, -2.0);
96980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d31, 2.25);
96990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(s0, s17, s18);
97010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(s1, s18, s19);
97020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(s2, s14, s18);
97030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(s3, s18, s15);
97040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(s4, s18, s16);
97050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(s5, s15, s16);
97060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(s6, s14, s14);
97070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(d7, d31, d30);
97090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(d8, d29, d31);
97100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(d9, d26, d31);
97110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(d10, d31, d27);
97120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(d11, d31, d28);
97130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(d12, d28, d27);
97140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(d13, d29, d29);
97150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
97160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
97180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.625f, s0);
97200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0f, s1);
97210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0f, s2);
97220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0f, s3);
97230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0f, s4);
97240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s5);
97250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
97260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-1.125, d7);
97270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d8);
97280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d9);
97290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d10);
97300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d11);
97310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d12);
97320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
97330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
97350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
97360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97380cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic float MinMaxHelper(float n,
97390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                          float m,
97400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                          bool min,
97410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                          float quiet_nan_substitute = 0.0) {
97420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kFP32QuietNaNMask = 0x00400000;
97430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t raw_n = float_to_rawbits(n);
97440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t raw_m = float_to_rawbits(m);
97450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (std::isnan(n) && ((raw_n & kFP32QuietNaNMask) == 0)) {
97470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // n is signalling NaN.
97480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    return rawbits_to_float(raw_n | kFP32QuietNaNMask);
97490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  } else if (std::isnan(m) && ((raw_m & kFP32QuietNaNMask) == 0)) {
97500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // m is signalling NaN.
97510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    return rawbits_to_float(raw_m | kFP32QuietNaNMask);
97520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  } else if (quiet_nan_substitute == 0.0) {
97530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (std::isnan(n)) {
97540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // n is quiet NaN.
97550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      return n;
97560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else if (std::isnan(m)) {
97570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // m is quiet NaN.
97580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      return m;
97590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
97600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  } else {
97610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Substitute n or m if one is quiet, but not both.
97620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (std::isnan(n) && !std::isnan(m)) {
97630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // n is quiet NaN: replace with substitute.
97640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      n = quiet_nan_substitute;
97650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else if (!std::isnan(n) && std::isnan(m)) {
97660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // m is quiet NaN: replace with substitute.
97670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      m = quiet_nan_substitute;
97680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
97690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
97700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if ((n == 0.0) && (m == 0.0) &&
97720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      (copysign(1.0, n) != copysign(1.0, m))) {
97730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    return min ? -0.0 : 0.0;
97740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
97750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  return min ? fminf(n, m) : fmaxf(n, m);
97770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
97780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97800cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic double MinMaxHelper(double n,
97810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                           double m,
97820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                           bool min,
97830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                           double quiet_nan_substitute = 0.0) {
97840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kFP64QuietNaNMask = 0x0008000000000000;
97850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t raw_n = double_to_rawbits(n);
97860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t raw_m = double_to_rawbits(m);
97870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
97880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (std::isnan(n) && ((raw_n & kFP64QuietNaNMask) == 0)) {
97890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // n is signalling NaN.
97900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    return rawbits_to_double(raw_n | kFP64QuietNaNMask);
97910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  } else if (std::isnan(m) && ((raw_m & kFP64QuietNaNMask) == 0)) {
97920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // m is signalling NaN.
97930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    return rawbits_to_double(raw_m | kFP64QuietNaNMask);
97940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  } else if (quiet_nan_substitute == 0.0) {
97950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (std::isnan(n)) {
97960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // n is quiet NaN.
97970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      return n;
97980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else if (std::isnan(m)) {
97990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // m is quiet NaN.
98000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      return m;
98010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
98020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  } else {
98030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Substitute n or m if one is quiet, but not both.
98040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (std::isnan(n) && !std::isnan(m)) {
98050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // n is quiet NaN: replace with substitute.
98060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      n = quiet_nan_substitute;
98070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else if (!std::isnan(n) && std::isnan(m)) {
98080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // m is quiet NaN: replace with substitute.
98090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      m = quiet_nan_substitute;
98100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
98110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
98120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if ((n == 0.0) && (m == 0.0) &&
98140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      (copysign(1.0, n) != copysign(1.0, m))) {
98150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    return min ? -0.0 : 0.0;
98160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
98170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  return min ? fmin(n, m) : fmax(n, m);
98190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
98200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98220cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void FminFmaxDoubleHelper(double n, double m, double min, double max,
98230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                 double minnm, double maxnm) {
98240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
98250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
98270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d0, n);
98280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d1, m);
98290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmin(d28, d0, d1);
98300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmax(d29, d0, d1);
98310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminnm(d30, d0, d1);
98320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxnm(d31, d0, d1);
98330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
98340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
98360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(min, d28);
98380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(max, d29);
98390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(minnm, d30);
98400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(maxnm, d31);
98410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
98430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
98440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98460cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmax_fmin_d) {
98470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Use non-standard NaNs to check that the payload bits are preserved.
98480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double snan = rawbits_to_double(0x7ff5555512345678);
98490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qnan = rawbits_to_double(0x7ffaaaaa87654321);
98500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double snan_processed = rawbits_to_double(0x7ffd555512345678);
98520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qnan_processed = qnan;
98530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(snan));
98550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qnan));
98560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(snan_processed));
98570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qnan_processed));
98580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Bootstrap tests.
98600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(0, 0, 0, 0, 0, 0);
98610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(0, 1, 0, 1, 0, 1);
98620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(kFP64PositiveInfinity, kFP64NegativeInfinity,
98630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       kFP64NegativeInfinity, kFP64PositiveInfinity,
98640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       kFP64NegativeInfinity, kFP64PositiveInfinity);
98650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(snan, 0,
98660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       snan_processed, snan_processed,
98670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       snan_processed, snan_processed);
98680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(0, snan,
98690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       snan_processed, snan_processed,
98700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       snan_processed, snan_processed);
98710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(qnan, 0,
98720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       qnan_processed, qnan_processed,
98730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       0, 0);
98740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(0, qnan,
98750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       qnan_processed, qnan_processed,
98760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       0, 0);
98770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(qnan, snan,
98780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       snan_processed, snan_processed,
98790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       snan_processed, snan_processed);
98800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxDoubleHelper(snan, qnan,
98810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       snan_processed, snan_processed,
98820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                       snan_processed, snan_processed);
98830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Iterate over all combinations of inputs.
98850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double inputs[] = { DBL_MAX, DBL_MIN, 1.0, 0.0,
98860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      -DBL_MAX, -DBL_MIN, -1.0, -0.0,
98870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      kFP64PositiveInfinity, kFP64NegativeInfinity,
98880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      kFP64QuietNaN, kFP64SignallingNaN };
98890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int count = sizeof(inputs) / sizeof(inputs[0]);
98910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
98920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int in = 0; in < count; in++) {
98930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    double n = inputs[in];
98940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int im = 0; im < count; im++) {
98950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      double m = inputs[im];
98960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      FminFmaxDoubleHelper(n, m,
98970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                           MinMaxHelper(n, m, true),
98980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                           MinMaxHelper(n, m, false),
98990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                           MinMaxHelper(n, m, true, kFP64PositiveInfinity),
99000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                           MinMaxHelper(n, m, false, kFP64NegativeInfinity));
99010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
99020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
99030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
99040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99060cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void FminFmaxFloatHelper(float n, float m, float min, float max,
99070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                float minnm, float maxnm) {
99080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
99090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
99110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, n);
99120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, m);
99130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmin(s28, s0, s1);
99140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmax(s29, s0, s1);
99150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminnm(s30, s0, s1);
99160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxnm(s31, s0, s1);
99170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
99180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
99200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(min, s28);
99220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(max, s29);
99230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(minnm, s30);
99240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(maxnm, s31);
99250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
99270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
99280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99300cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fmax_fmin_s) {
99310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Use non-standard NaNs to check that the payload bits are preserved.
99320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float snan = rawbits_to_float(0x7f951234);
99330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qnan = rawbits_to_float(0x7fea8765);
99340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float snan_processed = rawbits_to_float(0x7fd51234);
99360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qnan_processed = qnan;
99370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(snan));
99390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qnan));
99400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(snan_processed));
99410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qnan_processed));
99420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Bootstrap tests.
99440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(0, 0, 0, 0, 0, 0);
99450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(0, 1, 0, 1, 0, 1);
99460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(kFP32PositiveInfinity, kFP32NegativeInfinity,
99470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      kFP32NegativeInfinity, kFP32PositiveInfinity,
99480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      kFP32NegativeInfinity, kFP32PositiveInfinity);
99490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(snan, 0,
99500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      snan_processed, snan_processed,
99510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      snan_processed, snan_processed);
99520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(0, snan,
99530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      snan_processed, snan_processed,
99540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      snan_processed, snan_processed);
99550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(qnan, 0,
99560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      qnan_processed, qnan_processed,
99570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      0, 0);
99580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(0, qnan,
99590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      qnan_processed, qnan_processed,
99600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      0, 0);
99610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(qnan, snan,
99620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      snan_processed, snan_processed,
99630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      snan_processed, snan_processed);
99640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FminFmaxFloatHelper(snan, qnan,
99650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      snan_processed, snan_processed,
99660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      snan_processed, snan_processed);
99670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Iterate over all combinations of inputs.
99690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float inputs[] = { FLT_MAX, FLT_MIN, 1.0, 0.0,
99700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     -FLT_MAX, -FLT_MIN, -1.0, -0.0,
99710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     kFP32PositiveInfinity, kFP32NegativeInfinity,
99720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                     kFP32QuietNaN, kFP32SignallingNaN };
99730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int count = sizeof(inputs) / sizeof(inputs[0]);
99750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int in = 0; in < count; in++) {
99770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    float n = inputs[in];
99780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int im = 0; im < count; im++) {
99790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      float m = inputs[im];
99800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      FminFmaxFloatHelper(n, m,
99810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                          MinMaxHelper(n, m, true),
99820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                          MinMaxHelper(n, m, false),
99830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                          MinMaxHelper(n, m, true, kFP32PositiveInfinity),
99840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                          MinMaxHelper(n, m, false, kFP32NegativeInfinity));
99850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
99860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
99870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
99880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99900cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fccmp) {
99910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
99920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
99930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
99940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
99950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 0.0);
99960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 0.5);
99970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, -0.5);
99980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, -1.0);
99990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, 0);
100000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, 0x7ff0000000000001);  // Double precision NaN.
100010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, x21);
100020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w22, 0x7f800001);  // Single precision NaN.
100030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, w22);
100040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmp(s16, s16, NoFlag, eq);
100070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x0, NZCV);
100080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmp(s16, s16, VFlag, ne);
100110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x1, NZCV);
100120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmp(s16, s17, CFlag, ge);
100150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x2, NZCV);
100160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmp(s16, s17, CVFlag, lt);
100190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x3, NZCV);
100200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmp(d18, d18, ZFlag, le);
100230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x4, NZCV);
100240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmp(d18, d18, ZVFlag, gt);
100270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x5, NZCV);
100280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmp(d18, d19, ZCVFlag, ls);
100310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x6, NZCV);
100320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmp(d18, d19, NFlag, hi);
100350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x7, NZCV);
100360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The Macro Assembler does not allow al or nv as condition.
100380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ fccmp(s16, s16, NFlag, al);
100390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x8, NZCV);
100400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ fccmp(d18, d18, NFlag, nv);
100420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x9, NZCV);
100430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmpe(s16, s16, NoFlag, eq);
100460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x10, NZCV);
100470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmpe(d18, d19, ZCVFlag, ls);
100500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x11, NZCV);
100510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmpe(d21, d21, NoFlag, eq);
100540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x12, NZCV);
100550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x20, 0);
100570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fccmpe(s22, s22, NoFlag, eq);
100580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x13, NZCV);
100590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
100600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
100620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
100640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(VFlag, w1);
100650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w2);
100660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w3);
100670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w4);
100680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZVFlag, w5);
100690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CFlag, w6);
100700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w7);
100710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w8);
100720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w9);
100730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w10);
100740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CFlag, w11);
100750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w12);
100760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w13);
100770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
100790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
100800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100820cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcmp) {
100830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
100840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
100860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Some of these tests require a floating-point scratch register assigned to
100880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // the macro assembler, but most do not.
100890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
100900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    UseScratchRegisterScope temps(&masm);
100910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    temps.ExcludeAll();
100920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    temps.Include(ip0, ip1);
100930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(s8, 0.0);
100950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(s9, 0.5);
100960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(w18, 0x7f800001);  // Single precision NaN.
100970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(s18, w18);
100980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
100990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(s8, s8);
101000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x0, NZCV);
101010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(s8, s9);
101020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x1, NZCV);
101030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(s9, s8);
101040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x2, NZCV);
101050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(s8, s18);
101060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x3, NZCV);
101070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(s18, s18);
101080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x4, NZCV);
101090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(s8, 0.0);
101100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x5, NZCV);
101110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    temps.Include(d0);
101120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(s8, 255.0);
101130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    temps.Exclude(d0);
101140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x6, NZCV);
101150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(d19, 0.0);
101170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(d20, 0.5);
101180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(x21, 0x7ff0000000000001);  // Double precision NaN.
101190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(d21, x21);
101200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(d19, d19);
101220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x10, NZCV);
101230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(d19, d20);
101240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x11, NZCV);
101250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(d20, d19);
101260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x12, NZCV);
101270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(d19, d21);
101280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x13, NZCV);
101290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(d21, d21);
101300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x14, NZCV);
101310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(d19, 0.0);
101320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x15, NZCV);
101330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    temps.Include(d0);
101340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmp(d19, 12.3456);
101350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    temps.Exclude(d0);
101360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x16, NZCV);
101370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmpe(s8, s8);
101390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x22, NZCV);
101400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmpe(s8, 0.0);
101410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x23, NZCV);
101420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmpe(d19, d19);
101430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x24, NZCV);
101440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmpe(d19, 0.0);
101450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x25, NZCV);
101460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmpe(s18, s18);
101470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x26, NZCV);
101480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcmpe(d21, d21);
101490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mrs(x27, NZCV);
101500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
101510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
101530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
101550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w0);
101570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w1);
101580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CFlag, w2);
101590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w3);
101600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w4);
101610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w5);
101620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w6);
101630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w10);
101640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w11);
101650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CFlag, w12);
101660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w13);
101670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w14);
101680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w15);
101690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w16);
101700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w22);
101710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w23);
101720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w24);
101730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w25);
101740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w26);
101750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(CVFlag, w27);
101760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
101780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
101790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcsel) {
101820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
101830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
101840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
101860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x16, 0);
101870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
101880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 2.0);
101890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 3.0);
101900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 4.0);
101910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
101920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x16, 0);
101930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcsel(s0, s16, s17, eq);
101940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcsel(s1, s16, s17, ne);
101950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcsel(d2, d18, d19, eq);
101960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcsel(d3, d18, d19, ne);
101970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The Macro Assembler does not allow al or nv as condition.
101980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ fcsel(s4, s16, s17, al);
101990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ fcsel(d5, d18, d19, nv);
102000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
102010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
102030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
102050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s1);
102060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(3.0, d2);
102070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(4.0, d3);
102080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s4);
102090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(3.0, d5);
102100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
102120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
102130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102150cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fneg) {
102160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
102170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
102190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
102200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 0.0);
102210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, kFP32PositiveInfinity);
102220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.0);
102230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 0.0);
102240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, kFP64PositiveInfinity);
102250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s0, s16);
102270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s1, s0);
102280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s2, s17);
102290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s3, s2);
102300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s4, s18);
102310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s5, s4);
102320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d6, d19);
102330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d7, d6);
102340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d8, d20);
102350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d9, d8);
102360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d10, d21);
102370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d11, d10);
102380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
102390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
102410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-1.0, s0);
102430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
102440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s2);
102450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s3);
102460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s4);
102470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
102480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-1.0, d6);
102490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d7);
102500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d8);
102510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d9);
102520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d10);
102530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d11);
102540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
102560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
102570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102590cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fabs) {
102600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
102610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
102630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, -1.0);
102640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, -0.0);
102650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, kFP32NegativeInfinity);
102660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, -1.0);
102670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, -0.0);
102680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, kFP64NegativeInfinity);
102690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(s0, s16);
102710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(s1, s0);
102720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(s2, s17);
102730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(s3, s18);
102740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(d4, d19);
102750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(d5, d4);
102760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(d6, d20);
102770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(d7, d21);
102780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
102790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
102810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
102830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
102840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s2);
102850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s3);
102860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d4);
102870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d5);
102880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d6);
102890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d7);
102900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
102920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
102930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102950cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fsqrt) {
102960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
102970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
102980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
102990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 0.0);
103000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.0);
103010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 0.25);
103020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 65536.0);
103030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, -0.0);
103040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32PositiveInfinity);
103050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -1.0);
103060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, 0.0);
103070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.0);
103080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.25);
103090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, 4294967296.0);
103100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, -0.0);
103110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64PositiveInfinity);
103120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, -1.0);
103130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s0, s16);
103150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s1, s17);
103160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s2, s18);
103170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s3, s19);
103180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s4, s20);
103190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s5, s21);
103200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s6, s22);
103210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d7, d23);
103220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d8, d24);
103230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d9, d25);
103240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d10, d26);
103250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d11, d27);
103260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d12, d28);
103270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d13, d29);
103280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
103290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
103310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s0);
103330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
103340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.5, s2);
103350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(256.0, s3);
103360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s4);
103370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s5);
103380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s6);
103390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d7);
103400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d8);
103410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.5, d9);
103420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(65536.0, d10);
103430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d11);
103440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP32PositiveInfinity, d12);
103450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
103460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
103480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
103490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103510cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(frinta) {
103520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
103530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
103550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
103560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
103570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
103580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 1.9);
103590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 2.5);
103600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, -1.5);
103610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -2.5);
103620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
103630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
103640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s25, 0.0);
103650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s26, -0.0);
103660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s27, -0.2);
103670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s0, s16);
103690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s1, s17);
103700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s2, s18);
103710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s3, s19);
103720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s4, s20);
103730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s5, s21);
103740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s6, s22);
103750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s7, s23);
103760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s8, s24);
103770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s9, s25);
103780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s10, s26);
103790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s11, s27);
103800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d16, 1.0);
103820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d17, 1.1);
103830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 1.5);
103840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.9);
103850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 2.5);
103860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, -1.5);
103870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -2.5);
103880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
103890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
103900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.0);
103910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
103920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, -0.2);
103930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
103940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d12, d16);
103950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d13, d17);
103960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d14, d18);
103970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d15, d19);
103980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d16, d20);
103990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d17, d21);
104000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d18, d22);
104010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d19, d23);
104020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d20, d24);
104030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d21, d25);
104040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d22, d26);
104050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d23, d27);
104060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
104070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
104090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
104110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
104120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
104130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
104140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(3.0, s4);
104150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
104160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-3.0, s6);
104170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
104180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
104190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
104200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
104210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s11);
104220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
104230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
104240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
104250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
104260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(3.0, d16);
104270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
104280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-3.0, d18);
104290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
104300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
104310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
104320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
104330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d23);
104340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
104360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
104370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104390cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(frinti) {
104400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // VIXL only supports the round-to-nearest FPCR mode, so this test has the
104410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // same results as frintn.
104420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
104430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
104450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
104460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
104470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
104480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 1.9);
104490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 2.5);
104500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, -1.5);
104510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -2.5);
104520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
104530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
104540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s25, 0.0);
104550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s26, -0.0);
104560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s27, -0.2);
104570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s0, s16);
104590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s1, s17);
104600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s2, s18);
104610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s3, s19);
104620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s4, s20);
104630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s5, s21);
104640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s6, s22);
104650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s7, s23);
104660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s8, s24);
104670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s9, s25);
104680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s10, s26);
104690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(s11, s27);
104700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d16, 1.0);
104720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d17, 1.1);
104730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 1.5);
104740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.9);
104750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 2.5);
104760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, -1.5);
104770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -2.5);
104780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
104790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
104800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.0);
104810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
104820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, -0.2);
104830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d12, d16);
104850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d13, d17);
104860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d14, d18);
104870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d15, d19);
104880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d16, d20);
104890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d17, d21);
104900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d18, d22);
104910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d19, d23);
104920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d20, d24);
104930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d21, d25);
104940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d22, d26);
104950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinti(d23, d27);
104960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
104970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
104980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
104990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
105010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
105020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
105030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
105040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
105050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
105060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
105070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
105080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
105090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
105100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
105110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s11);
105120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
105130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
105140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
105150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
105160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d16);
105170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
105180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d18);
105190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
105200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
105210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
105220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
105230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d23);
105240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
105260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
105270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105290cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(frintm) {
105300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
105310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
105330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
105340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
105350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
105360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 1.9);
105370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 2.5);
105380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, -1.5);
105390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -2.5);
105400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
105410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
105420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s25, 0.0);
105430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s26, -0.0);
105440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s27, -0.2);
105450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s0, s16);
105470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s1, s17);
105480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s2, s18);
105490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s3, s19);
105500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s4, s20);
105510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s5, s21);
105520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s6, s22);
105530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s7, s23);
105540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s8, s24);
105550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s9, s25);
105560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s10, s26);
105570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(s11, s27);
105580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d16, 1.0);
105600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d17, 1.1);
105610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 1.5);
105620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.9);
105630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 2.5);
105640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, -1.5);
105650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -2.5);
105660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
105670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
105680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.0);
105690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
105700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, -0.2);
105710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d12, d16);
105730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d13, d17);
105740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d14, d18);
105750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d15, d19);
105760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d16, d20);
105770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d17, d21);
105780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d18, d22);
105790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d19, d23);
105800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d20, d24);
105810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d21, d25);
105820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d22, d26);
105830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintm(d23, d27);
105840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
105850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
105870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
105880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
105890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
105900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s2);
105910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s3);
105920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
105930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
105940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-3.0, s6);
105950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
105960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
105970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
105980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
105990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-1.0, s11);
106000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
106010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
106020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d14);
106030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d15);
106040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d16);
106050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
106060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-3.0, d18);
106070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
106080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
106090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
106100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
106110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-1.0, d23);
106120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
106140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
106150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106170cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(frintn) {
106180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
106190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
106210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
106220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
106230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
106240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 1.9);
106250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 2.5);
106260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, -1.5);
106270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -2.5);
106280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
106290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
106300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s25, 0.0);
106310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s26, -0.0);
106320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s27, -0.2);
106330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s0, s16);
106350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s1, s17);
106360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s2, s18);
106370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s3, s19);
106380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s4, s20);
106390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s5, s21);
106400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s6, s22);
106410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s7, s23);
106420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s8, s24);
106430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s9, s25);
106440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s10, s26);
106450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s11, s27);
106460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d16, 1.0);
106480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d17, 1.1);
106490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 1.5);
106500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.9);
106510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 2.5);
106520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, -1.5);
106530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -2.5);
106540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
106550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
106560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.0);
106570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
106580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, -0.2);
106590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d12, d16);
106610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d13, d17);
106620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d14, d18);
106630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d15, d19);
106640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d16, d20);
106650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d17, d21);
106660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d18, d22);
106670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d19, d23);
106680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d20, d24);
106690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d21, d25);
106700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d22, d26);
106710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d23, d27);
106720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
106730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
106750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
106760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
106770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
106780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
106790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
106800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
106810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
106820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
106830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
106840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
106850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
106860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
106870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s11);
106880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
106890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
106900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
106910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
106920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d16);
106930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
106940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d18);
106950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
106960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
106970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
106980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
106990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d23);
107000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
107020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
107030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107050cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(frintp) {
107060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
107070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
107090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
107100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
107110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
107120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 1.9);
107130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 2.5);
107140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, -1.5);
107150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -2.5);
107160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
107170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
107180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s25, 0.0);
107190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s26, -0.0);
107200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s27, -0.2);
107210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s0, s16);
107230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s1, s17);
107240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s2, s18);
107250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s3, s19);
107260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s4, s20);
107270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s5, s21);
107280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s6, s22);
107290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s7, s23);
107300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s8, s24);
107310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s9, s25);
107320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s10, s26);
107330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(s11, s27);
107340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d16, 1.0);
107360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d17, 1.1);
107370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 1.5);
107380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.9);
107390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 2.5);
107400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, -1.5);
107410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -2.5);
107420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
107430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
107440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.0);
107450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
107460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, -0.2);
107470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d12, d16);
107490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d13, d17);
107500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d14, d18);
107510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d15, d19);
107520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d16, d20);
107530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d17, d21);
107540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d18, d22);
107550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d19, d23);
107560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d20, d24);
107570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d21, d25);
107580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d22, d26);
107590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintp(d23, d27);
107600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
107610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
107630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
107650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s1);
107660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
107670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
107680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(3.0, s4);
107690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-1.0, s5);
107700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
107710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
107720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
107730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
107740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
107750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s11);
107760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
107770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d13);
107780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
107790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
107800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(3.0, d16);
107810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-1.0, d17);
107820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d18);
107830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
107840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
107850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
107860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
107870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d23);
107880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
107900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
107910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107930cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(frintx) {
107940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // VIXL only supports the round-to-nearest FPCR mode, and it doesn't support
107950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // FP exceptions, so this test has the same results as frintn (and frinti).
107960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
107970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
107980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
107990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
108000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
108010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
108020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 1.9);
108030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 2.5);
108040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, -1.5);
108050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -2.5);
108060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
108070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
108080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s25, 0.0);
108090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s26, -0.0);
108100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s27, -0.2);
108110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s0, s16);
108130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s1, s17);
108140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s2, s18);
108150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s3, s19);
108160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s4, s20);
108170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s5, s21);
108180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s6, s22);
108190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s7, s23);
108200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s8, s24);
108210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s9, s25);
108220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s10, s26);
108230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(s11, s27);
108240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d16, 1.0);
108260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d17, 1.1);
108270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 1.5);
108280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.9);
108290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 2.5);
108300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, -1.5);
108310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -2.5);
108320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
108330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
108340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.0);
108350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
108360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, -0.2);
108370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d12, d16);
108390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d13, d17);
108400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d14, d18);
108410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d15, d19);
108420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d16, d20);
108430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d17, d21);
108440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d18, d22);
108450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d19, d23);
108460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d20, d24);
108470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d21, d25);
108480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d22, d26);
108490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintx(d23, d27);
108500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
108510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
108530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
108550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
108560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s2);
108570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s3);
108580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
108590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s5);
108600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
108610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
108620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
108630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
108640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
108650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s11);
108660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
108670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
108680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d14);
108690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
108700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d16);
108710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
108720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d18);
108730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d19);
108740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d20);
108750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d21);
108760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d22);
108770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d23);
108780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
108800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
108810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108830cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(frintz) {
108840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
108850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
108870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
108880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
108890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
108900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 1.9);
108910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 2.5);
108920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, -1.5);
108930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -2.5);
108940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
108950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
108960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s25, 0.0);
108970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s26, -0.0);
108980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
108990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s0, s16);
109000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s1, s17);
109010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s2, s18);
109020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s3, s19);
109030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s4, s20);
109040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s5, s21);
109050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s6, s22);
109060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s7, s23);
109070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s8, s24);
109080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s9, s25);
109090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s10, s26);
109100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d16, 1.0);
109120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d17, 1.1);
109130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 1.5);
109140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.9);
109150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 2.5);
109160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, -1.5);
109170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -2.5);
109180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
109190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
109200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.0);
109210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
109220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d11, d16);
109240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d12, d17);
109250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d13, d18);
109260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d14, d19);
109270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d15, d20);
109280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d16, d21);
109290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d17, d22);
109300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d18, d23);
109310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d19, d24);
109320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d20, d25);
109330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d21, d26);
109340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
109350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
109370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
109390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s1);
109400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s2);
109410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s3);
109420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s4);
109430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-1.0, s5);
109440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s6);
109450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
109460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
109470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s9);
109480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0, s10);
109490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d11);
109500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d12);
109510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d13);
109520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d14);
109530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d15);
109540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-1.0, d16);
109550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d17);
109560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d18);
109570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d19);
109580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d20);
109590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0, d21);
109600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
109620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
109630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109650cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvt_ds) {
109660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
109670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
109690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
109700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
109710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
109720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, 1.9);
109730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, 2.5);
109740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, -1.5);
109750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, -2.5);
109760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s23, kFP32PositiveInfinity);
109770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s24, kFP32NegativeInfinity);
109780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s25, 0.0);
109790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s26, -0.0);
109800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s27, FLT_MAX);
109810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s28, FLT_MIN);
109820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s29, rawbits_to_float(0x7fc12345));   // Quiet NaN.
109830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s30, rawbits_to_float(0x7f812345));   // Signalling NaN.
109840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
109850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d0, s16);
109860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d1, s17);
109870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d2, s18);
109880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d3, s19);
109890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d4, s20);
109900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d5, s21);
109910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d6, s22);
109920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d7, s23);
109930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d8, s24);
109940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d9, s25);
109950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d10, s26);
109960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d11, s27);
109970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d12, s28);
109980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d13, s29);
109990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(d14, s30);
110000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
110010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
110030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0f, d0);
110050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.1f, d1);
110060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.5f, d2);
110070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.9f, d3);
110080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.5f, d4);
110090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-1.5f, d5);
110100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.5f, d6);
110110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d7);
110120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d8);
110130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0f, d9);
110140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-0.0f, d10);
110150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(FLT_MAX, d11);
110160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(FLT_MIN, d12);
110170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that the NaN payload is preserved according to A64 conversion rules:
110190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  - The sign bit is preserved.
110200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  - The top bit of the mantissa is forced to 1 (making it a quiet NaN).
110210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  - The remaining mantissa bits are copied until they run out.
110220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  - The low-order bits that haven't already been assigned are set to 0.
110230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d13);
110240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(0x7ff82468a0000000), d14);
110250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
110270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
110280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110300cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvt_sd) {
110310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test simple conversions here. Complex behaviour (such as rounding
110320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // specifics) are tested in the simulator tests.
110330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
110350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
110370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d16, 1.0);
110380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d17, 1.1);
110390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d18, 1.5);
110400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d19, 1.9);
110410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, 2.5);
110420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, -1.5);
110430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, -2.5);
110440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, kFP32PositiveInfinity);
110450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, kFP32NegativeInfinity);
110460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 0.0);
110470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -0.0);
110480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, FLT_MAX);
110490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, FLT_MIN);
110500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, rawbits_to_double(0x7ff82468a0000000));   // Quiet NaN.
110510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d30, rawbits_to_double(0x7ff02468a0000000));   // Signalling NaN.
110520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s0, d16);
110540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s1, d17);
110550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s2, d18);
110560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s3, d19);
110570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s4, d20);
110580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s5, d21);
110590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s6, d22);
110600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s7, d23);
110610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s8, d24);
110620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s9, d25);
110630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s10, d26);
110640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s11, d27);
110650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s12, d28);
110660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s13, d29);
110670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(s14, d30);
110680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
110690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
110710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0f, s0);
110730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.1f, s1);
110740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.5f, s2);
110750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.9f, s3);
110760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.5f, s4);
110770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-1.5f, s5);
110780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.5f, s6);
110790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s7);
110800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s8);
110810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0f, s9);
110820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-0.0f, s10);
110830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(FLT_MAX, s11);
110840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(FLT_MIN, s12);
110850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that the NaN payload is preserved according to A64 conversion rules:
110870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  - The sign bit is preserved.
110880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  - The top bit of the mantissa is forced to 1 (making it a quiet NaN).
110890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  - The remaining mantissa bits are copied until they run out.
110900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  - The low-order bits that haven't already been assigned are set to 0.
110910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(0x7fc12345), s13);
110920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(0x7fc12345), s14);
110930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
110950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
110960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
110980cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvt_half) {
110990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
111000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
111010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
111020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label done;
111030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
111040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Check all exact conversions from half to float and back.
111050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    Label ok, fail;
111060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(w0, 0);
111070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int i = 0; i < 0xffff; i += 3) {
111080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      if ((i & 0x7c00) == 0x7c00) continue;
111090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(w1, i);
111100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Fmov(s1, w1);
111110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Fcvt(s2, h1);
111120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Fcvt(h2, s2);
111130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Fmov(w2, s2);
111140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Cmp(w1, w2);
111150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ B(&fail, ne);
111160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
111170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ B(&ok);
111180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Bind(&fail);
111190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(w0, 1);
111200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ B(&done);
111210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Bind(&ok);
111220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
111230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
111240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Check all exact conversions from half to double and back.
111250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    Label ok, fail;
111260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int i = 0; i < 0xffff; i += 3) {
111270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      if ((i & 0x7c00) == 0x7c00) continue;
111280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(w1, i);
111290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Fmov(s1, w1);
111300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Fcvt(d2, h1);
111310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Fcvt(h2, d2);
111320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(w2, v2.S(), 0);
111330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Cmp(w1, w2);
111340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ B(&fail, ne);
111350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
111360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ B(&ok);
111370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Bind(&fail);
111380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(w0, 2);
111390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Bind(&ok);
111400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
111410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
111420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
111430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check some other interesting values.
111440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, kFP32PositiveInfinity);
111450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, kFP32NegativeInfinity);
111460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 65504);       // Max half precision.
111470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, 6.10352e-5);  // Min positive normal.
111480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, 6.09756e-5);  // Max subnormal.
111490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, 5.96046e-8);  // Min positive subnormal.
111500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 5e-9);        // Not representable -> zero.
111510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s7, -0.0);
111520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h0, s0);
111530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h1, s1);
111540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h2, s2);
111550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h3, s3);
111560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h4, s4);
111570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h5, s5);
111580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h6, s6);
111590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h7, s7);
111600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
111610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d20, kFP64PositiveInfinity);
111620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, kFP64NegativeInfinity);
111630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, 65504);       // Max half precision.
111640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, 6.10352e-5);  // Min positive normal.
111650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 6.09756e-5);  // Max subnormal.
111660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 5.96046e-8);  // Min positive subnormal.
111670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, 5e-9);        // Not representable -> zero.
111680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, -0.0);
111690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h20, d20);
111700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h21, d21);
111710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h22, d22);
111720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h23, d23);
111730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h24, d24);
111740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h25, d25);
111750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h26, d26);
111760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvt(h27, d27);
111770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
111780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
111790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
111800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
111810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w0);  // 1 => float failed, 2 => double failed.
111820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, kFP16PositiveInfinity, q0);
111830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, kFP16NegativeInfinity, q1);
111840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7bff, q2);
111850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0400, q3);
111860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x03ff, q4);
111870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0001, q5);
111880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q6);
111890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000, q7);
111900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, kFP16PositiveInfinity, q20);
111910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, kFP16NegativeInfinity, q21);
111920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7bff, q22);
111930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0400, q23);
111940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x03ff, q24);
111950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0001, q25);
111960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q26);
111970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000, q27);
111980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
111990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
112000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
112010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
112020cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvtas) {
112030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
112040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
112050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
112060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 1.0);
112070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.1);
112080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 2.5);
112090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -2.5);
112100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
112110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
112120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 0x7fffff80);  // Largest float < INT32_MAX.
112130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s7, s6);          // Smallest float > INT32_MIN.
112140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, 1.0);
112150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d9, 1.1);
112160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 2.5);
112170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, -2.5);
112180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
112190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
112200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d14, kWMaxInt - 1);
112210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d15, kWMinInt + 1);
112220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
112230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 2.5);
112240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, -2.5);
112250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
112260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
112270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, 0x7fffff8000000000);     // Largest float < INT64_MAX.
112280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s23, s22);                    // Smallest float > INT64_MIN.
112290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.1);
112300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 2.5);
112310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -2.5);
112320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
112330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
112340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0x7ffffffffffffc00);     // Largest double < INT64_MAX.
112350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d30, d29);                    // Smallest double > INT64_MIN.
112360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
112370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w0, s0);
112380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w1, s1);
112390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w2, s2);
112400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w3, s3);
112410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w4, s4);
112420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w5, s5);
112430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w6, s6);
112440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w7, s7);
112450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w8, d8);
112460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w9, d9);
112470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w10, d10);
112480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w11, d11);
112490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w12, d12);
112500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w13, d13);
112510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w14, d14);
112520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(w15, d15);
112530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x17, s17);
112540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x18, s18);
112550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x19, s19);
112560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x20, s20);
112570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x21, s21);
112580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x22, s22);
112590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x23, s23);
112600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x24, d24);
112610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x25, d25);
112620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x26, d26);
112630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x27, d27);
112640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x28, d28);
112650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x29, d29);
112660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtas(x30, d30);
112670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
112680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
112690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
112700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
112710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
112720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
112730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x2);
112740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffd, x3);
112750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
112760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
112770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
112780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
112790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x8);
112800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x9);
112810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x10);
112820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffd, x11);
112830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
112840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
112850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
112860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
112870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x17);
112880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x18);
112890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffd, x19);
112900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x20);
112910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x21);
112920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
112930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000008000000000, x23);
112940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x24);
112950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x25);
112960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffd, x26);
112970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x27);
112980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x28);
112990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
113000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000400, x30);
113010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
113020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
113030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
113040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
113050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
113060cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvtau) {
113070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
113080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
113090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
113100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 1.0);
113110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.1);
113120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 2.5);
113130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -2.5);
113140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
113150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
113160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 0xffffff00);  // Largest float < UINT32_MAX.
113170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, 1.0);
113180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d9, 1.1);
113190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 2.5);
113200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, -2.5);
113210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
113220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
113230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d14, 0xfffffffe);
113240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
113250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
113260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 2.5);
113270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, -2.5);
113280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
113290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
113300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, 0xffffff0000000000);  // Largest float < UINT64_MAX.
113310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.1);
113320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 2.5);
113330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -2.5);
113340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
113350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
113360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0xfffffffffffff800);  // Largest double < UINT64_MAX.
113370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s30, 0x100000000);
113380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
113390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w0, s0);
113400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w1, s1);
113410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w2, s2);
113420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w3, s3);
113430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w4, s4);
113440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w5, s5);
113450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w6, s6);
113460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w8, d8);
113470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w9, d9);
113480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w10, d10);
113490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w11, d11);
113500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w12, d12);
113510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w13, d13);
113520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w14, d14);
113530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w15, d15);
113540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x16, s16);
113550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x17, s17);
113560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x18, s18);
113570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x19, s19);
113580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x20, s20);
113590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x21, s21);
113600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x22, s22);
113610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x24, d24);
113620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x25, d25);
113630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x26, d26);
113640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x27, d27);
113650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x28, d28);
113660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(x29, d29);
113670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtau(w30, s30);
113680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
113690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
113700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
113710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
113720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
113730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
113740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x2);
113750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x3);
113760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
113770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x5);
113780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffff00, x6);
113790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x8);
113800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x9);
113810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x10);
113820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x11);
113830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
113840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x13);
113850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffe, x14);
113860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x16);
113870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x17);
113880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x18);
113890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x19);
113900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
113910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x21);
113920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffff0000000000, x22);
113930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x24);
113940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x25);
113950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x26);
113960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x27);
113970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x28);
113980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffff800, x29);
113990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x30);
114000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
114010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
114020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
114030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
114040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
114050cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvtms) {
114060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
114070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
114080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
114090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 1.0);
114100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.1);
114110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 1.5);
114120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -1.5);
114130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
114140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
114150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
114160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
114170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, 1.0);
114180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d9, 1.1);
114190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 1.5);
114200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, -1.5);
114210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
114220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
114230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d14, kWMaxInt - 1);
114240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d15, kWMinInt + 1);
114250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
114260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
114270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, -1.5);
114280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
114290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
114300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
114310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
114320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.1);
114330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 1.5);
114340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -1.5);
114350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
114360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
114370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
114380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
114390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
114400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w0, s0);
114410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w1, s1);
114420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w2, s2);
114430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w3, s3);
114440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w4, s4);
114450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w5, s5);
114460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w6, s6);
114470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w7, s7);
114480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w8, d8);
114490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w9, d9);
114500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w10, d10);
114510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w11, d11);
114520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w12, d12);
114530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w13, d13);
114540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w14, d14);
114550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(w15, d15);
114560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x17, s17);
114570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x18, s18);
114580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x19, s19);
114590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x20, s20);
114600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x21, s21);
114610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x22, s22);
114620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x23, s23);
114630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x24, d24);
114640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x25, d25);
114650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x26, d26);
114660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x27, d27);
114670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x28, d28);
114680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x29, d29);
114690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtms(x30, d30);
114700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
114710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
114720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
114730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
114740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
114750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
114760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x2);
114770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffe, x3);
114780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
114790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
114800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
114810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
114820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x8);
114830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x9);
114840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x10);
114850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
114860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
114870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
114880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
114890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
114900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x17);
114910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x18);
114920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x19);
114930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x20);
114940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x21);
114950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
114960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000008000000000, x23);
114970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x24);
114980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x25);
114990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x26);
115000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x27);
115010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x28);
115020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
115030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000400, x30);
115040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
115050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
115060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
115070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
115080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
115090cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvtmu) {
115100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
115110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
115120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
115130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 1.0);
115140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.1);
115150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 1.5);
115160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -1.5);
115170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
115180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
115190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
115200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
115210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, 1.0);
115220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d9, 1.1);
115230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 1.5);
115240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, -1.5);
115250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
115260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
115270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d14, kWMaxInt - 1);
115280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d15, kWMinInt + 1);
115290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
115300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
115310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, -1.5);
115320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
115330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
115340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
115350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
115360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.1);
115370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 1.5);
115380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -1.5);
115390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
115400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
115410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
115420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
115430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
115440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w0, s0);
115450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w1, s1);
115460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w2, s2);
115470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w3, s3);
115480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w4, s4);
115490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w5, s5);
115500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w6, s6);
115510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w7, s7);
115520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w8, d8);
115530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w9, d9);
115540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w10, d10);
115550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w11, d11);
115560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w12, d12);
115570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w13, d13);
115580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(w14, d14);
115590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x17, s17);
115600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x18, s18);
115610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x19, s19);
115620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x20, s20);
115630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x21, s21);
115640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x22, s22);
115650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x23, s23);
115660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x24, d24);
115670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x25, d25);
115680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x26, d26);
115690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x27, d27);
115700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x28, d28);
115710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x29, d29);
115720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtmu(x30, d30);
115730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
115740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
115750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
115760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
115770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
115780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
115790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x2);
115800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x3);
115810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
115820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x5);
115830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
115840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x7);
115850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x8);
115860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x9);
115870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x10);
115880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x11);
115890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
115900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x13);
115910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
115920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x17);
115930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x18);
115940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x19);
115950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
115960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x21);
115970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
115980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x23);
115990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x24);
116000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x25);
116010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x26);
116020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x27);
116030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x28);
116040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
116050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x30);
116060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
116070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
116080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
116090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
116100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
116110cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvtns) {
116120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
116130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
116140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
116150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 1.0);
116160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.1);
116170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 1.5);
116180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -1.5);
116190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
116200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
116210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
116220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
116230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, 1.0);
116240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d9, 1.1);
116250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 1.5);
116260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, -1.5);
116270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
116280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
116290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d14, kWMaxInt - 1);
116300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d15, kWMinInt + 1);
116310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
116320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
116330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, -1.5);
116340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
116350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
116360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
116370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
116380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.1);
116390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 1.5);
116400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -1.5);
116410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
116420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
116430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
116440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
116450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
116460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w0, s0);
116470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w1, s1);
116480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w2, s2);
116490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w3, s3);
116500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w4, s4);
116510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w5, s5);
116520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w6, s6);
116530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w7, s7);
116540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w8, d8);
116550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w9, d9);
116560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w10, d10);
116570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w11, d11);
116580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w12, d12);
116590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w13, d13);
116600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w14, d14);
116610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(w15, d15);
116620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x17, s17);
116630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x18, s18);
116640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x19, s19);
116650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x20, s20);
116660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x21, s21);
116670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x22, s22);
116680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x23, s23);
116690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x24, d24);
116700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x25, d25);
116710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x26, d26);
116720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x27, d27);
116730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x28, d28);
116740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x29, d29);
116750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtns(x30, d30);
116760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
116770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
116780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
116790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
116800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
116810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
116820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x2);
116830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffe, x3);
116840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
116850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
116860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
116870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
116880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x8);
116890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x9);
116900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x10);
116910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffe, x11);
116920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
116930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
116940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
116950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
116960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x17);
116970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x18);
116980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x19);
116990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x20);
117000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x21);
117010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
117020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000008000000000, x23);
117030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x24);
117040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x25);
117050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x26);
117060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x27);
117070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x28);
117080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
117090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000400, x30);
117100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
117110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
117120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
117130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
117140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
117150cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvtnu) {
117160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
117170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
117180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
117190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 1.0);
117200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.1);
117210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 1.5);
117220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -1.5);
117230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
117240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
117250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 0xffffff00);  // Largest float < UINT32_MAX.
117260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, 1.0);
117270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d9, 1.1);
117280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 1.5);
117290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, -1.5);
117300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
117310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
117320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d14, 0xfffffffe);
117330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s16, 1.0);
117340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
117350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
117360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, -1.5);
117370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
117380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
117390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, 0xffffff0000000000);  // Largest float < UINT64_MAX.
117400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.1);
117410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 1.5);
117420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -1.5);
117430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
117440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
117450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0xfffffffffffff800);  // Largest double < UINT64_MAX.
117460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s30, 0x100000000);
117470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
117480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w0, s0);
117490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w1, s1);
117500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w2, s2);
117510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w3, s3);
117520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w4, s4);
117530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w5, s5);
117540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w6, s6);
117550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w8, d8);
117560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w9, d9);
117570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w10, d10);
117580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w11, d11);
117590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w12, d12);
117600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w13, d13);
117610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w14, d14);
117620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w15, d15);
117630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x16, s16);
117640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x17, s17);
117650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x18, s18);
117660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x19, s19);
117670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x20, s20);
117680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x21, s21);
117690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x22, s22);
117700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x24, d24);
117710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x25, d25);
117720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x26, d26);
117730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x27, d27);
117740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x28, d28);
117750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(x29, d29);
117760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtnu(w30, s30);
117770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
117780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
117790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
117800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
117810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
117820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
117830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x2);
117840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x3);
117850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
117860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x5);
117870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffff00, x6);
117880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x8);
117890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x9);
117900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x10);
117910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x11);
117920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
117930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x13);
117940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffe, x14);
117950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x16);
117960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x17);
117970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x18);
117980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x19);
117990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
118000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x21);
118010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffff0000000000, x22);
118020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x24);
118030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2, x25);
118040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x26);
118050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x27);
118060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x28);
118070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffff800, x29);
118080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x30);
118090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
118100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
118110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
118120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
118130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
118140cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvtzs) {
118150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
118160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
118170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
118180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 1.0);
118190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.1);
118200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 1.5);
118210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -1.5);
118220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
118230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
118240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
118250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
118260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, 1.0);
118270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d9, 1.1);
118280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 1.5);
118290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, -1.5);
118300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
118310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
118320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d14, kWMaxInt - 1);
118330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d15, kWMinInt + 1);
118340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
118350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
118360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, -1.5);
118370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
118380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
118390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
118400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
118410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.1);
118420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 1.5);
118430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -1.5);
118440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
118450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
118460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
118470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
118480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
118490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w0, s0);
118500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w1, s1);
118510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w2, s2);
118520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w3, s3);
118530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w4, s4);
118540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w5, s5);
118550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w6, s6);
118560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w7, s7);
118570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w8, d8);
118580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w9, d9);
118590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w10, d10);
118600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w11, d11);
118610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w12, d12);
118620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w13, d13);
118630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w14, d14);
118640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(w15, d15);
118650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x17, s17);
118660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x18, s18);
118670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x19, s19);
118680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x20, s20);
118690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x21, s21);
118700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x22, s22);
118710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x23, s23);
118720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x24, d24);
118730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x25, d25);
118740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x26, d26);
118750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x27, d27);
118760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x28, d28);
118770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x29, d29);
118780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzs(x30, d30);
118790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
118800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
118810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
118820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
118830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
118840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
118850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x2);
118860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x3);
118870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x4);
118880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000000, x5);
118890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
118900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000080, x7);
118910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x8);
118920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x9);
118930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x10);
118940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x11);
118950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffff, x12);
118960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000000, x13);
118970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
118980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x80000001, x15);
118990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x17);
119000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x18);
119010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x19);
119020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x20);
119030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x21);
119040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
119050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000008000000000, x23);
119060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x24);
119070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x25);
119080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x26);
119090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffffffffffffff, x27);
119100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000000, x28);
119110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
119120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x8000000000000400, x30);
119130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
119140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
119150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
119160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
119170cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(fcvtzu) {
119180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
119190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
119200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
119210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 1.0);
119220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.1);
119230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 1.5);
119240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -1.5);
119250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
119260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
119270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s6, 0x7fffff80);                    // Largest float < INT32_MAX.
119280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s7, s6);                            // Smallest float > INT32_MIN.
119290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, 1.0);
119300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d9, 1.1);
119310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 1.5);
119320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, -1.5);
119330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d12, kFP64PositiveInfinity);
119340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d13, kFP64NegativeInfinity);
119350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d14, kWMaxInt - 1);
119360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d15, kWMinInt + 1);
119370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s17, 1.1);
119380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s18, 1.5);
119390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s19, -1.5);
119400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s20, kFP32PositiveInfinity);
119410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s21, kFP32NegativeInfinity);
119420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s22, 0x7fffff8000000000);           // Largest float < INT64_MAX.
119430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s23, s22);                          // Smallest float > INT64_MIN.
119440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, 1.1);
119450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, 1.5);
119460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, -1.5);
119470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d27, kFP64PositiveInfinity);
119480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d28, kFP64NegativeInfinity);
119490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d29, 0x7ffffffffffffc00);           // Largest double < INT64_MAX.
119500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d30, d29);                          // Smallest double > INT64_MIN.
119510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
119520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w0, s0);
119530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w1, s1);
119540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w2, s2);
119550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w3, s3);
119560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w4, s4);
119570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w5, s5);
119580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w6, s6);
119590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w7, s7);
119600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w8, d8);
119610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w9, d9);
119620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w10, d10);
119630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w11, d11);
119640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w12, d12);
119650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w13, d13);
119660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(w14, d14);
119670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x17, s17);
119680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x18, s18);
119690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x19, s19);
119700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x20, s20);
119710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x21, s21);
119720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x22, s22);
119730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x23, s23);
119740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x24, d24);
119750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x25, d25);
119760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x26, d26);
119770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x27, d27);
119780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x28, d28);
119790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x29, d29);
119800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtzu(x30, d30);
119810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
119820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
119830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
119840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
119850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
119860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
119870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x2);
119880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x3);
119890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x4);
119900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x5);
119910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff80, x6);
119920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x7);
119930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x8);
119940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x9);
119950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x10);
119960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x11);
119970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffff, x12);
119980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x13);
119990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffe, x14);
120000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x17);
120010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x18);
120020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x19);
120030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x20);
120040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x21);
120050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7fffff8000000000, x22);
120060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x23);
120070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x24);
120080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x25);
120090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x26);
120100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xffffffffffffffff, x27);
120110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x28);
120120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7ffffffffffffc00, x29);
120130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x30);
120140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
120160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
120170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120190cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fcvtl) {
120200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
120210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
120230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x000080007efffeff, 0x3100b1007c00fc00);
120250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x03ff83ff00038003, 0x000180017c01fc01);
120260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x3e200000be200000, 0x7f800000ff800000);
120270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x0000000080000000, 0x7f8fffffff8fffff);
120280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x7fcfffffffcfffff, 0x0000000180000001);
120290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl(v16.V4S(), v0.V4H());
120300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl2(v17.V4S(), v0.V8H());
120310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl(v18.V4S(), v1.V4H());
120320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl2(v19.V4S(), v1.V8H());
120330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl(v20.V2D(), v2.V2S());
120350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl2(v21.V2D(), v2.V4S());
120360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl(v22.V2D(), v3.V2S());
120370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl2(v23.V2D(), v3.V4S());
120380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl(v24.V2D(), v4.V2S());
120390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtl2(v25.V2D(), v4.V4S());
120400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
120420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
120440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3e200000be200000, 0x7f800000ff800000, q16);
120450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000080000000, 0x7fdfe000ffdfe000, q17);
120460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x33800000b3800000, 0x7fc02000ffc02000, q18);
120470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x387fc000b87fc000, 0x34400000b4400000, q19);
120480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7ff0000000000000, 0xfff0000000000000, q20);
120490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3fc4000000000000, 0xbfc4000000000000, q21);
120500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7ff9ffffe0000000, 0xfff9ffffe0000000, q22);
120510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x8000000000000000, q23);
120520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x36a0000000000000, 0xb6a0000000000000, q24);
120530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7ff9ffffe0000000, 0xfff9ffffe0000000, q25);
120540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
120550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
120560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120580cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fcvtn) {
120590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
120600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
120620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x3e200000be200000, 0x7f800000ff800000);
120640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0000000080000000, 0x7f8fffffff8fffff);
120650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x7fcfffffffcfffff, 0x0000000180000001);
120660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3fc4000000000000, 0xbfc4000000000000);
120670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x7ff0000000000000, 0xfff0000000000000);
120680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x0000000000000000, 0x8000000000000000);
120690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v6.V2D(), 0x7ff0ffffffffffff, 0xfff0ffffffffffff);
120700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v7.V2D(), 0x7ff8ffffffffffff, 0xfff8ffffffffffff);
120710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v8.V2D(), 0x0000000000000001, 0x8000000000000001);
120720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn(v16.V4H(), v0.V4S());
120740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn2(v16.V8H(), v1.V4S());
120750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn(v17.V4H(), v2.V4S());
120760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn(v18.V2S(), v3.V2D());
120770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn2(v18.V4S(), v4.V2D());
120780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn(v19.V2S(), v5.V2D());
120790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn2(v19.V4S(), v6.V2D());
120800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn(v20.V2S(), v7.V2D());
120810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtn2(v20.V4S(), v8.V2D());
120820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
120830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
120850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000080007e7ffe7f, 0x3100b1007c00fc00, q16);
120860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7e7ffe7f00008000, q17);
120870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7f800000ff800000, 0x3e200000be200000, q18);
120880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fc7ffffffc7ffff, 0x0000000080000000, q19);
120890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000080000000, 0x7fc7ffffffc7ffff, q20);
120900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
120910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
120920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120940cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fcvtxn) {
120950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
120960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
120970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
120980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x3e200000be200000, 0x7f800000ff800000);
120990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0000000080000000, 0x7f8fffffff8fffff);
121000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x7fcfffffffcfffff, 0x0000000180000001);
121010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3fc4000000000000, 0xbfc4000000000000);
121020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x7ff0000000000000, 0xfff0000000000000);
121030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x0000000000000000, 0x8000000000000000);
121040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v6.V2D(), 0x7ff0ffffffffffff, 0xfff0ffffffffffff);
121050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v7.V2D(), 0x7ff8ffffffffffff, 0xfff8ffffffffffff);
121060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v8.V2D(), 0x0000000000000001, 0x8000000000000001);
121070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v9.V2D(), 0x41ed000000000000, 0x41efffffffefffff);
121080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn(v16.V2S(), v0.V2D());
121090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn2(v16.V4S(), v1.V2D());
121100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn(v17.V2S(), v2.V2D());
121110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn2(v17.V4S(), v3.V2D());
121120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn(v18.V2S(), v4.V2D());
121130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn2(v18.V4S(), v5.V2D());
121140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn(v19.V2S(), v6.V2D());
121150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn2(v19.V4S(), v7.V2D());
121160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn(v20.V2S(), v8.V2D());
121170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn2(v20.V4S(), v9.V2D());
121180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcvtxn(s21, d0);
121190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
121200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
121220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000017f7fffff, 0x310000057f7fffff, q16);
121230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3e200000be200000, 0x7f7fffff00000001, q17);
121240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000080000000, 0x7f800000ff800000, q18);
121250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fc7ffffffc7ffff, 0x7fc7ffffffc7ffff, q19);
121260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4f6800004f7fffff, 0x0000000180000001, q20);
121270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f7fffff, q21);
121280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
121290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
121300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Test that scvtf and ucvtf can convert the 64-bit input into the expected
121330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// value. All possible values of 'fbits' are tested. The expected value is
121340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// modified accordingly in each case.
121350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//
121360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// The expected value is specified as the bit encoding of the expected double
121370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// produced by scvtf (expected_scvtf_bits) as well as ucvtf
121380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// (expected_ucvtf_bits).
121390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//
121400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Where the input value is representable by int32_t or uint32_t, conversions
121410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// from W registers will also be tested.
121420cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void TestUScvtfHelper(uint64_t in,
121430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                             uint64_t expected_scvtf_bits,
121440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                             uint64_t expected_ucvtf_bits) {
121450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t u64 = in;
121460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t u32 = u64 & 0xffffffff;
121470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t s64 = static_cast<int64_t>(in);
121480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int32_t s32 = s64 & 0x7fffffff;
121490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  bool cvtf_s32 = (s64 == s32);
121510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  bool cvtf_u32 = (u64 == u32);
121520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double results_scvtf_x[65];
121540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double results_ucvtf_x[65];
121550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double results_scvtf_w[33];
121560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double results_ucvtf_w[33];
121570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
121590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
121600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, reinterpret_cast<uintptr_t>(results_scvtf_x));
121620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, reinterpret_cast<uintptr_t>(results_ucvtf_x));
121630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(results_scvtf_w));
121640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x3, reinterpret_cast<uintptr_t>(results_ucvtf_w));
121650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, s64);
121670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Corrupt the top word, in case it is accidentally used during W-register
121690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // conversions.
121700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, 0x5555555555555555);
121710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bfi(x11, x10, 0, kWRegSize);
121720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test integer conversions.
121740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Scvtf(d0, x10);
121750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ucvtf(d1, x10);
121760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Scvtf(d2, w11);
121770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ucvtf(d3, w11);
121780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(d0, MemOperand(x0));
121790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(d1, MemOperand(x1));
121800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(d2, MemOperand(x2));
121810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(d3, MemOperand(x3));
121820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test all possible values of fbits.
121840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int fbits = 1; fbits <= 32; fbits++) {
121850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Scvtf(d0, x10, fbits);
121860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ucvtf(d1, x10, fbits);
121870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Scvtf(d2, w11, fbits);
121880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ucvtf(d3, w11, fbits);
121890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(d0, MemOperand(x0, fbits * kDRegSizeInBytes));
121900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(d1, MemOperand(x1, fbits * kDRegSizeInBytes));
121910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(d2, MemOperand(x2, fbits * kDRegSizeInBytes));
121920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(d3, MemOperand(x3, fbits * kDRegSizeInBytes));
121930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
121940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
121950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Conversions from W registers can only handle fbits values <= 32, so just
121960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // test conversions from X registers for 32 < fbits <= 64.
121970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
121980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Scvtf(d0, x10, fbits);
121990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ucvtf(d1, x10, fbits);
122000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(d0, MemOperand(x0, fbits * kDRegSizeInBytes));
122010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(d1, MemOperand(x1, fbits * kDRegSizeInBytes));
122020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
122030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
122050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
122060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check the results.
122080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double expected_scvtf_base = rawbits_to_double(expected_scvtf_bits);
122090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double expected_ucvtf_base = rawbits_to_double(expected_ucvtf_bits);
122100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int fbits = 0; fbits <= 32; fbits++) {
122120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    double expected_scvtf = expected_scvtf_base / std::pow(2, fbits);
122130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    double expected_ucvtf = expected_ucvtf_base / std::pow(2, fbits);
122140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]);
122150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]);
122160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (cvtf_s32) ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_w[fbits]);
122170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (cvtf_u32) ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_w[fbits]);
122180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
122190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
122200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    double expected_scvtf = expected_scvtf_base / std::pow(2, fbits);
122210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    double expected_ucvtf = expected_ucvtf_base / std::pow(2, fbits);
122220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(expected_scvtf, results_scvtf_x[fbits]);
122230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(expected_ucvtf, results_ucvtf_x[fbits]);
122240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
122250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
122270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
122280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122300cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(scvtf_ucvtf_double) {
122310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Simple conversions of positive numbers which require no rounding; the
122320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // results should not depened on the rounding mode, and ucvtf and scvtf should
122330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // produce the same result.
122340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x0000000000000000, 0x0000000000000000, 0x0000000000000000);
122350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x0000000000000001, 0x3ff0000000000000, 0x3ff0000000000000);
122360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x0000000040000000, 0x41d0000000000000, 0x41d0000000000000);
122370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x0000000100000000, 0x41f0000000000000, 0x41f0000000000000);
122380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x4000000000000000, 0x43d0000000000000, 0x43d0000000000000);
122390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test mantissa extremities.
122400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x4000000000000400, 0x43d0000000000001, 0x43d0000000000001);
122410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The largest int32_t that fits in a double.
122420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x000000007fffffff, 0x41dfffffffc00000, 0x41dfffffffc00000);
122430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Values that would be negative if treated as an int32_t.
122440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x00000000ffffffff, 0x41efffffffe00000, 0x41efffffffe00000);
122450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x0000000080000000, 0x41e0000000000000, 0x41e0000000000000);
122460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x0000000080000001, 0x41e0000000200000, 0x41e0000000200000);
122470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The largest int64_t that fits in a double.
122480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x7ffffffffffffc00, 0x43dfffffffffffff, 0x43dfffffffffffff);
122490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check for bit pattern reproduction.
122500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x0123456789abcde0, 0x43723456789abcde, 0x43723456789abcde);
122510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x0000000012345678, 0x41b2345678000000, 0x41b2345678000000);
122520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Simple conversions of negative int64_t values. These require no rounding,
122540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // and the results should not depend on the rounding mode.
122550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0xffffffffc0000000, 0xc1d0000000000000, 0x43effffffff80000);
122560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0xffffffff00000000, 0xc1f0000000000000, 0x43efffffffe00000);
122570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0xc000000000000000, 0xc3d0000000000000, 0x43e8000000000000);
122580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Conversions which require rounding.
122600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000000, 0x43b0000000000000, 0x43b0000000000000);
122610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000001, 0x43b0000000000000, 0x43b0000000000000);
122620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000080, 0x43b0000000000000, 0x43b0000000000000);
122630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000081, 0x43b0000000000001, 0x43b0000000000001);
122640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000100, 0x43b0000000000001, 0x43b0000000000001);
122650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000101, 0x43b0000000000001, 0x43b0000000000001);
122660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000180, 0x43b0000000000002, 0x43b0000000000002);
122670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000181, 0x43b0000000000002, 0x43b0000000000002);
122680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000200, 0x43b0000000000002, 0x43b0000000000002);
122690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000201, 0x43b0000000000002, 0x43b0000000000002);
122700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000280, 0x43b0000000000002, 0x43b0000000000002);
122710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000281, 0x43b0000000000003, 0x43b0000000000003);
122720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x1000000000000300, 0x43b0000000000003, 0x43b0000000000003);
122730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check rounding of negative int64_t values (and large uint64_t values).
122740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000000, 0xc3e0000000000000, 0x43e0000000000000);
122750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000001, 0xc3e0000000000000, 0x43e0000000000000);
122760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000200, 0xc3e0000000000000, 0x43e0000000000000);
122770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000201, 0xc3dfffffffffffff, 0x43e0000000000000);
122780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000400, 0xc3dfffffffffffff, 0x43e0000000000000);
122790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000401, 0xc3dfffffffffffff, 0x43e0000000000001);
122800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000600, 0xc3dffffffffffffe, 0x43e0000000000001);
122810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000601, 0xc3dffffffffffffe, 0x43e0000000000001);
122820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000800, 0xc3dffffffffffffe, 0x43e0000000000001);
122830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000801, 0xc3dffffffffffffe, 0x43e0000000000001);
122840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000a00, 0xc3dffffffffffffe, 0x43e0000000000001);
122850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000a01, 0xc3dffffffffffffd, 0x43e0000000000001);
122860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x8000000000000c00, 0xc3dffffffffffffd, 0x43e0000000000002);
122870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Round up to produce a result that's too big for the input to represent.
122880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x7ffffffffffffe00, 0x43e0000000000000, 0x43e0000000000000);
122890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0x7fffffffffffffff, 0x43e0000000000000, 0x43e0000000000000);
122900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0xfffffffffffffc00, 0xc090000000000000, 0x43f0000000000000);
122910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtfHelper(0xffffffffffffffff, 0xbff0000000000000, 0x43f0000000000000);
122920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
122930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
122950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// The same as TestUScvtfHelper, but convert to floats.
122960cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void TestUScvtf32Helper(uint64_t in,
122970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                               uint32_t expected_scvtf_bits,
122980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                               uint32_t expected_ucvtf_bits) {
122990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t u64 = in;
123000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t u32 = u64 & 0xffffffff;
123010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t s64 = static_cast<int64_t>(in);
123020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int32_t s32 = s64 & 0x7fffffff;
123030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  bool cvtf_s32 = (s64 == s32);
123050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  bool cvtf_u32 = (u64 == u32);
123060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float results_scvtf_x[65];
123080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float results_ucvtf_x[65];
123090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float results_scvtf_w[33];
123100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float results_ucvtf_w[33];
123110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
123130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
123140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, reinterpret_cast<uintptr_t>(results_scvtf_x));
123160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, reinterpret_cast<uintptr_t>(results_ucvtf_x));
123170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(results_scvtf_w));
123180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x3, reinterpret_cast<uintptr_t>(results_ucvtf_w));
123190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, s64);
123210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Corrupt the top word, in case it is accidentally used during W-register
123230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // conversions.
123240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, 0x5555555555555555);
123250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bfi(x11, x10, 0, kWRegSize);
123260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test integer conversions.
123280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Scvtf(s0, x10);
123290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ucvtf(s1, x10);
123300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Scvtf(s2, w11);
123310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ucvtf(s3, w11);
123320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(s0, MemOperand(x0));
123330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(s1, MemOperand(x1));
123340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(s2, MemOperand(x2));
123350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(s3, MemOperand(x3));
123360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test all possible values of fbits.
123380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int fbits = 1; fbits <= 32; fbits++) {
123390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Scvtf(s0, x10, fbits);
123400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ucvtf(s1, x10, fbits);
123410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Scvtf(s2, w11, fbits);
123420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ucvtf(s3, w11, fbits);
123430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(s0, MemOperand(x0, fbits * kSRegSizeInBytes));
123440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(s1, MemOperand(x1, fbits * kSRegSizeInBytes));
123450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(s2, MemOperand(x2, fbits * kSRegSizeInBytes));
123460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(s3, MemOperand(x3, fbits * kSRegSizeInBytes));
123470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
123480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Conversions from W registers can only handle fbits values <= 32, so just
123500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // test conversions from X registers for 32 < fbits <= 64.
123510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
123520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Scvtf(s0, x10, fbits);
123530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ucvtf(s1, x10, fbits);
123540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(s0, MemOperand(x0, fbits * kSRegSizeInBytes));
123550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Str(s1, MemOperand(x1, fbits * kSRegSizeInBytes));
123560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
123570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
123590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
123600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check the results.
123620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float expected_scvtf_base = rawbits_to_float(expected_scvtf_bits);
123630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float expected_ucvtf_base = rawbits_to_float(expected_ucvtf_bits);
123640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int fbits = 0; fbits <= 32; fbits++) {
123660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    float expected_scvtf = expected_scvtf_base / std::pow(2.0f, fbits);
123670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    float expected_ucvtf = expected_ucvtf_base / std::pow(2.0f, fbits);
123680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]);
123690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]);
123700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (cvtf_s32) ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_w[fbits]);
123710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (cvtf_u32) ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_w[fbits]);
123720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
123730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int fbits = 33; fbits <= 64; fbits++) {
123740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    float expected_scvtf = expected_scvtf_base / std::pow(2.0f, fbits);
123750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    float expected_ucvtf = expected_ucvtf_base / std::pow(2.0f, fbits);
123760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(expected_scvtf, results_scvtf_x[fbits]);
123770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(expected_ucvtf, results_ucvtf_x[fbits]);
123780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
123790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
123810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
123820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
123840cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(scvtf_ucvtf_float) {
123850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Simple conversions of positive numbers which require no rounding; the
123860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // results should not depened on the rounding mode, and ucvtf and scvtf should
123870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // produce the same result.
123880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000000000000000, 0x00000000, 0x00000000);
123890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000000000000001, 0x3f800000, 0x3f800000);
123900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000000040000000, 0x4e800000, 0x4e800000);
123910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000000100000000, 0x4f800000, 0x4f800000);
123920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x4000000000000000, 0x5e800000, 0x5e800000);
123930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test mantissa extremities.
123940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000000000800001, 0x4b000001, 0x4b000001);
123950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x4000008000000000, 0x5e800001, 0x5e800001);
123960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The largest int32_t that fits in a float.
123970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x000000007fffff80, 0x4effffff, 0x4effffff);
123980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Values that would be negative if treated as an int32_t.
123990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x00000000ffffff00, 0x4f7fffff, 0x4f7fffff);
124000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000000080000000, 0x4f000000, 0x4f000000);
124010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000000080000100, 0x4f000001, 0x4f000001);
124020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The largest int64_t that fits in a float.
124030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x7fffff8000000000, 0x5effffff, 0x5effffff);
124040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check for bit pattern reproduction.
124050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000000000876543, 0x4b076543, 0x4b076543);
124060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Simple conversions of negative int64_t values. These require no rounding,
124080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // and the results should not depend on the rounding mode.
124090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0xfffffc0000000000, 0xd4800000, 0x5f7ffffc);
124100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0xc000000000000000, 0xde800000, 0x5f400000);
124110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Conversions which require rounding.
124130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800000000000, 0x57000000, 0x57000000);
124140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800000000001, 0x57000000, 0x57000000);
124150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800000800000, 0x57000000, 0x57000000);
124160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800000800001, 0x57000001, 0x57000001);
124170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800001000000, 0x57000001, 0x57000001);
124180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800001000001, 0x57000001, 0x57000001);
124190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800001800000, 0x57000002, 0x57000002);
124200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800001800001, 0x57000002, 0x57000002);
124210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800002000000, 0x57000002, 0x57000002);
124220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800002000001, 0x57000002, 0x57000002);
124230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800002800000, 0x57000002, 0x57000002);
124240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800002800001, 0x57000003, 0x57000003);
124250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x0000800003000000, 0x57000003, 0x57000003);
124260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check rounding of negative int64_t values (and large uint64_t values).
124270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000000000000000, 0xdf000000, 0x5f000000);
124280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000000000000001, 0xdf000000, 0x5f000000);
124290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000004000000000, 0xdf000000, 0x5f000000);
124300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000004000000001, 0xdeffffff, 0x5f000000);
124310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000008000000000, 0xdeffffff, 0x5f000000);
124320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000008000000001, 0xdeffffff, 0x5f000001);
124330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x800000c000000000, 0xdefffffe, 0x5f000001);
124340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x800000c000000001, 0xdefffffe, 0x5f000001);
124350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000010000000000, 0xdefffffe, 0x5f000001);
124360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000010000000001, 0xdefffffe, 0x5f000001);
124370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000014000000000, 0xdefffffe, 0x5f000001);
124380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000014000000001, 0xdefffffd, 0x5f000001);
124390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x8000018000000000, 0xdefffffd, 0x5f000002);
124400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Round up to produce a result that's too big for the input to represent.
124410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x000000007fffffc0, 0x4f000000, 0x4f000000);
124420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x000000007fffffff, 0x4f000000, 0x4f000000);
124430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x00000000ffffff80, 0x4f800000, 0x4f800000);
124440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x00000000ffffffff, 0x4f800000, 0x4f800000);
124450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x7fffffc000000000, 0x5f000000, 0x5f000000);
124460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0x7fffffffffffffff, 0x5f000000, 0x5f000000);
124470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0xffffff8000000000, 0xd3000000, 0x5f800000);
124480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TestUScvtf32Helper(0xffffffffffffffff, 0xbf800000, 0x5f800000);
124490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
124500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124520cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(system_mrs) {
124530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
124540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
124560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
124570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 1);
124580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w2, 0x80000000);
124590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Set the Z and C flags.
124610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, w0);
124620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x3, NZCV);
124630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Set the N flag.
124650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, w1);
124660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x4, NZCV);
124670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Set the Z, C and V flags.
124690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adds(w0, w2, w2);
124700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x5, NZCV);
124710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Read the default FPCR.
124730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x6, FPCR);
124740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
124750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
124770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // NZCV
124790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCFlag, w3);
124800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(NFlag, w4);
124810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(ZCVFlag, w5);
124820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // FPCR
124840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The default FPCR on Linux-based platforms is 0.
124850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w6);
124860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
124880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
124890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124910cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(system_msr) {
124920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // All FPCR fields that must be implemented: AHP, DN, FZ, RMode
124930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t fpcr_core = 0x07c00000;
124940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
124950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // All FPCR fields (including fields which may be read-as-zero):
124960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  Stride, Len
124970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  IDE, IXE, UFE, OFE, DZE, IOE
124980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t fpcr_all = fpcr_core | 0x00379f00;
124990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
125010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
125030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
125040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x7fffffff);
125050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x7, 0);
125070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, NVFlag);
125090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(w0, w0);     // Set Z and C.
125100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(NZCV, x10);  // Set N and V.
125110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The Msr should have overwritten every flag set by the Cmp.
125120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x7, x7, mi);  // N
125130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x7, x7, ne);  // !Z
125140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x7, x7, lo);  // !C
125150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x7, x7, vs);  // V
125160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, ZCFlag);
125180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmn(w1, w1);     // Set N and V.
125190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(NZCV, x10);  // Set Z and C.
125200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The Msr should have overwritten every flag set by the Cmn.
125210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x7, x7, pl);  // !N
125220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x7, x7, eq);  // Z
125230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x7, x7, hs);  // C
125240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cinc(x7, x7, vc);  // !V
125250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // All core FPCR fields must be writable.
125270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x8, fpcr_core);
125280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(FPCR, x8);
125290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x8, FPCR);
125300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // All FPCR fields, including optional ones. This part of the test doesn't
125320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // achieve much other than ensuring that supported fields can be cleared by
125330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // the next test.
125340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x9, fpcr_all);
125350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(FPCR, x9);
125360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x9, FPCR);
125370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ And(x9, x9, fpcr_core);
125380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The undefined bits must ignore writes.
125400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // It's conceivable that a future version of the architecture could use these
125410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // fields (making this test fail), but in the meantime this is a useful test
125420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // for the simulator.
125430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, ~fpcr_all);
125440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(FPCR, x10);
125450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x10, FPCR);
125460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
125480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
125500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We should have incremented x7 (from 0) exactly 8 times.
125520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(8, x7);
125530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(fpcr_core, x8);
125550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(fpcr_core, x9);
125560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x10);
125570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
125590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
125600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125620cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(system_nop) {
125630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
125640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegisterDump before;
125650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
125670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  before.Dump(&masm);
125680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Nop();
125690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
125700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
125720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_REGISTERS(before);
125740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(before.flags_nzcv());
125750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
125770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
125780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125800cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(zero_dest) {
125810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
125820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
125830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegisterDump before;
125840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
125860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Preserve the stack pointer, in case we clobber it.
125870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x30, sp);
125880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the other registers used in this test.
125890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
125900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
125910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, literal_base);
125920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 2; i < x30.code(); i++) {
125930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(Register::XRegFromCode(i), Register::XRegFromCode(i-1), x1);
125940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
125950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  before.Dump(&masm);
125960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
125970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // All of these instructions should be NOPs in these forms, but have
125980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // alternate forms which can write into the stack pointer.
125990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ add(xzr, x0, x1);
126000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ add(xzr, x1, xzr);
126010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ add(xzr, xzr, x1);
126020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ and_(xzr, x0, x2);
126040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ and_(xzr, x2, xzr);
126050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ and_(xzr, xzr, x2);
126060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ bic(xzr, x0, x3);
126080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ bic(xzr, x3, xzr);
126090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ bic(xzr, xzr, x3);
126100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ eon(xzr, x0, x4);
126120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ eon(xzr, x4, xzr);
126130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ eon(xzr, xzr, x4);
126140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ eor(xzr, x0, x5);
126160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ eor(xzr, x5, xzr);
126170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ eor(xzr, xzr, x5);
126180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ orr(xzr, x0, x6);
126200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ orr(xzr, x6, xzr);
126210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ orr(xzr, xzr, x6);
126220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ sub(xzr, x0, x7);
126240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ sub(xzr, x7, xzr);
126250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ sub(xzr, xzr, x7);
126260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Swap the saved stack pointer with the real one. If sp was written
126280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // during the test, it will show up in x30. This is done because the test
126290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // framework assumes that sp will be valid at the end of the test.
126300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x29, x30);
126310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x30, sp);
126320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(sp, x29);
126330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We used x29 as a scratch register, so reset it to make sure it doesn't
126340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // trigger a test failure.
126350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x29, x28, x1);
126360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
126370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
126390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_REGISTERS(before);
126410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(before.flags_nzcv());
126420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
126440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
126450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126470cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(zero_dest_setflags) {
126480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
126490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ALLOW_ASM();
126500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegisterDump before;
126510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
126530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Preserve the stack pointer, in case we clobber it.
126540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x30, sp);
126550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the other registers used in this test.
126560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
126570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
126580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, literal_base);
126590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 2; i < 30; i++) {
126600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Add(Register::XRegFromCode(i), Register::XRegFromCode(i-1), x1);
126610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
126620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  before.Dump(&masm);
126630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // All of these instructions should only write to the flags in these forms,
126650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // but have alternate forms which can write into the stack pointer.
126660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ adds(xzr, x0, Operand(x1, UXTX));
126670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ adds(xzr, x1, Operand(xzr, UXTX));
126680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ adds(xzr, x1, 1234);
126690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ adds(xzr, x0, x1);
126700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ adds(xzr, x1, xzr);
126710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ adds(xzr, xzr, x1);
126720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ands(xzr, x2, ~0xf);
126740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ands(xzr, xzr, ~0xf);
126750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ands(xzr, x0, x2);
126760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ands(xzr, x2, xzr);
126770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ands(xzr, xzr, x2);
126780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ bics(xzr, x3, ~0xf);
126800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ bics(xzr, xzr, ~0xf);
126810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ bics(xzr, x0, x3);
126820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ bics(xzr, x3, xzr);
126830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ bics(xzr, xzr, x3);
126840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ subs(xzr, x0, Operand(x3, UXTX));
126860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ subs(xzr, x3, Operand(xzr, UXTX));
126870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ subs(xzr, x3, 1234);
126880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ subs(xzr, x0, x3);
126890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ subs(xzr, x3, xzr);
126900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ subs(xzr, xzr, x3);
126910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
126920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Swap the saved stack pointer with the real one. If sp was written
126930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // during the test, it will show up in x30. This is done because the test
126940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // framework assumes that sp will be valid at the end of the test.
126950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x29, x30);
126960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x30, sp);
126970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(sp, x29);
126980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We used x29 as a scratch register, so reset it to make sure it doesn't
126990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // trigger a test failure.
127000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x29, x28, x1);
127010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
127020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
127040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_REGISTERS(before);
127060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
127080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
127090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127110cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(register_bit) {
127120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // No code generation takes place in this test, so no need to setup and
127130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // teardown.
127140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Simple tests.
127160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(x0.Bit() == (UINT64_C(1) << 0));
127170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(x1.Bit() == (UINT64_C(1) << 1));
127180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(x10.Bit() == (UINT64_C(1) << 10));
127190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // AAPCS64 definitions.
127210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(lr.Bit() == (UINT64_C(1) << kLinkRegCode));
127220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Fixed (hardware) definitions.
127240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(xzr.Bit() == (UINT64_C(1) << kZeroRegCode));
127250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Internal ABI definitions.
127270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(sp.Bit() == (UINT64_C(1) << kSPRegInternalCode));
127280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(sp.Bit() != xzr.Bit());
127290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // xn.Bit() == wn.Bit() at all times, for the same n.
127310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(x0.Bit() == w0.Bit());
127320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(x1.Bit() == w1.Bit());
127330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(x10.Bit() == w10.Bit());
127340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(xzr.Bit() == wzr.Bit());
127350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(sp.Bit() == wsp.Bit());
127360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
127370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127390cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(stack_pointer_override) {
127400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This test generates some stack maintenance code, but the test only checks
127410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // the reported state.
127420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
127430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
127440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The default stack pointer in VIXL is sp.
127460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(sp.Is(__ StackPointer()));
127470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ SetStackPointer(x0);
127480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(x0.Is(__ StackPointer()));
127490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ SetStackPointer(x28);
127500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(x28.Is(__ StackPointer()));
127510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ SetStackPointer(sp);
127520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  assert(sp.Is(__ StackPointer()));
127530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
127550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
127560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
127570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
127580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127600cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(peek_poke_simple) {
127610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
127620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
127630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const RegList x0_to_x3 = x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit();
127650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const RegList x10_to_x13 = x10.Bit() | x11.Bit() |
127660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                    x12.Bit() | x13.Bit();
127670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
127690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
127700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
127710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
127720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
127730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
127740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the registers.
127760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, literal_base);
127770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x0, x0);
127780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x2, x1, x0);
127790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x3, x2, x0);
127800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(32);
127820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Simple exchange.
127840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  After this test:
127850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    x0-x3 should be unchanged.
127860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    w10-w13 should contain the lower words of x0-x3.
127870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x0, 0);
127880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x1, 8);
127890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x2, 16);
127900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x3, 24);
127910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x0_to_x3);
127920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x0, 0);
127930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x1, 8);
127940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x2, 16);
127950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x3, 24);
127960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
127970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w0, 0);
127980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w1, 4);
127990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w2, 8);
128000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w3, 12);
128010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x10_to_x13);
128020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(w10, 0);
128030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(w11, 4);
128040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(w12, 8);
128050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(w13, 12);
128060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Drop(32);
128080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
128100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
128110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 1, x0);
128130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 2, x1);
128140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 3, x2);
128150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 4, x3);
128160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64((literal_base * 1) & 0xffffffff, x10);
128180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64((literal_base * 2) & 0xffffffff, x11);
128190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64((literal_base * 3) & 0xffffffff, x12);
128200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64((literal_base * 4) & 0xffffffff, x13);
128210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
128230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
128240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128260cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(peek_poke_unaligned) {
128270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
128280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
128290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
128310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
128320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
128330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
128340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
128350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
128360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the registers.
128380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, literal_base);
128390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x0, x0);
128400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x2, x1, x0);
128410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x3, x2, x0);
128420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x4, x3, x0);
128430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x5, x4, x0);
128440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x6, x5, x0);
128450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(32);
128470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Unaligned exchanges.
128490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  After this test:
128500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    x0-x6 should be unchanged.
128510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    w10-w12 should contain the lower words of x0-x2.
128520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x0, 1);
128530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x0.Bit());
128540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x0, 1);
128550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x1, 2);
128560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x1.Bit());
128570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x1, 2);
128580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x2, 3);
128590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x2.Bit());
128600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x2, 3);
128610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x3, 4);
128620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x3.Bit());
128630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x3, 4);
128640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x4, 5);
128650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x4.Bit());
128660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x4, 5);
128670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x5, 6);
128680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x5.Bit());
128690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x5, 6);
128700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x6, 7);
128710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, x6.Bit());
128720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x6, 7);
128730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w0, 1);
128750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, w10.Bit());
128760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(w10, 1);
128770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w1, 2);
128780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, w11.Bit());
128790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(w11, 2);
128800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w2, 3);
128810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Clobber(&masm, w12.Bit());
128820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(w12, 3);
128830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Drop(32);
128850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
128870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
128880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 1, x0);
128900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 2, x1);
128910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 3, x2);
128920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 4, x3);
128930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 5, x4);
128940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 6, x5);
128950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 7, x6);
128960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
128970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64((literal_base * 1) & 0xffffffff, x10);
128980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64((literal_base * 2) & 0xffffffff, x11);
128990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64((literal_base * 3) & 0xffffffff, x12);
129000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
129020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
129030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129050cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(peek_poke_endianness) {
129060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
129070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
129080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
129100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
129110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
129120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
129130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
129140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
129150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the registers.
129170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, literal_base);
129180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x0, x0);
129190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(32);
129210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Endianness tests.
129230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  After this section:
129240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    x4 should match x0[31:0]:x0[63:32]
129250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    w5 should match w1[15:0]:w1[31:16]
129260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x0, 0);
129270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x0, 8);
129280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(x4, 4);
129290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w1, 0);
129310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(w1, 4);
129320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Peek(w5, 2);
129330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Drop(32);
129350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
129370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
129380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x0_expected = literal_base * 1;
129400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x1_expected = literal_base * 2;
129410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x4_expected = (x0_expected << 32) | (x0_expected >> 32);
129420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x5_expected = ((x1_expected << 16) & 0xffff0000) |
129430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                         ((x1_expected >> 16) & 0x0000ffff);
129440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x0_expected, x0);
129460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x1_expected, x1);
129470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x4_expected, x4);
129480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x5_expected, x5);
129490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
129510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
129520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129540cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(peek_poke_mixed) {
129550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
129560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
129570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Acquire all temps from the MacroAssembler. They are used arbitrarily below.
129590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  UseScratchRegisterScope temps(&masm);
129600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  temps.ExcludeAll();
129610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
129630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
129640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
129650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
129660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
129670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
129680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the registers.
129700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, literal_base);
129710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x0, x0);
129720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x2, x1, x0);
129730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x3, x2, x0);
129740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(32);
129760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Mix with other stack operations.
129780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  After this section:
129790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    x0-x3 should be unchanged.
129800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    x6 should match x1[31:0]:x0[63:32]
129810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    w7 should match x1[15:0]:x0[63:48]
129820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x1, 8);
129830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Poke(x0, 0);
129840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
129850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
129860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(x4, __ StackPointer());
129870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(x4);
129880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
129890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Poke(wzr, 0);    // Clobber the space we're about to drop.
129900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Drop(4);
129910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Peek(x6, 0);
129920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Claim(8);
129930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Peek(w7, 10);
129940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Poke(x3, 28);
129950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Poke(xzr, 0);    // Clobber the space we're about to drop.
129960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Drop(8);
129970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Poke(x2, 12);
129980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Push(w0);
129990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(sp, __ StackPointer());
130010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(sp);
130020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
130030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Pop(x0, x1, x2, x3);
130050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
130070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
130080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x0_expected = literal_base * 1;
130100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x1_expected = literal_base * 2;
130110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x2_expected = literal_base * 3;
130120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x3_expected = literal_base * 4;
130130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x6_expected = (x1_expected << 32) | (x0_expected >> 32);
130140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x7_expected = ((x1_expected << 16) & 0xffff0000) |
130150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                         ((x0_expected >> 48) & 0x0000ffff);
130160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x0_expected, x0);
130180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x1_expected, x1);
130190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x2_expected, x2);
130200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x3_expected, x3);
130210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x6_expected, x6);
130220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(x7_expected, x7);
130230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
130250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
130260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130280cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(peek_poke_reglist) {
130290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
130300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
130310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Acquire all temps from the MacroAssembler. They are used arbitrarily below.
130330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  UseScratchRegisterScope temps(&masm);
130340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  temps.ExcludeAll();
130350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
130370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
130380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
130390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
130400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
130410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t base = 0x0100001000100101;
130420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the registers.
130440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, base);
130450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x2, x1, x1);
130460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x3, x2, x1);
130470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x4, x3, x1);
130480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_1(x1, x2, x3, x4);
130500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_2(x11, x12, x13, x14);
130510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int list_1_size = list_1.TotalSizeInBytes();
130520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(2 * list_1_size);
130540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PokeCPURegList(list_1, 0);
130560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PokeXRegList(list_1.list(), list_1_size);
130570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PeekCPURegList(list_2, 2 * kXRegSizeInBytes);
130580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PeekXRegList(x15.Bit(), kWRegSizeInBytes);
130590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PeekWRegList(w16.Bit() | w17.Bit(), 3 * kXRegSizeInBytes);
130600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Drop(2 * list_1_size);
130620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t base_d = 0x1010010001000010;
130650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the registers.
130670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, base_d);
130680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x2, x1, x1);
130690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x3, x2, x1);
130700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x4, x3, x1);
130710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d1, x1);
130720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d2, x2);
130730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d3, x3);
130740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d4, x4);
130750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_d_1(d1, d2, d3, d4);
130770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_d_2(d11, d12, d13, d14);
130780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int list_d_1_size = list_d_1.TotalSizeInBytes();
130790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(2 * list_d_1_size);
130810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PokeCPURegList(list_d_1, 0);
130830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PokeDRegList(list_d_1.list(), list_d_1_size);
130840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PeekCPURegList(list_d_2, 2 * kDRegSizeInBytes);
130850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PeekDRegList(d15.Bit(), kSRegSizeInBytes);
130860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PeekSRegList(s16.Bit() | s17.Bit(), 3 * kDRegSizeInBytes);
130870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Drop(2 * list_d_1_size);
130890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
130920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
130930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
130940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3 * base, x11);
130950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(4 * base, x12);
130960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1 * base, x13);
130970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2 * base, x14);
130980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(((1 * base) >> kWRegSize) | ((2 * base) << kWRegSize), x15);
130990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2 * base, x14);
131000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32((4 * base) & kWRegMask, w16);
131010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32((4 * base) >> kWRegSize, w17);
131020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(3 * base_d), d11);
131040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(4 * base_d), d12);
131050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(1 * base_d), d13);
131060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(2 * base_d), d14);
131070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(
131080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      rawbits_to_double((base_d >> kSRegSize) | ((2 * base_d) << kSRegSize)),
131090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      d15);
131100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(2 * base_d), d14);
131110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float((4 * base_d) & kSRegMask), s16);
131120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float((4 * base_d) >> kSRegSize), s17);
131130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
131150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
131160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131180cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_reglist) {
131190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
131200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
131210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
131230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
131240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
131250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
131260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
131270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t high_base = UINT32_C(0x01000010);
131280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t low_base =  UINT32_C(0x00100101);
131290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t base = (high_base << 32) | low_base;
131300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t array[21];
131310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  memset(array, 0, sizeof(array));
131320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize the registers.
131340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, base);
131350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x2, x1, x1);
131360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x3, x2, x1);
131370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x4, x3, x1);
131380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d1, x1);
131390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d2, x2);
131400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d3, x3);
131410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d4, x4);
131420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d5, x1);
131430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d6, x2);
131440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d7, x3);
131450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d8, x4);
131460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register reg_base = x20;
131480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register reg_index = x21;
131490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int size_stored = 0;
131500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(reg_base, reinterpret_cast<uintptr_t>(&array));
131520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test aligned accesses.
131540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_src(w1, w2, w3, w4);
131550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_dst(w11, w12, w13, w14);
131560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_fp_src_1(d1, d2, d3, d4);
131570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_fp_dst_1(d11, d12, d13, d14);
131580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ StoreCPURegList(list_src, MemOperand(reg_base, 0 * sizeof(uint64_t)));
131600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ LoadCPURegList(list_dst, MemOperand(reg_base, 0 * sizeof(uint64_t)));
131610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  size_stored += 4 * kWRegSizeInBytes;
131620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(reg_index, size_stored);
131640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ StoreCPURegList(list_src, MemOperand(reg_base, reg_index));
131650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ LoadCPURegList(list_dst, MemOperand(reg_base, reg_index));
131660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  size_stored += 4 * kWRegSizeInBytes;
131670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ StoreCPURegList(list_fp_src_1, MemOperand(reg_base, size_stored));
131690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ LoadCPURegList(list_fp_dst_1, MemOperand(reg_base, size_stored));
131700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  size_stored += 4 * kDRegSizeInBytes;
131710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(reg_index, size_stored);
131730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ StoreCPURegList(list_fp_src_1, MemOperand(reg_base, reg_index));
131740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ LoadCPURegList(list_fp_dst_1, MemOperand(reg_base, reg_index));
131750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  size_stored += 4 * kDRegSizeInBytes;
131760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test unaligned accesses.
131780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_fp_src_2(d5, d6, d7, d8);
131790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  CPURegList list_fp_dst_2(d15, d16, d17, d18);
131800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Str(wzr, MemOperand(reg_base, size_stored));
131820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  size_stored += 1 * kWRegSizeInBytes;
131830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ StoreCPURegList(list_fp_src_2, MemOperand(reg_base, size_stored));
131840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ LoadCPURegList(list_fp_dst_2, MemOperand(reg_base, size_stored));
131850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  size_stored += 4 * kDRegSizeInBytes;
131860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(reg_index, size_stored);
131880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ StoreCPURegList(list_fp_src_2, MemOperand(reg_base, reg_index));
131890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ LoadCPURegList(list_fp_dst_2, MemOperand(reg_base, reg_index));
131900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
131920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
131930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
131940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[0] == (1 * low_base) + (2 * low_base << kWRegSize));
131950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[1] == (3 * low_base) + (4 * low_base << kWRegSize));
131960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[2] == (1 * low_base) + (2 * low_base << kWRegSize));
131970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[3] == (3 * low_base) + (4 * low_base << kWRegSize));
131980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[4] == 1 * base);
131990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[5] == 2 * base);
132000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[6] == 3 * base);
132010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[7] == 4 * base);
132020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[8] == 1 * base);
132030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[9] == 2 * base);
132040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[10] == 3 * base);
132050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[11] == 4 * base);
132060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[12] == ((1 * low_base) << kSRegSize));
132070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[13] == (((2 * low_base) << kSRegSize) | (1 * high_base)));
132080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[14] == (((3 * low_base) << kSRegSize) | (2 * high_base)));
132090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[15] == (((4 * low_base) << kSRegSize) | (3 * high_base)));
132100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[16] == (((1 * low_base) << kSRegSize) | (4 * high_base)));
132110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[17] == (((2 * low_base) << kSRegSize) | (1 * high_base)));
132120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[18] == (((3 * low_base) << kSRegSize) | (2 * high_base)));
132130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[19] == (((4 * low_base) << kSRegSize) | (3 * high_base)));
132140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(array[20] == (4 * high_base));
132150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1 * low_base, x11);
132170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(2 * low_base, x12);
132180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3 * low_base, x13);
132190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(4 * low_base, x14);
132200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(1 * base), d11);
132210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(2 * base), d12);
132220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(3 * base), d13);
132230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(4 * base), d14);
132240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(1 * base), d15);
132250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(2 * base), d16);
132260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(3 * base), d17);
132270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(4 * base), d18);
132280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
132300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
132310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// This enum is used only as an argument to the push-pop test helpers.
132340cc8b6ece4b3e757e11a906a81ece292437713abarmvixlenum PushPopMethod {
132350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Push or Pop using the Push and Pop methods, with blocks of up to four
132360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // registers. (Smaller blocks will be used if necessary.)
132370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  PushPopByFour,
132380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Use Push<Size>RegList and Pop<Size>RegList to transfer the registers.
132400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  PushPopRegList
132410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl};
132420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// The maximum number of registers that can be used by the PushPopXReg* tests,
132450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// where a reg_count field is provided.
132460cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic int const kPushPopXRegMaxRegCount = -1;
132470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Test a simple push-pop pattern:
132490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Claim <claim> bytes to set the stack alignment.
132500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Push <reg_count> registers with size <reg_size>.
132510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Clobber the register contents.
132520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Pop <reg_count> registers to restore the original contents.
132530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Drop <claim> bytes to restore the original stack pointer.
132540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//
132550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Different push and pop methods can be specified independently to test for
132560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// proper word-endian behaviour.
132570cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void PushPopXRegSimpleHelper(int reg_count,
132580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                    int claim,
132590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                    int reg_size,
132600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                    PushPopMethod push_method,
132610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                    PushPopMethod pop_method) {
132620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
132630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
132650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Arbitrarily pick a register to use as a stack pointer.
132670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& stack_pointer = x20;
132680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const RegList allowed = ~stack_pointer.Bit();
132690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (reg_count == kPushPopXRegMaxRegCount) {
132700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    reg_count = CountSetBits(allowed, kNumberOfRegisters);
132710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
132720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Work out which registers to use, based on reg_size.
132730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register r[kNumberOfRegisters];
132740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register x[kNumberOfRegisters];
132750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegList list = PopulateRegisterArray(NULL, x, r, reg_size, reg_count,
132760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                       allowed);
132770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Acquire all temps from the MacroAssembler. They are used arbitrarily below.
132790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  UseScratchRegisterScope temps(&masm);
132800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  temps.ExcludeAll();
132810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
132830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
132840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
132850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
132860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
132870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
132880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
132900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
132910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(stack_pointer, __ StackPointer());
132920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(stack_pointer);
132930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    int i;
132950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
132960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Initialize the registers.
132970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (i = 0; i < reg_count; i++) {
132980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Always write into the X register, to ensure that the upper word is
132990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // properly ignored by Push when testing W registers.
133000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x[i], literal_base * i);
133010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
133020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Claim memory first, as requested.
133040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Claim(claim);
133050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    switch (push_method) {
133070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      case PushPopByFour:
133080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Push high-numbered registers first (to the highest addresses).
133090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        for (i = reg_count; i >= 4; i -= 4) {
133100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          __ Push(r[i-1], r[i-2], r[i-3], r[i-4]);
133110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
133120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Finish off the leftovers.
133130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        switch (i) {
133140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 3:  __ Push(r[2], r[1], r[0]); break;
133150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 2:  __ Push(r[1], r[0]);       break;
133160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 1:  __ Push(r[0]);             break;
133170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          default: VIXL_ASSERT(i == 0);            break;
133180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
133190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        break;
133200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      case PushPopRegList:
133210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ PushSizeRegList(list, reg_size);
133220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        break;
133230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
133240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Clobber all the registers, to ensure that they get repopulated by Pop.
133260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    Clobber(&masm, list);
133270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    switch (pop_method) {
133290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      case PushPopByFour:
133300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Pop low-numbered registers first (from the lowest addresses).
133310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        for (i = 0; i <= (reg_count-4); i += 4) {
133320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          __ Pop(r[i], r[i+1], r[i+2], r[i+3]);
133330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
133340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Finish off the leftovers.
133350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        switch (reg_count - i) {
133360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 3:  __ Pop(r[i], r[i+1], r[i+2]); break;
133370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 2:  __ Pop(r[i], r[i+1]);         break;
133380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 1:  __ Pop(r[i]);                 break;
133390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          default: VIXL_ASSERT(i == reg_count);       break;
133400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
133410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        break;
133420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      case PushPopRegList:
133430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ PopSizeRegList(list, reg_size);
133440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        break;
133450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
133460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Drop memory to restore stack_pointer.
133480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Drop(claim);
133490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(sp, __ StackPointer());
133510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(sp);
133520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
133530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
133550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
133570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that the register contents were preserved.
133590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Always use ASSERT_EQUAL_64, even when testing W registers, so we can test
133600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // that the upper word was properly cleared by Pop.
133610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  literal_base &= (0xffffffffffffffff >> (64-reg_size));
133620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < reg_count; i++) {
133630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (x[i].Is(xzr)) {
133640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(0, x[i]);
133650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else {
133660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(literal_base * i, x[i]);
133670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
133680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
133690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
133710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
133720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133740cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(push_pop_xreg_simple_32) {
133750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int claim = 0; claim <= 8; claim++) {
133760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int count = 0; count <= 8; count++) {
133770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
133780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopByFour, PushPopByFour);
133790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
133800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopByFour, PushPopRegList);
133810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
133820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopRegList, PushPopByFour);
133830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegSimpleHelper(count, claim, kWRegSize,
133840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopRegList, PushPopRegList);
133850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
133860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Test with the maximum number of registers.
133870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
133880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                            claim, kWRegSize, PushPopByFour, PushPopByFour);
133890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
133900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                            claim, kWRegSize, PushPopByFour, PushPopRegList);
133910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
133920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                            claim, kWRegSize, PushPopRegList, PushPopByFour);
133930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
133940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                            claim, kWRegSize, PushPopRegList, PushPopRegList);
133950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
133960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
133970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
133990cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(push_pop_xreg_simple_64) {
134000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int claim = 0; claim <= 8; claim++) {
134010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int count = 0; count <= 8; count++) {
134020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
134030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopByFour, PushPopByFour);
134040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
134050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopByFour, PushPopRegList);
134060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
134070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopRegList, PushPopByFour);
134080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegSimpleHelper(count, claim, kXRegSize,
134090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopRegList, PushPopRegList);
134100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
134110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Test with the maximum number of registers.
134120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
134130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                            claim, kXRegSize, PushPopByFour, PushPopByFour);
134140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
134150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                            claim, kXRegSize, PushPopByFour, PushPopRegList);
134160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
134170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                            claim, kXRegSize, PushPopRegList, PushPopByFour);
134180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegSimpleHelper(kPushPopXRegMaxRegCount,
134190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                            claim, kXRegSize, PushPopRegList, PushPopRegList);
134200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
134210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
134220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// The maximum number of registers that can be used by the PushPopFPXReg* tests,
134250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// where a reg_count field is provided.
134260cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic int const kPushPopFPXRegMaxRegCount = -1;
134270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Test a simple push-pop pattern:
134290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Claim <claim> bytes to set the stack alignment.
134300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Push <reg_count> FP registers with size <reg_size>.
134310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Clobber the register contents.
134320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Pop <reg_count> FP registers to restore the original contents.
134330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//  * Drop <claim> bytes to restore the original stack pointer.
134340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl//
134350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Different push and pop methods can be specified independently to test for
134360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// proper word-endian behaviour.
134370cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void PushPopFPXRegSimpleHelper(int reg_count,
134380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                      int claim,
134390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                      int reg_size,
134400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                      PushPopMethod push_method,
134410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                      PushPopMethod pop_method) {
134420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
134430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
134450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We can use any floating-point register. None of them are reserved for
134470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // debug code, for example.
134480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static RegList const allowed = ~0;
134490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (reg_count == kPushPopFPXRegMaxRegCount) {
134500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    reg_count = CountSetBits(allowed, kNumberOfFPRegisters);
134510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
134520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Work out which registers to use, based on reg_size.
134530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FPRegister v[kNumberOfRegisters];
134540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  FPRegister d[kNumberOfRegisters];
134550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegList list = PopulateFPRegisterArray(NULL, d, v, reg_size, reg_count,
134560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                         allowed);
134570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Arbitrarily pick a register to use as a stack pointer.
134590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& stack_pointer = x10;
134600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Acquire all temps from the MacroAssembler. They are used arbitrarily below.
134620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  UseScratchRegisterScope temps(&masm);
134630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  temps.ExcludeAll();
134640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
134660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied (using an integer) by small values (such as a register
134670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    index), this value is clearly readable in the result.
134680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
134690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
134700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * It is never a floating-point NaN, and will therefore always compare
134710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    equal to itself.
134720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
134730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
134750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
134760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(stack_pointer, __ StackPointer());
134770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(stack_pointer);
134780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    int i;
134800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Initialize the registers, using X registers to load the literal.
134820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(x0, 0);
134830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(x1, literal_base);
134840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (i = 0; i < reg_count; i++) {
134850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Always write into the D register, to ensure that the upper word is
134860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // properly ignored by Push when testing S registers.
134870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Fmov(d[i], x0);
134880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Calculate the next literal.
134890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Add(x0, x0, x1);
134900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
134910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Claim memory first, as requested.
134930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Claim(claim);
134940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
134950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    switch (push_method) {
134960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      case PushPopByFour:
134970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Push high-numbered registers first (to the highest addresses).
134980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        for (i = reg_count; i >= 4; i -= 4) {
134990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          __ Push(v[i-1], v[i-2], v[i-3], v[i-4]);
135000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
135010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Finish off the leftovers.
135020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        switch (i) {
135030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 3:  __ Push(v[2], v[1], v[0]); break;
135040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 2:  __ Push(v[1], v[0]);       break;
135050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 1:  __ Push(v[0]);             break;
135060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          default: VIXL_ASSERT(i == 0);            break;
135070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
135080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        break;
135090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      case PushPopRegList:
135100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ PushSizeRegList(list, reg_size, CPURegister::kVRegister);
135110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        break;
135120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
135130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Clobber all the registers, to ensure that they get repopulated by Pop.
135150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ClobberFP(&masm, list);
135160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    switch (pop_method) {
135180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      case PushPopByFour:
135190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Pop low-numbered registers first (from the lowest addresses).
135200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        for (i = 0; i <= (reg_count-4); i += 4) {
135210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          __ Pop(v[i], v[i+1], v[i+2], v[i+3]);
135220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
135230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Finish off the leftovers.
135240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        switch (reg_count - i) {
135250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 3:  __ Pop(v[i], v[i+1], v[i+2]); break;
135260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 2:  __ Pop(v[i], v[i+1]);         break;
135270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          case 1:  __ Pop(v[i]);                 break;
135280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          default: VIXL_ASSERT(i == reg_count);       break;
135290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
135300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        break;
135310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      case PushPopRegList:
135320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ PopSizeRegList(list, reg_size, CPURegister::kVRegister);
135330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        break;
135340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
135350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Drop memory to restore the stack pointer.
135370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Drop(claim);
135380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(sp, __ StackPointer());
135400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(sp);
135410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
135420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
135440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
135460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that the register contents were preserved.
135480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Always use ASSERT_EQUAL_FP64, even when testing S registers, so we can
135490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // test that the upper word was properly cleared by Pop.
135500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  literal_base &= (0xffffffffffffffff >> (64-reg_size));
135510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < reg_count; i++) {
135520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t literal = literal_base * i;
135530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    double expected;
135540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    memcpy(&expected, &literal, sizeof(expected));
135550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(expected, d[i]);
135560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
135570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
135590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
135600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135620cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(push_pop_fp_xreg_simple_32) {
135630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int claim = 0; claim <= 8; claim++) {
135640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int count = 0; count <= 8; count++) {
135650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
135660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                PushPopByFour, PushPopByFour);
135670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
135680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                PushPopByFour, PushPopRegList);
135690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
135700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                PushPopRegList, PushPopByFour);
135710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopFPXRegSimpleHelper(count, claim, kSRegSize,
135720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                PushPopRegList, PushPopRegList);
135730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
135740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Test with the maximum number of registers.
135750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
135760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopByFour, PushPopByFour);
135770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
135780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopByFour, PushPopRegList);
135790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
135800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopRegList, PushPopByFour);
135810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kSRegSize,
135820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopRegList, PushPopRegList);
135830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
135840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
135850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
135870cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(push_pop_fp_xreg_simple_64) {
135880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int claim = 0; claim <= 8; claim++) {
135890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int count = 0; count <= 8; count++) {
135900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
135910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                PushPopByFour, PushPopByFour);
135920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
135930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                PushPopByFour, PushPopRegList);
135940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
135950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                PushPopRegList, PushPopByFour);
135960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopFPXRegSimpleHelper(count, claim, kDRegSize,
135970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                                PushPopRegList, PushPopRegList);
135980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
135990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Test with the maximum number of registers.
136000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
136010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopByFour, PushPopByFour);
136020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
136030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopByFour, PushPopRegList);
136040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
136050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopRegList, PushPopByFour);
136060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopFPXRegSimpleHelper(kPushPopFPXRegMaxRegCount, claim, kDRegSize,
136070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                              PushPopRegList, PushPopRegList);
136080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
136090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
136100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Push and pop data using an overlapping combination of Push/Pop and
136130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// RegList-based methods.
136140cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void PushPopXRegMixedMethodsHelper(int claim, int reg_size) {
136150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
136160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Arbitrarily pick a register to use as a stack pointer.
136180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& stack_pointer = x5;
136190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const RegList allowed = ~stack_pointer.Bit();
136200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Work out which registers to use, based on reg_size.
136210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register r[10];
136220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register x[10];
136230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  PopulateRegisterArray(NULL, x, r, reg_size, 10, allowed);
136240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Calculate some handy register lists.
136260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegList r0_to_r3 = 0;
136270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i <= 3; i++) {
136280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    r0_to_r3 |= x[i].Bit();
136290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
136300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegList r4_to_r5 = 0;
136310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 4; i <= 5; i++) {
136320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    r4_to_r5 |= x[i].Bit();
136330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
136340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegList r6_to_r9 = 0;
136350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 6; i <= 9; i++) {
136360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    r6_to_r9 |= x[i].Bit();
136370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
136380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Acquire all temps from the MacroAssembler. They are used arbitrarily below.
136400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  UseScratchRegisterScope temps(&masm);
136410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  temps.ExcludeAll();
136420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
136440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
136450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
136460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
136470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
136480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t literal_base = 0x0100001000100101;
136490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
136510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
136520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
136530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(stack_pointer, __ StackPointer());
136540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(stack_pointer);
136550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Claim memory first, as requested.
136570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Claim(claim);
136580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(x[3], literal_base * 3);
136600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(x[2], literal_base * 2);
136610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(x[1], literal_base * 1);
136620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(x[0], literal_base * 0);
136630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ PushSizeRegList(r0_to_r3, reg_size);
136650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Push(r[3], r[2]);
136660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    Clobber(&masm, r0_to_r3);
136680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ PopSizeRegList(r0_to_r3, reg_size);
136690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Push(r[2], r[1], r[3], r[0]);
136710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    Clobber(&masm, r4_to_r5);
136730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Pop(r[4], r[5]);
136740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    Clobber(&masm, r6_to_r9);
136750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Pop(r[6], r[7], r[8], r[9]);
136760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Drop memory to restore stack_pointer.
136780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Drop(claim);
136790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(sp, __ StackPointer());
136810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(sp);
136820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
136830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
136850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
136870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Always use ASSERT_EQUAL_64, even when testing W registers, so we can test
136890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // that the upper word was properly cleared by Pop.
136900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  literal_base &= (0xffffffffffffffff >> (64-reg_size));
136910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 3, x[9]);
136930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 2, x[8]);
136940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 0, x[7]);
136950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 3, x[6]);
136960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 1, x[5]);
136970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(literal_base * 2, x[4]);
136980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
136990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
137000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
137010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137030cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(push_pop_xreg_mixed_methods_64) {
137040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int claim = 0; claim <= 8; claim++) {
137050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegMixedMethodsHelper(claim, kXRegSize);
137060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
137070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
137080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137100cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(push_pop_xreg_mixed_methods_32) {
137110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int claim = 0; claim <= 8; claim++) {
137120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegMixedMethodsHelper(claim, kWRegSize);
137130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
137140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
137150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Push and pop data using overlapping X- and W-sized quantities.
137180cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void PushPopXRegWXOverlapHelper(int reg_count, int claim) {
137190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
137200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Arbitrarily pick a register to use as a stack pointer.
137220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register& stack_pointer = x10;
137230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const RegList allowed = ~stack_pointer.Bit();
137240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (reg_count == kPushPopXRegMaxRegCount) {
137250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    reg_count = CountSetBits(allowed, kNumberOfRegisters);
137260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
137270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Work out which registers to use, based on reg_size.
137280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register w[kNumberOfRegisters];
137290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register x[kNumberOfRegisters];
137300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegList list = PopulateRegisterArray(w, x, NULL, 0, reg_count, allowed);
137310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The number of W-sized slots we expect to pop. When we pop, we alternate
137330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // between W and X registers, so we need reg_count*1.5 W-sized slots.
137340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int const requested_w_slots = reg_count + reg_count / 2;
137350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Track what _should_ be on the stack, using W-sized slots.
137370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static int const kMaxWSlots = kNumberOfRegisters + kNumberOfRegisters / 2;
137380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t stack[kMaxWSlots];
137390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < kMaxWSlots; i++) {
137400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    stack[i] = 0xdeadbeef;
137410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
137420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Acquire all temps from the MacroAssembler. They are used arbitrarily below.
137440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  UseScratchRegisterScope temps(&masm);
137450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  temps.ExcludeAll();
137460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The literal base is chosen to have two useful properties:
137480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * When multiplied by small values (such as a register index), this value
137490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    is clearly readable in the result.
137500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //  * The value is not formed from repeating fixed-size smaller values, so it
137510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    can be used to detect endianness-related errors.
137520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static uint64_t const literal_base = 0x0100001000100101;
137530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static uint64_t const literal_base_hi = literal_base >> 32;
137540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static uint64_t const literal_base_lo = literal_base & 0xffffffff;
137550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static uint64_t const literal_base_w = literal_base & 0xffffffff;
137560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
137580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
137590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    VIXL_ASSERT(__ StackPointer().Is(sp));
137600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(stack_pointer, __ StackPointer());
137610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(stack_pointer);
137620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Initialize the registers.
137640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int i = 0; i < reg_count; i++) {
137650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Always write into the X register, to ensure that the upper word is
137660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // properly ignored by Push when testing W registers.
137670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x[i], literal_base * i);
137680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
137690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Claim memory first, as requested.
137710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Claim(claim);
137720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
137730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // The push-pop pattern is as follows:
137740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Push:           Pop:
137750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[0](hi)   ->   w[0]
137760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[0](lo)   ->   x[1](hi)
137770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  w[1]       ->   x[1](lo)
137780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  w[1]       ->   w[2]
137790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[2](hi)   ->   x[2](hi)
137800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[2](lo)   ->   x[2](lo)
137810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[2](hi)   ->   w[3]
137820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[2](lo)   ->   x[4](hi)
137830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[2](hi)   ->   x[4](lo)
137840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[2](lo)   ->   w[5]
137850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  w[3]       ->   x[5](hi)
137860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  w[3]       ->   x[6](lo)
137870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  w[3]       ->   w[7]
137880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  w[3]       ->   x[8](hi)
137890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[4](hi)   ->   x[8](lo)
137900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //  x[4](lo)   ->   w[9]
137910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // ... pattern continues ...
137920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //
137930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // That is, registers are pushed starting with the lower numbers,
137940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // alternating between x and w registers, and pushing i%4+1 copies of each,
137950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // where i is the register number.
137960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Registers are popped starting with the higher numbers one-by-one,
137970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // alternating between x and w registers, but only popping one at a time.
137980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    //
137990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // This pattern provides a wide variety of alignment effects and overlaps.
138000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // ---- Push ----
138020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    int active_w_slots = 0;
138040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int i = 0; active_w_slots < requested_w_slots; i++) {
138050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_ASSERT(i < reg_count);
138060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // In order to test various arguments to PushMultipleTimes, and to try to
138070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // exercise different alignment and overlap effects, we push each
138080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // register a different number of times.
138090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      int times = i % 4 + 1;
138100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      if (i & 1) {
138110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Push odd-numbered registers as W registers.
138120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ PushMultipleTimes(times, w[i]);
138130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Fill in the expected stack slots.
138140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        for (int j = 0; j < times; j++) {
138150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          if (w[i].Is(wzr)) {
138160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            // The zero register always writes zeroes.
138170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            stack[active_w_slots++] = 0;
138180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          } else {
138190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            stack[active_w_slots++] = literal_base_w * i;
138200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          }
138210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
138220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      } else {
138230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Push even-numbered registers as X registers.
138240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ PushMultipleTimes(times, x[i]);
138250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Fill in the expected stack slots.
138260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        for (int j = 0; j < times; j++) {
138270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          if (x[i].Is(xzr)) {
138280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            // The zero register always writes zeroes.
138290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            stack[active_w_slots++] = 0;
138300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            stack[active_w_slots++] = 0;
138310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          } else {
138320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            stack[active_w_slots++] = literal_base_hi * i;
138330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            stack[active_w_slots++] = literal_base_lo * i;
138340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          }
138350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
138360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      }
138370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
138380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Because we were pushing several registers at a time, we probably pushed
138390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // more than we needed to.
138400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (active_w_slots > requested_w_slots) {
138410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Drop((active_w_slots - requested_w_slots) * kWRegSizeInBytes);
138420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Bump the number of active W-sized slots back to where it should be,
138430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // and fill the empty space with a dummy value.
138440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      do {
138450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        stack[active_w_slots--] = 0xdeadbeef;
138460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      } while (active_w_slots > requested_w_slots);
138470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
138480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // ---- Pop ----
138500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    Clobber(&masm, list);
138520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // If popping an even number of registers, the first one will be X-sized.
138540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Otherwise, the first one will be W-sized.
138550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    bool next_is_64 = !(reg_count & 1);
138560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int i = reg_count-1; i >= 0; i--) {
138570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      if (next_is_64) {
138580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Pop(x[i]);
138590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        active_w_slots -= 2;
138600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      } else {
138610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Pop(w[i]);
138620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        active_w_slots -= 1;
138630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      }
138640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      next_is_64 = !next_is_64;
138650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
138660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    VIXL_ASSERT(active_w_slots == 0);
138670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Drop memory to restore stack_pointer.
138690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Drop(claim);
138700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Mov(sp, __ StackPointer());
138720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ SetStackPointer(sp);
138730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
138740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
138760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
138780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int slot = 0;
138800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < reg_count; i++) {
138810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Even-numbered registers were written as W registers.
138820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Odd-numbered registers were written as X registers.
138830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    bool expect_64 = (i & 1);
138840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t expected;
138850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (expect_64) {
138870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t hi = stack[slot++];
138880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t lo = stack[slot++];
138890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      expected = (hi << 32) | lo;
138900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else {
138910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      expected = stack[slot++];
138920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
138930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
138940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Always use ASSERT_EQUAL_64, even when testing W registers, so we can
138950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // test that the upper word was properly cleared by Pop.
138960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (x[i].Is(xzr)) {
138970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(0, x[i]);
138980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else {
138990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(expected, x[i]);
139000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
139010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
139020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(slot == requested_w_slots);
139030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
139050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
139060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139080cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(push_pop_xreg_wx_overlap) {
139090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int claim = 0; claim <= 8; claim++) {
139100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int count = 1; count <= 8; count++) {
139110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      PushPopXRegWXOverlapHelper(count, claim);
139120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
139130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Test with the maximum number of registers.
139140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    PushPopXRegWXOverlapHelper(kPushPopXRegMaxRegCount, claim);
139150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
139160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
139170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139190cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(push_pop_sp) {
139200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
139210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
139230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(sp.Is(__ StackPointer()));
139250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Acquire all temps from the MacroAssembler. They are used arbitrarily below.
139270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  UseScratchRegisterScope temps(&masm);
139280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  temps.ExcludeAll();
139290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x3, 0x3333333333333333);
139310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, 0x2222222222222222);
139320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x1111111111111111);
139330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0000000000000000);
139340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(2 * kXRegSizeInBytes);
139350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PushXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit());
139360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Push(x3, x2);
139370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PopXRegList(x0.Bit() | x1.Bit() | x2.Bit() | x3.Bit());
139380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Push(x2, x1, x3, x0);
139390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Pop(x4, x5);
139400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Pop(x6, x7, x8, x9);
139410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(2 * kXRegSizeInBytes);
139430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PushWRegList(w0.Bit() | w1.Bit() | w2.Bit() | w3.Bit());
139440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Push(w3, w1, w2, w0);
139450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PopWRegList(w10.Bit() | w11.Bit() | w12.Bit() | w13.Bit());
139460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Pop(w14, w15, w16, w17);
139470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(2 * kXRegSizeInBytes);
139490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Push(w2, w2, w1, w1);
139500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Push(x3, x3);
139510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Pop(w18, w19, w20, w21);
139520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Pop(x22, x23);
139530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(2 * kXRegSizeInBytes);
139550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PushXRegList(x1.Bit() | x22.Bit());
139560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PopXRegList(x24.Bit() | x26.Bit());
139570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(2 * kXRegSizeInBytes);
139590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PushWRegList(w1.Bit() | w2.Bit() | w4.Bit() | w22.Bit());
139600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PopWRegList(w25.Bit() | w27.Bit() | w28.Bit() | w29.Bit());
139610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Claim(2 * kXRegSizeInBytes);
139630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PushXRegList(0);
139640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PopXRegList(0);
139650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PushXRegList(0xffffffff);
139660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PopXRegList(0xffffffff);
139670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Drop(12 * kXRegSizeInBytes);
139680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
139690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
139710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1111111111111111, x3);
139730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000000000, x2);
139740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3333333333333333, x1);
139750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x2222222222222222, x0);
139760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3333333333333333, x9);
139770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x2222222222222222, x8);
139780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000000000, x7);
139790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3333333333333333, x6);
139800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1111111111111111, x5);
139810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x2222222222222222, x4);
139820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x11111111U, w13);
139840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x33333333U, w12);
139850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00000000U, w11);
139860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x22222222U, w10);
139870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x11111111U, w17);
139880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00000000U, w16);
139890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x33333333U, w15);
139900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x22222222U, w14);
139910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x11111111U, w18);
139930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x11111111U, w19);
139940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x11111111U, w20);
139950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x11111111U, w21);
139960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3333333333333333, x22);
139970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000000000, x23);
139980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
139990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3333333333333333, x24);
140000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3333333333333333, x26);
140010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x33333333U, w25);
140030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00000000U, w27);
140040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x22222222U, w28);
140050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x33333333U, w29);
140060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
140070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
140080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140100cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(noreg) {
140110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This test doesn't generate any code, but it verifies some invariants
140120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // related to NoReg.
140130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoReg.Is(NoFPReg));
140140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoFPReg.Is(NoReg));
140150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoVReg.Is(NoReg));
140170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoReg.Is(NoVReg));
140180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoReg.Is(NoCPUReg));
140200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoCPUReg.Is(NoReg));
140210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoFPReg.Is(NoCPUReg));
140230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoCPUReg.Is(NoFPReg));
140240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoVReg.Is(NoCPUReg));
140260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoCPUReg.Is(NoVReg));
140270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoReg.IsNone());
140290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoFPReg.IsNone());
140300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoVReg.IsNone());
140310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(NoCPUReg.IsNone());
140320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
140330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140350cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(isvalid) {
140360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This test doesn't generate any code, but it verifies some invariants
140370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // related to IsValid().
140380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!NoReg.IsValid());
140390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!NoFPReg.IsValid());
140400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!NoVReg.IsValid());
140410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!NoCPUReg.IsValid());
140420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(x0.IsValid());
140440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(w0.IsValid());
140450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(x30.IsValid());
140460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(w30.IsValid());
140470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(xzr.IsValid());
140480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(wzr.IsValid());
140490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(sp.IsValid());
140510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(wsp.IsValid());
140520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(d0.IsValid());
140540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(s0.IsValid());
140550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(d31.IsValid());
140560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(s31.IsValid());
140570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(x0.IsValidRegister());
140590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(w0.IsValidRegister());
140600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(xzr.IsValidRegister());
140610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(wzr.IsValidRegister());
140620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(sp.IsValidRegister());
140630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(wsp.IsValidRegister());
140640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!x0.IsValidFPRegister());
140650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!w0.IsValidFPRegister());
140660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!xzr.IsValidFPRegister());
140670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!wzr.IsValidFPRegister());
140680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!sp.IsValidFPRegister());
140690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!wsp.IsValidFPRegister());
140700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(d0.IsValidFPRegister());
140720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(s0.IsValidFPRegister());
140730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!d0.IsValidRegister());
140740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!s0.IsValidRegister());
140750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test the same as before, but using CPURegister types. This shouldn't make
140770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // any difference.
140780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(x0).IsValid());
140790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(w0).IsValid());
140800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(x30).IsValid());
140810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(w30).IsValid());
140820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(xzr).IsValid());
140830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(wzr).IsValid());
140840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(sp).IsValid());
140860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(wsp).IsValid());
140870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(d0).IsValid());
140890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(s0).IsValid());
140900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(d31).IsValid());
140910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(s31).IsValid());
140920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
140930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(x0).IsValidRegister());
140940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(w0).IsValidRegister());
140950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(xzr).IsValidRegister());
140960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(wzr).IsValidRegister());
140970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(sp).IsValidRegister());
140980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(wsp).IsValidRegister());
140990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!static_cast<CPURegister>(x0).IsValidFPRegister());
141000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!static_cast<CPURegister>(w0).IsValidFPRegister());
141010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!static_cast<CPURegister>(xzr).IsValidFPRegister());
141020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!static_cast<CPURegister>(wzr).IsValidFPRegister());
141030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!static_cast<CPURegister>(sp).IsValidFPRegister());
141040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!static_cast<CPURegister>(wsp).IsValidFPRegister());
141050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(d0).IsValidFPRegister());
141070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(static_cast<CPURegister>(s0).IsValidFPRegister());
141080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!static_cast<CPURegister>(d0).IsValidRegister());
141090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(!static_cast<CPURegister>(s0).IsValidRegister());
141100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
141110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141130cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(printf) {
141140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
141150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
141160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  char const * test_plain_string = "Printf with no arguments.\n";
141180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  char const * test_substring = "'This is a substring.'";
141190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RegisterDump before;
141200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Initialize x29 to the value of the stack pointer. We will use x29 as a
141220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // temporary stack pointer later, and initializing it in this way allows the
141230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // RegisterDump check to pass.
141240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x29, __ StackPointer());
141250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test simple integer arguments.
141270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 1234);
141280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x1234);
141290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test simple floating-point arguments.
141310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d0, 1.234);
141320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test pointer (string) arguments.
141340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(test_substring));
141350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test the maximum number of arguments, and sign extension.
141370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, 0xffffffff);
141380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w4, 0xffffffff);
141390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, 0xffffffffffffffff);
141400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x6, 0xffffffffffffffff);
141410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.234);
141420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 2.345);
141430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d3, 3.456);
141440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d4, 4.567);
141450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test printing callee-saved registers.
141470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x28, 0x123456789abcdef);
141480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 42.0);
141490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test with three arguments.
141510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, 3);
141520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, 40);
141530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x12, 500);
141540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // A single character.
141560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w13, 'x');
141570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that we don't clobber any registers.
141590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  before.Dump(&masm);
141600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf(test_plain_string);   // NOLINT(runtime/printf)
141620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("x0: %" PRId64 ", x1: 0x%08" PRIx64 "\n", x0, x1);
141630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("w5: %" PRId32 ", x5: %" PRId64"\n", w5, x5);
141640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("d0: %f\n", d0);
141650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("Test %%s: %s\n", x2);
141660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n"
141670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n",
141680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            w3, w4, x5, x6);
141690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4);
141700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("0x%" PRIx32 ", 0x%" PRIx64 "\n", w28, x28);
141710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("%g\n", d10);
141720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("%%%%%s%%%c%%\n", x2, w13);
141730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Print the stack pointer (sp).
141750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("StackPointer(sp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n",
141760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            __ StackPointer(), __ StackPointer().W());
141770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test with a different stack pointer.
141790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register old_stack_pointer = __ StackPointer();
141800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x29, old_stack_pointer);
141810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ SetStackPointer(x29);
141820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Print the stack pointer (not sp).
141830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("StackPointer(not sp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n",
141840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            __ StackPointer(), __ StackPointer().W());
141850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(old_stack_pointer, __ StackPointer());
141860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ SetStackPointer(old_stack_pointer);
141870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test with three arguments.
141890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("3=%u, 4=%u, 5=%u\n", x10, x11, x12);
141900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Mixed argument types.
141920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("w3: %" PRIu32 ", s1: %f, x5: %" PRIu64 ", d3: %f\n",
141930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            w3, s1, x5, d3);
141940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Printf("s1: %f, d3: %f, w3: %" PRId32 ", x5: %" PRId64 "\n",
141950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl            s1, d3, w3, x5);
141960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
141970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
141980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
141990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We cannot easily test the output of the Printf sequences, and because
142010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Printf preserves all registers by default, we can't look at the number of
142020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // bytes that were printed. However, the printf_no_preserve test should check
142030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // that, and here we just test that we didn't clobber any registers.
142040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_REGISTERS(before);
142050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
142070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
142080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142100cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(printf_no_preserve) {
142110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
142120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
142130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  char const * test_plain_string = "Printf with no arguments.\n";
142150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  char const * test_substring = "'This is a substring.'";
142160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve(test_plain_string);
142180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x19, x0);
142190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test simple integer arguments.
142210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 1234);
142220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0x1234);
142230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("x0: %" PRId64", x1: 0x%08" PRIx64 "\n", x0, x1);
142240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, x0);
142250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test simple floating-point arguments.
142270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d0, 1.234);
142280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("d0: %f\n", d0);
142290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, x0);
142300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test pointer (string) arguments.
142320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, reinterpret_cast<uintptr_t>(test_substring));
142330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("Test %%s: %s\n", x2);
142340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, x0);
142350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test the maximum number of arguments, and sign extension.
142370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, 0xffffffff);
142380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w4, 0xffffffff);
142390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, 0xffffffffffffffff);
142400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x6, 0xffffffffffffffff);
142410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("w3(uint32): %" PRIu32 "\nw4(int32): %" PRId32 "\n"
142420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      "x5(uint64): %" PRIu64 "\nx6(int64): %" PRId64 "\n",
142430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      w3, w4, x5, x6);
142440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x23, x0);
142450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.234);
142470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 2.345);
142480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d3, 3.456);
142490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d4, 4.567);
142500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("%%f: %f\n%%g: %g\n%%e: %e\n%%E: %E\n", s1, s2, d3, d4);
142510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x24, x0);
142520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test printing callee-saved registers.
142540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x28, 0x123456789abcdef);
142550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("0x%" PRIx32 ", 0x%" PRIx64 "\n", w28, x28);
142560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x25, x0);
142570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, 42.0);
142590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("%g\n", d10);
142600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x26, x0);
142610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test with a different stack pointer.
142630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const Register old_stack_pointer = __ StackPointer();
142640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x29, old_stack_pointer);
142650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ SetStackPointer(x29);
142660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Print the stack pointer (not sp).
142670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve(
142680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      "StackPointer(not sp): 0x%016" PRIx64 ", 0x%08" PRIx32 "\n",
142690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ StackPointer(), __ StackPointer().W());
142700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x27, x0);
142710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(old_stack_pointer, __ StackPointer());
142720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ SetStackPointer(old_stack_pointer);
142730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test with three arguments.
142750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x3, 3);
142760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, 40);
142770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, 500);
142780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("3=%u, 4=%u, 5=%u\n", x3, x4, x5);
142790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x28, x0);
142800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Mixed argument types.
142820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w3, 0xffffffff);
142830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 1.234);
142840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, 0xffffffffffffffff);
142850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d3, 3.456);
142860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ PrintfNoPreserve("w3: %" PRIu32 ", s1: %f, x5: %" PRIu64 ", d3: %f\n",
142870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      w3, s1, x5, d3);
142880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x29, x0);
142890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
142910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
142920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We cannot easily test the exact output of the Printf sequences, but we can
142940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // use the return code to check that the string length was correct.
142950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
142960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Printf with no arguments.
142970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(strlen(test_plain_string), x19);
142980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // x0: 1234, x1: 0x00001234
142990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(25, x20);
143000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // d0: 1.234000
143010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(13, x21);
143020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test %s: 'This is a substring.'
143030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(32, x22);
143040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // w3(uint32): 4294967295
143050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // w4(int32): -1
143060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // x5(uint64): 18446744073709551615
143070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // x6(int64): -1
143080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(23 + 14 + 33 + 14, x23);
143090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // %f: 1.234000
143100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // %g: 2.345
143110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // %e: 3.456000e+00
143120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // %E: 4.567000E+00
143130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(13 + 10 + 17 + 17, x24);
143140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // 0x89abcdef, 0x123456789abcdef
143150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(30, x25);
143160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // 42
143170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(3, x26);
143180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // StackPointer(not sp): 0x00007fb037ae2370, 0x37ae2370
143190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Note: This is an example value, but the field width is fixed here so the
143200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // string length is still predictable.
143210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(53, x27);
143220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // 3=3, 4=40, 5=500
143230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(17, x28);
143240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // w3: 4294967295, s1: 1.234000, x5: 18446744073709551615, d3: 3.456000
143250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(69, x29);
143260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
143280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
143290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143319795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang#ifndef VIXL_INCLUDE_SIMULATOR
143320cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(trace) {
143330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The Trace helper should not generate any code unless the simulator (or
143340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // debugger) is being used.
143350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
143360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
143370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label start;
143390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&start);
143400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Trace(LOG_ALL, TRACE_ENABLE);
143410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Trace(LOG_ALL, TRACE_DISABLE);
143420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
143430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
143450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
143460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
143470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#endif
143480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143509795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang#ifndef VIXL_INCLUDE_SIMULATOR
143510cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(log) {
143520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The Log helper should not generate any code unless the simulator (or
143530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // debugger) is being used.
143540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
143550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
143560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label start;
143580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&start);
143590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Log(LOG_ALL);
143600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(__ SizeOfCodeGeneratedSince(&start) == 0);
143610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
143630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
143640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
143650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#endif
143660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143680cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(instruction_accurate_scope) {
143690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
143700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
143710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // By default macro instructions are allowed.
143730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(masm.AllowMacroInstructions());
143740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
143750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    InstructionAccurateScope scope1(&masm, 2);
143760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    VIXL_ASSERT(!masm.AllowMacroInstructions());
143770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ nop();
143780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    {
143790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      InstructionAccurateScope scope2(&masm, 1);
143800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_ASSERT(!masm.AllowMacroInstructions());
143810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ nop();
143820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
143830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    VIXL_ASSERT(!masm.AllowMacroInstructions());
143840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
143850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(masm.AllowMacroInstructions());
143860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {
143880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    InstructionAccurateScope scope(&masm, 2);
143890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ add(x0, x0, x0);
143900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ sub(x0, x0, x0);
143910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
143920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
143940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
143950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
143960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
143970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
143990cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(blr_lr) {
144000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // A simple test to check that the simulator correcty handle "blr lr".
144010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
144020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
144040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label target;
144050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label end;
144060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0);
144080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adr(lr, &target);
144090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Blr(lr);
144110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0xdeadbeef);
144120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&end);
144130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&target);
144150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0xc001c0de);
144160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&end);
144180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
144190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
144210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xc001c0de, x0);
144230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
144250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
144260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144280cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(barriers) {
144290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Generate all supported barriers, this is just a smoke test
144300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
144310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
144330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // DMB
144350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(FullSystem, BarrierAll);
144360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(FullSystem, BarrierReads);
144370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(FullSystem, BarrierWrites);
144380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(FullSystem, BarrierOther);
144390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(InnerShareable, BarrierAll);
144410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(InnerShareable, BarrierReads);
144420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(InnerShareable, BarrierWrites);
144430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(InnerShareable, BarrierOther);
144440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(NonShareable, BarrierAll);
144460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(NonShareable, BarrierReads);
144470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(NonShareable, BarrierWrites);
144480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(NonShareable, BarrierOther);
144490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(OuterShareable, BarrierAll);
144510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(OuterShareable, BarrierReads);
144520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(OuterShareable, BarrierWrites);
144530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dmb(OuterShareable, BarrierOther);
144540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // DSB
144560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(FullSystem, BarrierAll);
144570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(FullSystem, BarrierReads);
144580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(FullSystem, BarrierWrites);
144590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(FullSystem, BarrierOther);
144600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(InnerShareable, BarrierAll);
144620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(InnerShareable, BarrierReads);
144630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(InnerShareable, BarrierWrites);
144640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(InnerShareable, BarrierOther);
144650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(NonShareable, BarrierAll);
144670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(NonShareable, BarrierReads);
144680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(NonShareable, BarrierWrites);
144690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(NonShareable, BarrierOther);
144700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(OuterShareable, BarrierAll);
144720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(OuterShareable, BarrierReads);
144730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(OuterShareable, BarrierWrites);
144740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dsb(OuterShareable, BarrierOther);
144750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // ISB
144770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Isb();
144780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
144800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
144820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
144840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
144850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144870cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(process_nan_double) {
144880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Make sure that NaN propagation works correctly.
144890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sn = rawbits_to_double(0x7ff5555511111111);
144900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qn = rawbits_to_double(0x7ffaaaaa11111111);
144910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sn));
144920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn));
144930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
144940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The input NaNs after passing through ProcessNaN.
144950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sn_proc = rawbits_to_double(0x7ffd555511111111);
144960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qn_proc = qn;
144970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sn_proc));
144980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn_proc));
144990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
145010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
145020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Execute a number of instructions which all use ProcessNaN, and check that
145040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // they all handle the NaN correctly.
145050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d0, sn);
145060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d10, qn);
145070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Operations that always propagate NaNs unchanged, even signalling NaNs.
145090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaN
145100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d1, d0);
145110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(d2, d0);
145120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d3, d0);
145130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaN
145140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d11, d10);
145150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(d12, d10);
145160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(d13, d10);
145170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Operations that use ProcessNaN.
145190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaN
145200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d4, d0);
145210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d5, d0);
145220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d6, d0);
145230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d7, d0);
145240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaN
145250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(d14, d10);
145260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(d15, d10);
145270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(d16, d10);
145280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(d17, d10);
145290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The behaviour of fcvt is checked in TEST(fcvt_sd).
145310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
145330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
145340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t qn_raw = double_to_rawbits(qn);
145360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t sn_raw = double_to_rawbits(sn);
145370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaN
145390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(sn, d1);
145400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(sn_raw & ~kDSignMask), d2);
145410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(sn_raw ^ kDSignMask), d3);
145420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaN
145430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(qn, d11);
145440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(qn_raw & ~kDSignMask), d12);
145450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(rawbits_to_double(qn_raw ^ kDSignMask), d13);
145460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaN
145480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(sn_proc, d4);
145490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(sn_proc, d5);
145500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(sn_proc, d6);
145510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(sn_proc, d7);
145520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaN
145530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(qn_proc, d14);
145540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(qn_proc, d15);
145550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(qn_proc, d16);
145560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(qn_proc, d17);
145570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
145590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
145600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145620cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(process_nan_float) {
145630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Make sure that NaN propagation works correctly.
145640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sn = rawbits_to_float(0x7f951111);
145650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qn = rawbits_to_float(0x7fea1111);
145660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sn));
145670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn));
145680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The input NaNs after passing through ProcessNaN.
145700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sn_proc = rawbits_to_float(0x7fd51111);
145710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qn_proc = qn;
145720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sn_proc));
145730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn_proc));
145740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
145760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
145770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Execute a number of instructions which all use ProcessNaN, and check that
145790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // they all handle the NaN correctly.
145800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, sn);
145810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s10, qn);
145820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Operations that always propagate NaNs unchanged, even signalling NaNs.
145840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaN
145850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, s0);
145860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(s2, s0);
145870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s3, s0);
145880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaN
145890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s11, s10);
145900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabs(s12, s10);
145910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fneg(s13, s10);
145920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
145930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Operations that use ProcessNaN.
145940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaN
145950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s4, s0);
145960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s5, s0);
145970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s6, s0);
145980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s7, s0);
145990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaN
146000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsqrt(s14, s10);
146010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frinta(s15, s10);
146020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintn(s16, s10);
146030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Frintz(s17, s10);
146040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The behaviour of fcvt is checked in TEST(fcvt_sd).
146060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
146080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
146090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t qn_raw = float_to_rawbits(qn);
146110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t sn_raw = float_to_rawbits(sn);
146120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaN
146140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(sn, s1);
146150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(sn_raw & ~kSSignMask), s2);
146160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(sn_raw ^ kSSignMask), s3);
146170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaN
146180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(qn, s11);
146190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(qn_raw & ~kSSignMask), s12);
146200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(rawbits_to_float(qn_raw ^ kSSignMask), s13);
146210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaN
146230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(sn_proc, s4);
146240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(sn_proc, s5);
146250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(sn_proc, s6);
146260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(sn_proc, s7);
146270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaN
146280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(qn_proc, s14);
146290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(qn_proc, s15);
146300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(qn_proc, s16);
146310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(qn_proc, s17);
146320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
146340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
146350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146370cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void ProcessNaNsHelper(double n, double m, double expected) {
146380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(std::isnan(n) || std::isnan(m));
146390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(std::isnan(expected));
146400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
146420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
146430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Execute a number of instructions which all use ProcessNaNs, and check that
146450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // they all propagate NaNs correctly.
146460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d0, n);
146470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d1, m);
146480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(d2, d0, d1);
146500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(d3, d0, d1);
146510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(d4, d0, d1);
146520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(d5, d0, d1);
146530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmax(d6, d0, d1);
146540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmin(d7, d0, d1);
146550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
146570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
146580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(expected, d2);
146600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(expected, d3);
146610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(expected, d4);
146620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(expected, d5);
146630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(expected, d6);
146640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(expected, d7);
146650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
146670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
146680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146700cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(process_nans_double) {
146710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Make sure that NaN propagation works correctly.
146720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sn = rawbits_to_double(0x7ff5555511111111);
146730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sm = rawbits_to_double(0x7ff5555522222222);
146740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qn = rawbits_to_double(0x7ffaaaaa11111111);
146750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qm = rawbits_to_double(0x7ffaaaaa22222222);
146760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sn));
146770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sm));
146780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn));
146790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qm));
146800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The input NaNs after passing through ProcessNaN.
146820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sn_proc = rawbits_to_double(0x7ffd555511111111);
146830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sm_proc = rawbits_to_double(0x7ffd555522222222);
146840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qn_proc = qn;
146850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qm_proc = qm;
146860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sn_proc));
146870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sm_proc));
146880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn_proc));
146890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qm_proc));
146900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Quiet NaNs are propagated.
146920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(qn, 0, qn_proc);
146930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(0, qm, qm_proc);
146940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(qn, qm, qn_proc);
146950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
146960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Signalling NaNs are propagated, and made quiet.
146970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(sn, 0, sn_proc);
146980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(0, sm, sm_proc);
146990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(sn, sm, sn_proc);
147000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Signalling NaNs take precedence over quiet NaNs.
147020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(sn, qm, sn_proc);
147030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(qn, sm, sm_proc);
147040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(sn, sm, sn_proc);
147050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
147060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147080cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void ProcessNaNsHelper(float n, float m, float expected) {
147090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(std::isnan(n) || std::isnan(m));
147100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(std::isnan(expected));
147110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
147130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
147140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Execute a number of instructions which all use ProcessNaNs, and check that
147160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // they all propagate NaNs correctly.
147170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, n);
147180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, m);
147190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fadd(s2, s0, s1);
147210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fsub(s3, s0, s1);
147220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmul(s4, s0, s1);
147230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fdiv(s5, s0, s1);
147240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmax(s6, s0, s1);
147250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmin(s7, s0, s1);
147260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
147280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
147290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(expected, s2);
147310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(expected, s3);
147320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(expected, s4);
147330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(expected, s5);
147340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(expected, s6);
147350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(expected, s7);
147360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
147380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
147390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147410cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(process_nans_float) {
147420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Make sure that NaN propagation works correctly.
147430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sn = rawbits_to_float(0x7f951111);
147440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sm = rawbits_to_float(0x7f952222);
147450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qn = rawbits_to_float(0x7fea1111);
147460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qm = rawbits_to_float(0x7fea2222);
147470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sn));
147480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sm));
147490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn));
147500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qm));
147510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The input NaNs after passing through ProcessNaN.
147530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sn_proc = rawbits_to_float(0x7fd51111);
147540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sm_proc = rawbits_to_float(0x7fd52222);
147550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qn_proc = qn;
147560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qm_proc = qm;
147570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sn_proc));
147580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(sm_proc));
147590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn_proc));
147600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qm_proc));
147610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Quiet NaNs are propagated.
147630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(qn, 0, qn_proc);
147640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(0, qm, qm_proc);
147650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(qn, qm, qn_proc);
147660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Signalling NaNs are propagated, and made quiet.
147680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(sn, 0, sn_proc);
147690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(0, sm, sm_proc);
147700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(sn, sm, sn_proc);
147710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Signalling NaNs take precedence over quiet NaNs.
147730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(sn, qm, sn_proc);
147740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(qn, sm, sm_proc);
147750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ProcessNaNsHelper(sn, sm, sn_proc);
147760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
147770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147790cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void DefaultNaNHelper(float n, float m, float a) {
147800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(std::isnan(n) || std::isnan(m) || std::isnan(a));
147810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  bool test_1op = std::isnan(n);
147830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  bool test_2op = std::isnan(n) || std::isnan(m);
147840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
147860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
147870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Enable Default-NaN mode in the FPCR.
147890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x0, FPCR);
147900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(x1, x0, DN_mask);
147910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(FPCR, x1);
147920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Execute a number of instructions which all use ProcessNaNs, and check that
147940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // they all produce the default NaN.
147950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, n);
147960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, m);
147970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, a);
147980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
147990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (test_1op) {
148000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Operations that always propagate NaNs unchanged, even signalling NaNs.
148010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(s10, s0);
148020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fabs(s11, s0);
148030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fneg(s12, s0);
148040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Operations that use ProcessNaN.
148060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fsqrt(s13, s0);
148070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Frinta(s14, s0);
148080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Frintn(s15, s0);
148090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Frintz(s16, s0);
148100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Fcvt usually has special NaN handling, but it respects default-NaN mode.
148120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcvt(d17, s0);
148130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
148140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (test_2op) {
148160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fadd(s18, s0, s1);
148170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fsub(s19, s0, s1);
148180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmul(s20, s0, s1);
148190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fdiv(s21, s0, s1);
148200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmax(s22, s0, s1);
148210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmin(s23, s0, s1);
148220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
148230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmadd(s24, s0, s1, s2);
148250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmsub(s25, s0, s1, s2);
148260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fnmadd(s26, s0, s1, s2);
148270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fnmsub(s27, s0, s1, s2);
148280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Restore FPCR.
148300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(FPCR, x0);
148310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
148330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
148340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (test_1op) {
148360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint32_t n_raw = float_to_rawbits(n);
148370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(n, s10);
148380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(rawbits_to_float(n_raw & ~kSSignMask), s11);
148390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(rawbits_to_float(n_raw ^ kSSignMask), s12);
148400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s13);
148410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s14);
148420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s15);
148430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s16);
148440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d17);
148450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
148460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (test_2op) {
148480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s18);
148490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s19);
148500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s20);
148510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s21);
148520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s22);
148530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s23);
148540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
148550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s24);
148570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s25);
148580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s26);
148590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s27);
148600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
148620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
148630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148650cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(default_nan_float) {
148660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sn = rawbits_to_float(0x7f951111);
148670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sm = rawbits_to_float(0x7f952222);
148680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float sa = rawbits_to_float(0x7f95aaaa);
148690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qn = rawbits_to_float(0x7fea1111);
148700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qm = rawbits_to_float(0x7fea2222);
148710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  float qa = rawbits_to_float(0x7feaaaaa);
148720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sn));
148730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sm));
148740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sa));
148750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn));
148760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qm));
148770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qa));
148780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
148790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaNs
148800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, 0.0f, 0.0f);
148810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0f, sm, 0.0f);
148820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0f, 0.0f, sa);
148830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, sm, 0.0f);
148840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0f, sm, sa);
148850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, 0.0f, sa);
148860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, sm, sa);
148870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaNs
148880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, 0.0f, 0.0f);
148890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0f, qm, 0.0f);
148900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0f, 0.0f, qa);
148910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, qm, 0.0f);
148920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0f, qm, qa);
148930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, 0.0f, qa);
148940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, qm, qa);
148950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Mixed NaNs
148960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, sm, sa);
148970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, qm, sa);
148980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, sm, qa);
148990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, qm, sa);
149000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, qm, qa);
149010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, sm, qa);
149020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, qm, qa);
149030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
149040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149060cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstatic void DefaultNaNHelper(double n, double m, double a) {
149070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(std::isnan(n) || std::isnan(m) || std::isnan(a));
149080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  bool test_1op = std::isnan(n);
149100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  bool test_2op = std::isnan(n) || std::isnan(m);
149110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
149130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
149140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Enable Default-NaN mode in the FPCR.
149160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mrs(x0, FPCR);
149170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(x1, x0, DN_mask);
149180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(FPCR, x1);
149190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Execute a number of instructions which all use ProcessNaNs, and check that
149210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // they all produce the default NaN.
149220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d0, n);
149230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d1, m);
149240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d2, a);
149250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (test_1op) {
149270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Operations that always propagate NaNs unchanged, even signalling NaNs.
149280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmov(d10, d0);
149290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fabs(d11, d0);
149300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fneg(d12, d0);
149310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Operations that use ProcessNaN.
149330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fsqrt(d13, d0);
149340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Frinta(d14, d0);
149350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Frintn(d15, d0);
149360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Frintz(d16, d0);
149370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Fcvt usually has special NaN handling, but it respects default-NaN mode.
149390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fcvt(s17, d0);
149400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
149410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (test_2op) {
149430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fadd(d18, d0, d1);
149440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fsub(d19, d0, d1);
149450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmul(d20, d0, d1);
149460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fdiv(d21, d0, d1);
149470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmax(d22, d0, d1);
149480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Fmin(d23, d0, d1);
149490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
149500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmadd(d24, d0, d1, d2);
149520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmsub(d25, d0, d1, d2);
149530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fnmadd(d26, d0, d1, d2);
149540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fnmsub(d27, d0, d1, d2);
149550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Restore FPCR.
149570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Msr(FPCR, x0);
149580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
149600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
149610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (test_1op) {
149630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t n_raw = double_to_rawbits(n);
149640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(n, d10);
149650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(rawbits_to_double(n_raw & ~kDSignMask), d11);
149660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(rawbits_to_double(n_raw ^ kDSignMask), d12);
149670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d13);
149680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d14);
149690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d15);
149700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d16);
149710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP32(kFP32DefaultNaN, s17);
149720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
149730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  if (test_2op) {
149750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d18);
149760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d19);
149770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d20);
149780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d21);
149790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d22);
149800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    ASSERT_EQUAL_FP64(kFP64DefaultNaN, d23);
149810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
149820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d24);
149840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d25);
149850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d26);
149860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d27);
149870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
149890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
149900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
149920cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(default_nan_double) {
149930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sn = rawbits_to_double(0x7ff5555511111111);
149940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sm = rawbits_to_double(0x7ff5555522222222);
149950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double sa = rawbits_to_double(0x7ff55555aaaaaaaa);
149960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qn = rawbits_to_double(0x7ffaaaaa11111111);
149970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qm = rawbits_to_double(0x7ffaaaaa22222222);
149980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  double qa = rawbits_to_double(0x7ffaaaaaaaaaaaaa);
149990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sn));
150000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sm));
150010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsSignallingNaN(sa));
150020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qn));
150030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qm));
150040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_ASSERT(IsQuietNaN(qa));
150050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Signalling NaNs
150070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, 0.0, 0.0);
150080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0, sm, 0.0);
150090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0, 0.0, sa);
150100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, sm, 0.0);
150110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0, sm, sa);
150120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, 0.0, sa);
150130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, sm, sa);
150140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Quiet NaNs
150150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, 0.0, 0.0);
150160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0, qm, 0.0);
150170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0, 0.0, qa);
150180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, qm, 0.0);
150190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(0.0, qm, qa);
150200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, 0.0, qa);
150210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, qm, qa);
150220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   - Mixed NaNs
150230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, sm, sa);
150240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, qm, sa);
150250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, sm, qa);
150260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, qm, sa);
150270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(sn, qm, qa);
150280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, sm, qa);
150290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  DefaultNaNHelper(qn, qm, qa);
150300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
150310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150330cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldar_stlr) {
150340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The middle value is read, modified, and written. The padding exists only to
150350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // check for over-write.
150360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t b[] = {0, 0x12, 0};
150370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint16_t h[] = {0, 0x1234, 0};
150380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t w[] = {0, 0x12345678, 0};
150390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x[] = {0, 0x123456789abcdef0, 0};
150400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
150420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
150430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&b[1]));
150450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldarb(w0, MemOperand(x10));
150460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
150470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlrb(w0, MemOperand(x10));
150480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&h[1]));
150500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldarh(w0, MemOperand(x10));
150510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
150520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlrh(w0, MemOperand(x10));
150530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&w[1]));
150550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldar(w0, MemOperand(x10));
150560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
150570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlr(w0, MemOperand(x10));
150580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&x[1]));
150600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldar(x0, MemOperand(x10));
150610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
150620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlr(x0, MemOperand(x10));
150630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
150650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
150660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x13, b[1]);
150680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x1235, h[1]);
150690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x12345679, w[1]);
150700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1, x[1]);
150710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check for over-write.
150730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, b[0]);
150740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, b[2]);
150750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, h[0]);
150760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, h[2]);
150770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w[0]);
150780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w[2]);
150795ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(0, x[0]);
150805ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(0, x[2]);
150810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
150830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
150840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150860cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldxr_stxr) {
150870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The middle value is read, modified, and written. The padding exists only to
150880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // check for over-write.
150890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t b[] = {0, 0x12, 0};
150900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint16_t h[] = {0, 0x1234, 0};
150910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t w[] = {0, 0x12345678, 0};
150920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x[] = {0, 0x123456789abcdef0, 0};
150930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
150940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // As above, but get suitably-aligned values for ldxp and stxp.
150950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t wp_data[] = {0, 0, 0, 0, 0};
150960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t * wp = AlignUp(wp_data + 1, kWRegSizeInBytes * 2) - 1;
150970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  wp[1] = 0x12345678;           // wp[1] is 64-bit-aligned.
150980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  wp[2] = 0x87654321;
150990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t xp_data[] = {0, 0, 0, 0, 0};
151000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t * xp = AlignUp(xp_data + 1, kXRegSizeInBytes * 2) - 1;
151010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  xp[1] = 0x123456789abcdef0;   // xp[1] is 128-bit-aligned.
151020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  xp[2] = 0x0fedcba987654321;
151030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
151050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
151060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&b[1]));
151080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_b;
151090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_b);
151100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxrb(w0, MemOperand(x10));
151110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
151120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxrb(w5, w0, MemOperand(x10));
151130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_b);
151140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&h[1]));
151160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_h;
151170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_h);
151180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxrh(w0, MemOperand(x10));
151190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
151200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxrh(w5, w0, MemOperand(x10));
151210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_h);
151220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&w[1]));
151240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_w;
151250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_w);
151260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxr(w0, MemOperand(x10));
151270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
151280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxr(w5, w0, MemOperand(x10));
151290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_w);
151300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&x[1]));
151320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_x;
151330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_x);
151340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxr(x0, MemOperand(x10));
151350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
151360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxr(w5, x0, MemOperand(x10));
151370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_x);
151380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&wp[1]));
151400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_wp;
151410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_wp);
151420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxp(w0, w1, MemOperand(x10));
151430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
151440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w1, w1, 1);
151450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxp(w5, w0, w1, MemOperand(x10));
151460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_wp);
151470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&xp[1]));
151490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_xp;
151500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_xp);
151510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxp(x0, x1, MemOperand(x10));
151520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
151530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x1, 1);
151540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxp(w5, x0, x1, MemOperand(x10));
151550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_xp);
151560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
151580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
151590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x13, b[1]);
151610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x1235, h[1]);
151620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x12345679, w[1]);
151630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1, x[1]);
151640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x12345679, wp[1]);
151650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x87654322, wp[2]);
151660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1, xp[1]);
151670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0fedcba987654322, xp[2]);
151680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check for over-write.
151700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, b[0]);
151710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, b[2]);
151720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, h[0]);
151730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, h[2]);
151740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w[0]);
151750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w[2]);
151760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x[0]);
151770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x[2]);
151780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, wp[0]);
151790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, wp[3]);
151800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, xp[0]);
151810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, xp[3]);
151820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
151840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
151850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151870cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldaxr_stlxr) {
151880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The middle value is read, modified, and written. The padding exists only to
151890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // check for over-write.
151900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint8_t b[] = {0, 0x12, 0};
151910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint16_t h[] = {0, 0x1234, 0};
151920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t w[] = {0, 0x12345678, 0};
151930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t x[] = {0, 0x123456789abcdef0, 0};
151940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
151950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // As above, but get suitably-aligned values for ldxp and stxp.
151960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t wp_data[] = {0, 0, 0, 0, 0};
151970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint32_t * wp = AlignUp(wp_data + 1, kWRegSizeInBytes * 2) - 1;
151980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  wp[1] = 0x12345678;           // wp[1] is 64-bit-aligned.
151990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  wp[2] = 0x87654321;
152000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t xp_data[] = {0, 0, 0, 0, 0};
152010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t * xp = AlignUp(xp_data + 1, kXRegSizeInBytes * 2) - 1;
152020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  xp[1] = 0x123456789abcdef0;   // xp[1] is 128-bit-aligned.
152030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  xp[2] = 0x0fedcba987654321;
152040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
152060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
152070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&b[1]));
152090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_b;
152100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_b);
152110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxrb(w0, MemOperand(x10));
152120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
152130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxrb(w5, w0, MemOperand(x10));
152140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_b);
152150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&h[1]));
152170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_h;
152180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_h);
152190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxrh(w0, MemOperand(x10));
152200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
152210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxrh(w5, w0, MemOperand(x10));
152220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_h);
152230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&w[1]));
152250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_w;
152260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_w);
152270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxr(w0, MemOperand(x10));
152280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
152290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxr(w5, w0, MemOperand(x10));
152300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_w);
152310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&x[1]));
152330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_x;
152340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_x);
152350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxr(x0, MemOperand(x10));
152360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
152370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxr(w5, x0, MemOperand(x10));
152380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_x);
152390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&wp[1]));
152410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_wp;
152420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_wp);
152430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxp(w0, w1, MemOperand(x10));
152440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
152450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w1, w1, 1);
152460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxp(w5, w0, w1, MemOperand(x10));
152470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_wp);
152480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(&xp[1]));
152500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_xp;
152510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_xp);
152520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxp(x0, x1, MemOperand(x10));
152530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
152540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x1, 1);
152550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxp(w5, x0, x1, MemOperand(x10));
152560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbnz(w5, &try_xp);
152570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
152590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
152600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x13, b[1]);
152620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x1235, h[1]);
152630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x12345679, w[1]);
152640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1, x[1]);
152650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x12345679, wp[1]);
152660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x87654322, wp[2]);
152670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x123456789abcdef1, xp[1]);
152680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0fedcba987654322, xp[2]);
152690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check for over-write.
152710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, b[0]);
152720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, b[2]);
152730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, h[0]);
152740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, h[2]);
152750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w[0]);
152760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, w[2]);
152770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x[0]);
152780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x[2]);
152790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, wp[0]);
152800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0, wp[3]);
152810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, xp[0]);
152820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, xp[3]);
152830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
152850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
152860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152880cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(clrex) {
152890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This data should never be written.
152900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t data[] = {0, 0, 0};
152910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t * data_aligned = AlignUp(data, kXRegSizeInBytes * 2);
152920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
152940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
152950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(data_aligned));
152970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w6, 0);
152980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
152990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxrb(w0, MemOperand(x10));
153000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
153020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxrb(w5, w0, MemOperand(x10));
153030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxrh(w0, MemOperand(x10));
153060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
153080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxrh(w5, w0, MemOperand(x10));
153090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxr(w0, MemOperand(x10));
153120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
153140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxr(w5, w0, MemOperand(x10));
153150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxr(x0, MemOperand(x10));
153180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
153200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxr(w5, x0, MemOperand(x10));
153210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxp(w0, w1, MemOperand(x10));
153240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
153260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w1, w1, 1);
153270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxp(w5, w0, w1, MemOperand(x10));
153280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxp(x0, x1, MemOperand(x10));
153310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
153330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x1, 1);
153340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxp(w5, x0, x1, MemOperand(x10));
153350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Acquire-release variants.
153380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxrb(w0, MemOperand(x10));
153400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
153420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxrb(w5, w0, MemOperand(x10));
153430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxrh(w0, MemOperand(x10));
153460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
153480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxrh(w5, w0, MemOperand(x10));
153490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxr(w0, MemOperand(x10));
153520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
153540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxr(w5, w0, MemOperand(x10));
153550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxr(x0, MemOperand(x10));
153580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
153600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxr(w5, x0, MemOperand(x10));
153610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxp(w0, w1, MemOperand(x10));
153640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w0, w0, 1);
153660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w1, w1, 1);
153670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxp(w5, w0, w1, MemOperand(x10));
153680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxp(x0, x1, MemOperand(x10));
153710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clrex();
153720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, 1);
153730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x1, 1);
153740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxp(w5, x0, x1, MemOperand(x10));
153750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(w6, w6, w5);
153760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
153780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
153790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // None of the 12 store-exclusives should have succeeded.
153810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(12, w6);
153820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, data[0]);
153840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, data[1]);
153850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, data[2]);
15386f83765e26812f0d09307defe5dcbabb19632ab45Serban Constantinescu
15387f83765e26812f0d09307defe5dcbabb19632ab45Serban Constantinescu  TEARDOWN();
153880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
153890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153919795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang#ifdef VIXL_INCLUDE_SIMULATOR
153920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Check that the simulator occasionally makes store-exclusive fail.
153930cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldxr_stxr_fail) {
153940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t data[] = {0, 0, 0};
153950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t * data_aligned = AlignUp(data, kXRegSizeInBytes * 2);
153960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
153970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Impose a hard limit on the number of attempts, so the test cannot hang.
153980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const uint64_t kWatchdog = 10000;
153990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label done;
154000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
154020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
154030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(data_aligned));
154050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, kWatchdog);
154060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This loop is the opposite of what we normally do with ldxr and stxr; we
154080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // keep trying until we fail (or the watchdog counter runs out).
154090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_b;
154100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_b);
154110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxrb(w0, MemOperand(x10));
154120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxrb(w5, w0, MemOperand(x10));
154130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check the watchdog counter.
154140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
154150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
154160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check the exclusive-store result.
154170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_b);
154180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_h;
154200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_h);
154210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxrh(w0, MemOperand(x10));
154220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxrh(w5, w0, MemOperand(x10));
154230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
154240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
154250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_h);
154260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_w;
154280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_w);
154290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxr(w0, MemOperand(x10));
154300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxr(w5, w0, MemOperand(x10));
154310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
154320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
154330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_w);
154340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_x;
154360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_x);
154370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxr(x0, MemOperand(x10));
154380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxr(w5, x0, MemOperand(x10));
154390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
154400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
154410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_x);
154420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_wp;
154440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_wp);
154450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxp(w0, w1, MemOperand(x10));
154460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxp(w5, w0, w1, MemOperand(x10));
154470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
154480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
154490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_wp);
154500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_xp;
154520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_xp);
154530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxp(x0, x1, MemOperand(x10));
154540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxp(w5, x0, x1, MemOperand(x10));
154550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
154560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
154570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_xp);
154580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
154600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Trigger an error if x11 (watchdog) is zero.
154610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x11, 0);
154620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cset(x12, eq);
154630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
154650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
154660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that the watchdog counter didn't run out.
154680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x12);
15469f83765e26812f0d09307defe5dcbabb19632ab45Serban Constantinescu
15470f83765e26812f0d09307defe5dcbabb19632ab45Serban Constantinescu  TEARDOWN();
154710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
154720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#endif
154730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154759795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang#ifdef VIXL_INCLUDE_SIMULATOR
154760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Check that the simulator occasionally makes store-exclusive fail.
154770cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(ldaxr_stlxr_fail) {
154780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t data[] = {0, 0, 0};
154790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t * data_aligned = AlignUp(data, kXRegSizeInBytes * 2);
154800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Impose a hard limit on the number of attempts, so the test cannot hang.
154820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static const uint64_t kWatchdog = 10000;
154830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label done;
154840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
154860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
154870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, reinterpret_cast<uintptr_t>(data_aligned));
154890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, kWatchdog);
154900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
154910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This loop is the opposite of what we normally do with ldxr and stxr; we
154920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // keep trying until we fail (or the watchdog counter runs out).
154930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_b;
154940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_b);
154950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldxrb(w0, MemOperand(x10));
154960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stxrb(w5, w0, MemOperand(x10));
154970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check the watchdog counter.
154980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
154990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
155000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check the exclusive-store result.
155010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_b);
155020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_h;
155040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_h);
155050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxrh(w0, MemOperand(x10));
155060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxrh(w5, w0, MemOperand(x10));
155070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
155080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
155090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_h);
155100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_w;
155120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_w);
155130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxr(w0, MemOperand(x10));
155140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxr(w5, w0, MemOperand(x10));
155150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
155160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
155170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_w);
155180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_x;
155200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_x);
155210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxr(x0, MemOperand(x10));
155220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxr(w5, x0, MemOperand(x10));
155230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
155240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
155250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_x);
155260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_wp;
155280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_wp);
155290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxp(w0, w1, MemOperand(x10));
155300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxp(w5, w0, w1, MemOperand(x10));
155310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
155320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
155330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_wp);
155340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label try_xp;
155360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&try_xp);
155370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ldaxp(x0, x1, MemOperand(x10));
155380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Stlxp(w5, x0, x1, MemOperand(x10));
155390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(x11, x11, 1);
155400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x11, &done);
155410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(w5, &try_xp);
155420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
155440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Trigger an error if x11 (watchdog) is zero.
155450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x11, 0);
155460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cset(x12, eq);
155470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
155490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
155500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Check that the watchdog counter didn't run out.
155520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0, x12);
15553f83765e26812f0d09307defe5dcbabb19632ab45Serban Constantinescu
15554f83765e26812f0d09307defe5dcbabb19632ab45Serban Constantinescu  TEARDOWN();
155550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
155560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#endif
155570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155590cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_tagged_immediate_offset) {
155600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t tags[] = { 0x00, 0x1, 0x55, 0xff };
155610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int tag_count = sizeof(tags) / sizeof(tags[0]);
155620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int kMaxDataLength = 160;
155640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < tag_count; i++) {
155660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    unsigned char src[kMaxDataLength];
155670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_raw = reinterpret_cast<uint64_t>(src);
155680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_tag = tags[i];
155690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_tagged = CPU::SetPointerTag(src_raw, src_tag);
155700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int k = 0; k < kMaxDataLength; k++) {
155720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      src[k] = k + 1;
155730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
155740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int j = 0; j < tag_count; j++) {
155760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      unsigned char dst[kMaxDataLength];
155770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_raw = reinterpret_cast<uint64_t>(dst);
155780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_tag = tags[j];
155790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_tagged = CPU::SetPointerTag(dst_raw, dst_tag);
155800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      memset(dst, 0, kMaxDataLength);
155820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      SETUP();
155840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ALLOW_ASM();
155850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      START();
155860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x0, src_tagged);
155880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x1, dst_tagged);
155890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      int offset = 0;
155910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Scaled-immediate offsets.
155930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(q0, q1, MemOperand(x0, offset));
155940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(q0, q1, MemOperand(x1, offset));
155950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2 * kQRegSizeInBytes;
155960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
155970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(x2, x3, MemOperand(x0, offset));
155980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(x2, x3, MemOperand(x1, offset));
155990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2 * kXRegSizeInBytes;
156000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldpsw(x2, x3, MemOperand(x0, offset));
156020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(w2, w3, MemOperand(x1, offset));
156030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2 * kWRegSizeInBytes;
156040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(d0, d1, MemOperand(x0, offset));
156060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(d0, d1, MemOperand(x1, offset));
156070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2 * kDRegSizeInBytes;
156080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(w2, w3, MemOperand(x0, offset));
156100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(w2, w3, MemOperand(x1, offset));
156110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2 * kWRegSizeInBytes;
156120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(s0, s1, MemOperand(x0, offset));
156140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(s0, s1, MemOperand(x1, offset));
156150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2 * kSRegSizeInBytes;
156160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(x2, MemOperand(x0, offset), RequireScaledOffset);
156180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(x2, MemOperand(x1, offset), RequireScaledOffset);
156190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += kXRegSizeInBytes;
156200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(d0, MemOperand(x0, offset), RequireScaledOffset);
156220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(d0, MemOperand(x1, offset), RequireScaledOffset);
156230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += kDRegSizeInBytes;
156240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(w2, MemOperand(x0, offset), RequireScaledOffset);
156260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(w2, MemOperand(x1, offset), RequireScaledOffset);
156270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += kWRegSizeInBytes;
156280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(s0, MemOperand(x0, offset), RequireScaledOffset);
156300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(s0, MemOperand(x1, offset), RequireScaledOffset);
156310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += kSRegSizeInBytes;
156320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrh(w2, MemOperand(x0, offset), RequireScaledOffset);
156340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strh(w2, MemOperand(x1, offset), RequireScaledOffset);
156350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2;
156360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrsh(w2, MemOperand(x0, offset), RequireScaledOffset);
156380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strh(w2, MemOperand(x1, offset), RequireScaledOffset);
156390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2;
156400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrb(w2, MemOperand(x0, offset), RequireScaledOffset);
156420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strb(w2, MemOperand(x1, offset), RequireScaledOffset);
156430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 1;
156440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrsb(w2, MemOperand(x0, offset), RequireScaledOffset);
156460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strb(w2, MemOperand(x1, offset), RequireScaledOffset);
156470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 1;
156480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Unscaled-immediate offsets.
156500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldur(x2, MemOperand(x0, offset), RequireUnscaledOffset);
156520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stur(x2, MemOperand(x1, offset), RequireUnscaledOffset);
156530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += kXRegSizeInBytes;
156540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldur(d0, MemOperand(x0, offset), RequireUnscaledOffset);
156560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stur(d0, MemOperand(x1, offset), RequireUnscaledOffset);
156570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += kDRegSizeInBytes;
156580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldur(w2, MemOperand(x0, offset), RequireUnscaledOffset);
156600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stur(w2, MemOperand(x1, offset), RequireUnscaledOffset);
156610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += kWRegSizeInBytes;
156620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldur(s0, MemOperand(x0, offset), RequireUnscaledOffset);
156640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stur(s0, MemOperand(x1, offset), RequireUnscaledOffset);
156650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += kSRegSizeInBytes;
156660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldurh(w2, MemOperand(x0, offset), RequireUnscaledOffset);
156680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ sturh(w2, MemOperand(x1, offset), RequireUnscaledOffset);
156690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2;
156700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldursh(w2, MemOperand(x0, offset), RequireUnscaledOffset);
156720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ sturh(w2, MemOperand(x1, offset), RequireUnscaledOffset);
156730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 2;
156740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldurb(w2, MemOperand(x0, offset), RequireUnscaledOffset);
156760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ sturb(w2, MemOperand(x1, offset), RequireUnscaledOffset);
156770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 1;
156780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldursb(w2, MemOperand(x0, offset), RequireUnscaledOffset);
156800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ sturb(w2, MemOperand(x1, offset), RequireUnscaledOffset);
156810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      offset += 1;
156820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Extract the tag (so we can test that it was preserved correctly).
156840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Ubfx(x0, x0, kAddressTagOffset, kAddressTagWidth);
156850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Ubfx(x1, x1, kAddressTagOffset, kAddressTagWidth);
156860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_ASSERT(kMaxDataLength >= offset);
156880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      END();
156900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      RUN();
156910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(src_tag, x0);
156930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(dst_tag, x1);
156940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      for (int k = 0; k < offset; k++) {
156960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        VIXL_CHECK(src[k] == dst[k]);
156970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      }
156980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
156990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      TEARDOWN();
157000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
157010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
15702f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
15703f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
15704f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
157050cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_tagged_immediate_preindex) {
157060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t tags[] = { 0x00, 0x1, 0x55, 0xff };
157070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int tag_count = sizeof(tags) / sizeof(tags[0]);
157080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int kMaxDataLength = 128;
157100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < tag_count; i++) {
157120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    unsigned char src[kMaxDataLength];
157130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_raw = reinterpret_cast<uint64_t>(src);
157140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_tag = tags[i];
157150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_tagged = CPU::SetPointerTag(src_raw, src_tag);
157160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int k = 0; k < kMaxDataLength; k++) {
157180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      src[k] = k + 1;
157190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
157200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int j = 0; j < tag_count; j++) {
157220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      unsigned char dst[kMaxDataLength];
157230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_raw = reinterpret_cast<uint64_t>(dst);
157240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_tag = tags[j];
157250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_tagged = CPU::SetPointerTag(dst_raw, dst_tag);
157260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      for (int k = 0; k < kMaxDataLength; k++) {
157280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        dst[k] = 0;
157290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      }
157300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      SETUP();
157320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ALLOW_ASM();
157330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      START();
157340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Each MemOperand must apply a pre-index equal to the size of the
157360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // previous access.
157370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Start with a non-zero preindex.
157390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      int preindex = 62 * kXRegSizeInBytes;
157400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      int data_length = 0;
157410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x0, src_tagged - preindex);
157430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x1, dst_tagged - preindex);
157440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(q0, q1, MemOperand(x0, preindex, PreIndex));
157460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(q0, q1, MemOperand(x1, preindex, PreIndex));
157470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 2 * kQRegSizeInBytes;
157480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length = preindex;
157490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(x2, x3, MemOperand(x0, preindex, PreIndex));
157510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(x2, x3, MemOperand(x1, preindex, PreIndex));
157520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 2 * kXRegSizeInBytes;
157530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldpsw(x2, x3, MemOperand(x0, preindex, PreIndex));
157560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(w2, w3, MemOperand(x1, preindex, PreIndex));
157570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 2 * kWRegSizeInBytes;
157580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(d0, d1, MemOperand(x0, preindex, PreIndex));
157610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(d0, d1, MemOperand(x1, preindex, PreIndex));
157620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 2 * kDRegSizeInBytes;
157630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(w2, w3, MemOperand(x0, preindex, PreIndex));
157660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(w2, w3, MemOperand(x1, preindex, PreIndex));
157670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 2 * kWRegSizeInBytes;
157680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(s0, s1, MemOperand(x0, preindex, PreIndex));
157710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(s0, s1, MemOperand(x1, preindex, PreIndex));
157720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 2 * kSRegSizeInBytes;
157730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(x2, MemOperand(x0, preindex, PreIndex));
157760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(x2, MemOperand(x1, preindex, PreIndex));
157770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = kXRegSizeInBytes;
157780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(d0, MemOperand(x0, preindex, PreIndex));
157810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(d0, MemOperand(x1, preindex, PreIndex));
157820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = kDRegSizeInBytes;
157830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(w2, MemOperand(x0, preindex, PreIndex));
157860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(w2, MemOperand(x1, preindex, PreIndex));
157870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = kWRegSizeInBytes;
157880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(s0, MemOperand(x0, preindex, PreIndex));
157910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(s0, MemOperand(x1, preindex, PreIndex));
157920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = kSRegSizeInBytes;
157930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
157950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrh(w2, MemOperand(x0, preindex, PreIndex));
157960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strh(w2, MemOperand(x1, preindex, PreIndex));
157970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 2;
157980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
157990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
158000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrsh(w2, MemOperand(x0, preindex, PreIndex));
158010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strh(w2, MemOperand(x1, preindex, PreIndex));
158020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 2;
158030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
158040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
158050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrb(w2, MemOperand(x0, preindex, PreIndex));
158060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strb(w2, MemOperand(x1, preindex, PreIndex));
158070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 1;
158080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
158090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
158100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrsb(w2, MemOperand(x0, preindex, PreIndex));
158110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strb(w2, MemOperand(x1, preindex, PreIndex));
158120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      preindex = 1;
158130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += preindex;
15814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_ASSERT(kMaxDataLength >= data_length);
15816ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      END();
158180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      RUN();
15819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Check that the preindex was correctly applied in each operation, and
158210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // that the tag was preserved.
158220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(src_tagged + data_length - preindex, x0);
158230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(dst_tagged + data_length - preindex, x1);
158241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
158250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      for (int k = 0; k < data_length; k++) {
158260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        VIXL_CHECK(src[k] == dst[k]);
158270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      }
158281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
158290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      TEARDOWN();
158300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
158310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
158320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
158331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
15834ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158350cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_tagged_immediate_postindex) {
158360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t tags[] = { 0x00, 0x1, 0x55, 0xff };
158370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int tag_count = sizeof(tags) / sizeof(tags[0]);
15838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int kMaxDataLength = 128;
15840ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < tag_count; i++) {
158420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    unsigned char src[kMaxDataLength];
158430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_raw = reinterpret_cast<uint64_t>(src);
158440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_tag = tags[i];
158450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_tagged = CPU::SetPointerTag(src_raw, src_tag);
15846f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
158470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int k = 0; k < kMaxDataLength; k++) {
158480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      src[k] = k + 1;
15849f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
15850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int j = 0; j < tag_count; j++) {
158520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      unsigned char dst[kMaxDataLength];
158530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_raw = reinterpret_cast<uint64_t>(dst);
158540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_tag = tags[j];
158550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_tagged = CPU::SetPointerTag(dst_raw, dst_tag);
15856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      for (int k = 0; k < kMaxDataLength; k++) {
158580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        dst[k] = 0;
158590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      }
15860f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
158610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      SETUP();
158620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ALLOW_ASM();
158630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      START();
15864f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
158650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      int postindex = 2 * kXRegSizeInBytes;
158660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      int data_length = 0;
15867f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
158680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x0, src_tagged);
158690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x1, dst_tagged);
15870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(x2, x3, MemOperand(x0, postindex, PostIndex));
158720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(x2, x3, MemOperand(x1, postindex, PostIndex));
158730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length = postindex;
15874ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 2 * kQRegSizeInBytes;
158760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(q0, q1, MemOperand(x0, postindex, PostIndex));
158770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(q0, q1, MemOperand(x1, postindex, PostIndex));
158780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15879ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 2 * kWRegSizeInBytes;
158810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldpsw(x2, x3, MemOperand(x0, postindex, PostIndex));
158820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(w2, w3, MemOperand(x1, postindex, PostIndex));
158830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15884ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 2 * kDRegSizeInBytes;
158860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(d0, d1, MemOperand(x0, postindex, PostIndex));
158870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(d0, d1, MemOperand(x1, postindex, PostIndex));
158880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 2 * kWRegSizeInBytes;
158910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(w2, w3, MemOperand(x0, postindex, PostIndex));
158920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(w2, w3, MemOperand(x1, postindex, PostIndex));
158930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
158950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 2 * kSRegSizeInBytes;
158960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldp(s0, s1, MemOperand(x0, postindex, PostIndex));
158970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ stp(s0, s1, MemOperand(x1, postindex, PostIndex));
158980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15899ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = kXRegSizeInBytes;
159010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(x2, MemOperand(x0, postindex, PostIndex));
159020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(x2, MemOperand(x1, postindex, PostIndex));
159030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15904ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = kDRegSizeInBytes;
159060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(d0, MemOperand(x0, postindex, PostIndex));
159070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(d0, MemOperand(x1, postindex, PostIndex));
159080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15909ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = kWRegSizeInBytes;
159110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(w2, MemOperand(x0, postindex, PostIndex));
159120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(w2, MemOperand(x1, postindex, PostIndex));
159130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = kSRegSizeInBytes;
159160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldr(s0, MemOperand(x0, postindex, PostIndex));
159170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ str(s0, MemOperand(x1, postindex, PostIndex));
159180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
159191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
159200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 2;
159210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrh(w2, MemOperand(x0, postindex, PostIndex));
159220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strh(w2, MemOperand(x1, postindex, PostIndex));
159230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
159241123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
159250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 2;
159260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrsh(w2, MemOperand(x0, postindex, PostIndex));
159270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strh(w2, MemOperand(x1, postindex, PostIndex));
159280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
159291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
159300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 1;
159310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrb(w2, MemOperand(x0, postindex, PostIndex));
159320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strb(w2, MemOperand(x1, postindex, PostIndex));
159330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
159340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
159350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      postindex = 1;
159360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ ldrsb(w2, MemOperand(x0, postindex, PostIndex));
159370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ strb(w2, MemOperand(x1, postindex, PostIndex));
159380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      data_length += postindex;
15939f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
159400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_ASSERT(kMaxDataLength >= data_length);
15941f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
159420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      END();
159430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      RUN();
15944f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
159450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Check that the postindex was correctly applied in each operation, and
159460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // that the tag was preserved.
159470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(src_tagged + data_length, x0);
159480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(dst_tagged + data_length, x1);
159490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
159500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      for (int k = 0; k < data_length; k++) {
159510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        VIXL_CHECK(src[k] == dst[k]);
159520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      }
159530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
159540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      TEARDOWN();
15955f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    }
15956f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  }
15957ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
15958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
15959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159600cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_tagged_register_offset) {
159610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t tags[] = { 0x00, 0x1, 0x55, 0xff };
159620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int tag_count = sizeof(tags) / sizeof(tags[0]);
15963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int kMaxDataLength = 128;
15965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < tag_count; i++) {
159670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    unsigned char src[kMaxDataLength];
159680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_raw = reinterpret_cast<uint64_t>(src);
159690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_tag = tags[i];
159700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    uint64_t src_tagged = CPU::SetPointerTag(src_raw, src_tag);
15971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int k = 0; k < kMaxDataLength; k++) {
159730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      src[k] = k + 1;
159740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
15975ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int j = 0; j < tag_count; j++) {
159770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      unsigned char dst[kMaxDataLength];
159780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_raw = reinterpret_cast<uint64_t>(dst);
159790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_tag = tags[j];
159800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t dst_tagged = CPU::SetPointerTag(dst_raw, dst_tag);
15981ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // Also tag the offset register; the operation should still succeed.
159830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      for (int o = 0; o < tag_count; o++) {
159840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        uint64_t offset_base = CPU::SetPointerTag(UINT64_C(0), tags[o]);
159850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        int data_length = 0;
15986ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
159870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        for (int k = 0; k < kMaxDataLength; k++) {
159880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          dst[k] = 0;
159890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
159901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
159910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        SETUP();
159920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        ALLOW_ASM();
159930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        START();
159941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
159950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x0, src_tagged);
159960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x1, dst_tagged);
159971123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
159980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x10, offset_base + data_length);
159990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ ldr(x2, MemOperand(x0, x10));
160000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ str(x2, MemOperand(x1, x10));
160010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        data_length += kXRegSizeInBytes;
16002f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
160030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x10, offset_base + data_length);
160040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ ldr(d0, MemOperand(x0, x10));
160050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ str(d0, MemOperand(x1, x10));
160060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        data_length += kDRegSizeInBytes;
16007f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
160080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x10, offset_base + data_length);
160090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ ldr(w2, MemOperand(x0, x10));
160100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ str(w2, MemOperand(x1, x10));
160110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        data_length += kWRegSizeInBytes;
16012f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
160130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x10, offset_base + data_length);
160140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ ldr(s0, MemOperand(x0, x10));
160150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ str(s0, MemOperand(x1, x10));
160160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        data_length += kSRegSizeInBytes;
160170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x10, offset_base + data_length);
160190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ ldrh(w2, MemOperand(x0, x10));
160200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ strh(w2, MemOperand(x1, x10));
160210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        data_length += 2;
160220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x10, offset_base + data_length);
160240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ ldrsh(w2, MemOperand(x0, x10));
160250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ strh(w2, MemOperand(x1, x10));
160260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        data_length += 2;
160270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x10, offset_base + data_length);
160290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ ldrb(w2, MemOperand(x0, x10));
160300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ strb(w2, MemOperand(x1, x10));
160310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        data_length += 1;
160320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ Mov(x10, offset_base + data_length);
160340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ ldrsb(w2, MemOperand(x0, x10));
160350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        __ strb(w2, MemOperand(x1, x10));
160360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        data_length += 1;
160370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        VIXL_ASSERT(kMaxDataLength >= data_length);
160390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        END();
160410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        RUN();
160420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // Check that the postindex was correctly applied in each operation, and
160440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        // that the tag was preserved.
160450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        ASSERT_EQUAL_64(src_tagged, x0);
160460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        ASSERT_EQUAL_64(dst_tagged, x1);
160470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        ASSERT_EQUAL_64(offset_base + data_length - 1, x10);
160480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        for (int k = 0; k < data_length; k++) {
160500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl          VIXL_CHECK(src[k] == dst[k]);
160510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        }
160520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
160530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl        TEARDOWN();
160540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      }
16055ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl    }
16056ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  }
16057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
160600cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(load_store_tagged_register_postindex) {
160610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t src[] = { 0x0706050403020100, 0x0f0e0d0c0b0a0908 };
160620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uint64_t tags[] = { 0x00, 0x1, 0x55, 0xff };
160630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int tag_count = sizeof(tags) / sizeof(tags[0]);
16064ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
160650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int j = 0; j < tag_count; j++) {
160660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    for (int i = 0; i < tag_count; i++) {
160670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      SETUP();
160680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t src_base = reinterpret_cast<uint64_t>(src);
160690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t src_tagged = CPU::SetPointerTag(src_base, tags[i]);
160700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      uint64_t offset_tagged = CPU::SetPointerTag(UINT64_C(0), tags[j]);
16071ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
160720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      START();
160730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x10, src_tagged);
160740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Mov(x11, offset_tagged);
160750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Ld1(v0.V16B(), MemOperand(x10, x11, PostIndex));
160760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // TODO: add other instructions (ld2-4, st1-4) as they become available.
160770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      END();
16078ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
160790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      RUN();
16080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
160810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_128(0x0f0e0d0c0b0a0908, 0x0706050403020100, q0);
160820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      ASSERT_EQUAL_64(src_tagged + offset_tagged, x10);
16083ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
160840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      TEARDOWN();
160850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
160860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
160870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
16088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
160900cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(branch_tagged) {
160910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
160920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
16093578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
160940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label loop, loop_entry, done;
160950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adr(x0, &loop);
160960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
160970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&loop_entry);
16098578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
160990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&loop);
161000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x1, 1);  // Count successful jumps.
16101ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Advance to the next tag, then bail out if we've come back around to tag 0.
161030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, UINT64_C(1) << kAddressTagOffset);
161040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tst(x0, kAddressTagMask);
161050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(eq, &done);
16106ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&loop_entry);
161080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Br(x0);
161090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
161100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
161110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
161120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
161130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
161140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
161150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1 << kAddressTagWidth, x1);
16116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
16118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16120ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161210cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(branch_and_link_tagged) {
16122ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
16123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
16124f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
161250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label loop, loop_entry, done;
161260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adr(x0, &loop);
161270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
161280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&loop_entry);
161291123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
161300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&loop);
161311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
161320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Bail out (before counting a successful jump) if lr appears to be tagged.
161330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tst(lr, kAddressTagMask);
161340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(ne, &done);
161351123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
161360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x1, 1);  // Count successful jumps.
161371123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
161380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Advance to the next tag, then bail out if we've come back around to tag 0.
161390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, UINT64_C(1) << kAddressTagOffset);
161400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tst(x0, kAddressTagMask);
161410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(eq, &done);
16142ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&loop_entry);
161440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Blr(x0);
161450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
161460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
16147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
16149ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
16150ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1 << kAddressTagWidth, x1);
16152ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
16154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16155ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16156ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161570cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(branch_tagged_and_adr_adrp) {
161580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP_CUSTOM(BUF_SIZE, PageOffsetDependentCode);
16159ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
16160ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label loop, loop_entry, done;
161620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adr(x0, &loop);
161630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
161640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&loop_entry);
16165ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&loop);
16167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Bail out (before counting a successful jump) if `adr x10, ...` is tagged.
161690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adr(x10, &done);
161700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tst(x10, kAddressTagMask);
161710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(ne, &done);
16172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Bail out (before counting a successful jump) if `adrp x11, ...` is tagged.
161740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Adrp(x11, &done);
161750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tst(x11, kAddressTagMask);
161760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(ne, &done);
16177ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x1, x1, 1);  // Count successful iterations.
16179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Advance to the next tag, then bail out if we've come back around to tag 0.
161810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(x0, x0, UINT64_C(1) << kAddressTagOffset);
161820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tst(x0, kAddressTagMask);
161830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(eq, &done);
16184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&loop_entry);
161860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Br(x0);
16187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
16189ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
16191ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
16192ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1 << kAddressTagWidth, x1);
16194ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16195f83765e26812f0d09307defe5dcbabb19632ab45Serban Constantinescu  TEARDOWN_CUSTOM();
16196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16197ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
161980cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_addp) {
16199ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
16200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
16202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
162030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
162040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x000055aaff55ff00, 0xaa55ff55555500ff);
162050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addp(v16.V16B(), v0.V16B(), v1.V16B());
162060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
16207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
16208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
162100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ff54ffff54aaff, 0xffffffffffffffff, q16);
16211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
16212ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
162140cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_sqdmulh_sqrdmulh) {
16215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
16216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16217ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
16218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
162190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0000000000000000, 0x0000040004008000);
162200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0000000000000000, 0x0000002000108000);
162210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0400000080000000, 0x0400000080000000);
162220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x0000002080000000, 0x0000001080000000);
162230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
162240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmulh(v16.V4H(), v0.V4H(), v1.V4H());
162250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmulh(v17.V4S(), v2.V4S(), v3.V4S());
162260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmulh(h18, h0, h1);
162270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmulh(s19, s2, s3);
162280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
162290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrdmulh(v20.V4H(), v0.V4H(), v1.V4H());
162300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrdmulh(v21.V4S(), v2.V4S(), v3.V4S());
162310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrdmulh(h22, h0, h1);
162320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrdmulh(s23, s2, s3);
162330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
16234ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
16235ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16236ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
162370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000100007fff, q16);
162380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000017fffffff, 0x000000007fffffff, q17);
162390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q18);
162400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q19);
162410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000100017fff, q20);
162420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000017fffffff, 0x000000017fffffff, q21);
162430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q22);
162440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q23);
162450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
162460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
16247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
162480cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_byelement_sqdmulh_sqrdmulh) {
162490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
16250ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
162510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
162520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
162530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0000000000000000, 0x0000040004008000);
162540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0000000000000000, 0x0000002000108000);
162550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0400000080000000, 0x0400000080000000);
162560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x0000002080000000, 0x0000001080000000);
162570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
162580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmulh(v16.V4H(), v0.V4H(), v1.H(), 1);
162590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmulh(v17.V4S(), v2.V4S(), v3.S(), 1);
162600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmulh(h18, h0, v1.H(), 0);
162610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmulh(s19, s2, v3.S(), 0);
162620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
162630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrdmulh(v20.V4H(), v0.V4H(), v1.H(), 1);
162640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrdmulh(v21.V4S(), v2.V4S(), v3.S(), 1);
162650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrdmulh(h22, h0, v1.H(), 0);
162660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrdmulh(s23, s2, v3.S(), 0);
162670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
162680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
162690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
162700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
162710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000000000fff0, q16);
162720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000fffffff0, 0x00000000fffffff0, q17);
162730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q18);
162740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q19);
162750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000010001fff0, q20);
162760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000001fffffff0, 0x00000001fffffff0, q21);
162770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q22);
162780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q23);
16279ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
16280ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16281ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16282ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
162830cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_saddlp) {
16284f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
16285f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
16286f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
16287f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
162880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
16289f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
162900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlp(v16.V8H(), v0.V16B());
162910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlp(v17.V4H(), v0.V8B());
16292f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
162930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlp(v18.V4S(), v0.V8H());
162940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlp(v19.V2S(), v0.V4H());
16295f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
162960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlp(v20.V2D(), v0.V4S());
162970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlp(v21.V1D(), v0.V2S());
16298f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
162990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
16300ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
163010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
163020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0080ffffff010080, 0xff01ffff0080ff01, q16);
163030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xff01ffff0080ff01, q17);
163040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000800000000081, 0xffff7f81ffff8200, q18);
163050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffff7f81ffff8200, q19);
163060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000818000, 0xffffffff82017f81, q20);
163070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffff82017f81, q21);
16308ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  TEARDOWN();
16309ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl}
16310ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
163110cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_uaddlp) {
163124a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
163134a06316541258e3c058792321295ee36d409f419armvixl
163144a06316541258e3c058792321295ee36d409f419armvixl  START();
163154a06316541258e3c058792321295ee36d409f419armvixl
163160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
163174a06316541258e3c058792321295ee36d409f419armvixl
163180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlp(v16.V8H(), v0.V16B());
163190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlp(v17.V4H(), v0.V8B());
163200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlp(v18.V4S(), v0.V8H());
163220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlp(v19.V2S(), v0.V4H());
163230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlp(v20.V2D(), v0.V4S());
163250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlp(v21.V1D(), v0.V2S());
163264a06316541258e3c058792321295ee36d409f419armvixl
163274a06316541258e3c058792321295ee36d409f419armvixl  END();
163284a06316541258e3c058792321295ee36d409f419armvixl
163294a06316541258e3c058792321295ee36d409f419armvixl  RUN();
163300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x008000ff01010080, 0x010100ff00800101, q16);
163310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x010100ff00800101, q17);
163320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000800000010081, 0x00017f8100008200, q18);
163330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00017f8100008200, q19);
163340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000100818000, 0x0000000082017f81, q20);
163350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000082017f81, q21);
163360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
163370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
163384a06316541258e3c058792321295ee36d409f419armvixl
163390cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_sadalp) {
163400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
163410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
163434a06316541258e3c058792321295ee36d409f419armvixl
163440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
163450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
163460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
163470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
163480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
163490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V16B(), v1.V16B());
163510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V16B(), v1.V16B());
163520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sadalp(v16.V8H(), v0.V16B());
163530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sadalp(v17.V4H(), v0.V8B());
163540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V16B(), v2.V16B());
163560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V16B(), v2.V16B());
163570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sadalp(v18.V4S(), v1.V8H());
163580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sadalp(v19.V2S(), v1.V4H());
163590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V16B(), v3.V16B());
163610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V16B(), v4.V16B());
163620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sadalp(v20.V2D(), v2.V4S());
163630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sadalp(v21.V1D(), v2.V2S());
163640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
163660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
163680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x80808000ff000080, 0xff00ffff00817f00, q16);
163690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xff00ffff00817f00, q17);
163700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fff0001fffffffe, 0xffffffff80007fff, q18);
163710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffff80007fff, q19);
163720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff80000000, 0x800000007ffffffe, q20);
163730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q21);
163744a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
163754a06316541258e3c058792321295ee36d409f419armvixl}
163764a06316541258e3c058792321295ee36d409f419armvixl
163770cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_uadalp) {
16378ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  SETUP();
16379ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
16380ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  START();
16381ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
163820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
163830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
163840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
163850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
163860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
16387ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
163880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V16B(), v1.V16B());
163890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V16B(), v1.V16B());
163900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uadalp(v16.V8H(), v0.V16B());
163910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uadalp(v17.V4H(), v0.V8B());
163920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V16B(), v2.V16B());
163940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V16B(), v2.V16B());
163950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uadalp(v18.V4S(), v1.V8H());
163960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uadalp(v19.V2S(), v1.V4H());
163970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
163980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V16B(), v3.V16B());
163990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V16B(), v4.V16B());
164000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uadalp(v20.V2D(), v2.V4S());
164010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uadalp(v21.V1D(), v2.V2S());
16402ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
16403ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  END();
16404ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
16405ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  RUN();
164060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8080810001000080, 0x010000ff00818100, q16);
164070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x010000ff00818100, q17);
164080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x800100010000fffe, 0x0000ffff80007fff, q18);
164090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000ffff80007fff, q19);
164100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000180000000, 0x800000007ffffffe, q20);
164110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q21);
164120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
164130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
16414ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
164150cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_mul) {
164160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
164170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
16419f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
164200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
164210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x000055aaff55ff00, 0xaa55ff55555500ff);
164220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
164230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
164240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mla(v16.V16B(), v0.V16B(), v1.V16B());
164260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mls(v17.V16B(), v0.V16B(), v1.V16B());
164270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(v18.V16B(), v0.V16B(), v1.V16B());
164280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
164300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
164320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0102757605b1b208, 0x5f0a61450db90f56, q16);
164330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x01029192055b5c08, 0xb30ab5d30d630faa, q17);
164340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000727200abab00, 0x5600563900ab0056, q18);
16435f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
16436f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
16437f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
16438f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
164390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164400cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_absdiff) {
16441ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
16442ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
16444ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
164450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
164460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x000055aaff55ff00, 0xaa55ff55555500ff);
164470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
164480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
16449ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
164500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saba(v16.V16B(), v0.V16B(), v1.V16B());
164510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaba(v17.V16B(), v0.V16B(), v1.V16B());
164520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sabd(v18.V16B(), v0.V16B(), v1.V16B());
164530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uabd(v19.V16B(), v0.V16B(), v1.V16B());
16454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16455ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
16456ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
164580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0202aeaf065c5d5e, 0x5e5f600c62646455, q16);
164590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0002585904b0b1b2, 0x5e5f600c62b86455, q17);
164600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100abab01565656, 0x5555550055565555, q18);
164610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff005555ffaaaaaa, 0x5555550055aa5555, q19);
164620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
164630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
16464ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
164654a06316541258e3c058792321295ee36d409f419armvixl
164660cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_byelement_mul) {
164670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
164680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
164700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
164720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x000155aaff55ff00, 0xaa55ff55555500ff);
164730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(v16.V4H(), v0.V4H(), v1.H(), 0);
164760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(v17.V8H(), v0.V8H(), v1.H(), 7);
164770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(v18.V2S(), v0.V2S(), v1.S(), 0);
164780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mul(v19.V4S(), v0.V4S(), v1.S(), 3);
164790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0x0000000000000000, 0x0001000200030004);
164810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2D(), 0x0005000600070008, 0x0001000200030004);
164820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mla(v20.V4H(), v0.V4H(), v1.H(), 0);
164830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mla(v21.V8H(), v0.V8H(), v1.H(), 7);
164840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v22.V2D(), 0x0000000000000000, 0x0000000200000004);
164860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v23.V2D(), 0x0000000600000008, 0x0000000200000004);
164870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mla(v22.V2S(), v0.V2S(), v1.S(), 0);
164880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mla(v23.V4S(), v0.V4S(), v1.S(), 3);
164890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v24.V2D(), 0x0000000000000000, 0x0100aaabfe015456);
164910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v25.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
164920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mls(v24.V4H(), v0.V4H(), v1.H(), 0);
164930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mls(v25.V8H(), v0.V8H(), v1.H(), 7);
164940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
164950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v26.V2D(), 0x0000000000000000, 0xc8e2aaabe1c85456);
164960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v27.V2D(), 0x39545572c6aa54e4, 0x39545572c6aa54e4);
164970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mls(v26.V2S(), v0.V2S(), v1.S(), 0);
164980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mls(v27.V4S(), v0.V4S(), v1.S(), 3);
164990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
165010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
165030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0100aaabfe015456, q16);
165040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00aa5500ff55aa, 0xff00aa5500ff55aa, q17);
165050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xc8e2aaabe1c85456, q18);
165060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x39545572c6aa54e4, 0x39545572c6aa54e4, q19);
165070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0101aaadfe04545a, q20);
165090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff05aa5b010655b2, 0xff01aa57010255ae, q21);
165100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xc8e2aaade1c8545a, q22);
165110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x39545578c6aa54ec, 0x39545574c6aa54e8, q23);
165120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q24);
165140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q25);
165150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q26);
165160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q27);
165174a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
165184a06316541258e3c058792321295ee36d409f419armvixl}
165194a06316541258e3c058792321295ee36d409f419armvixl
165204a06316541258e3c058792321295ee36d409f419armvixl
165210cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_byelement_mull) {
165224a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
165234a06316541258e3c058792321295ee36d409f419armvixl
165244a06316541258e3c058792321295ee36d409f419armvixl  START();
165254a06316541258e3c058792321295ee36d409f419armvixl
165260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0xaa55ff55555500ff, 0xff00aa5500ff55aa);
165270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x000155aaff55ff00, 0xaa55ff55555500ff);
165284a06316541258e3c058792321295ee36d409f419armvixl
165294a06316541258e3c058792321295ee36d409f419armvixl
165300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smull(v16.V4S(),  v0.V4H(), v1.H(), 7);
165310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smull2(v17.V4S(), v0.V8H(), v1.H(), 0);
165320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umull(v18.V4S(),  v0.V4H(), v1.H(), 7);
165330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umull2(v19.V4S(), v0.V8H(), v1.H(), 0);
165340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0x0000000100000002, 0x0000000200000001);
165360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2D(), 0x0000000100000002, 0x0000000200000001);
165370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v22.V2D(), 0x0000000100000002, 0x0000000200000001);
165380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v23.V2D(), 0x0000000100000002, 0x0000000200000001);
165390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smlal(v20.V4S(),  v0.V4H(), v1.H(), 7);
165410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smlal2(v21.V4S(), v0.V8H(), v1.H(), 0);
165420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umlal(v22.V4S(),  v0.V4H(), v1.H(), 7);
165430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umlal2(v23.V4S(), v0.V8H(), v1.H(), 0);
165440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v24.V2D(), 0xffffff00ffffaa55, 0x000000ff000055aa);
165460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v25.V2D(), 0xffaaaaabffff55ab, 0x0054ffab0000fe01);
165470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v26.V2D(), 0x0000ff000000aa55, 0x000000ff000055aa);
165480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v27.V2D(), 0x00a9aaab00fe55ab, 0x0054ffab0000fe01);
165490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smlsl(v24.V4S(),  v0.V4H(), v1.H(), 7);
165510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smlsl2(v25.V4S(), v0.V8H(), v1.H(), 0);
165520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umlsl(v26.V4S(),  v0.V4H(), v1.H(), 7);
165530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umlsl2(v27.V4S(), v0.V8H(), v1.H(), 0);
165540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165554a06316541258e3c058792321295ee36d409f419armvixl  END();
165564a06316541258e3c058792321295ee36d409f419armvixl
165574a06316541258e3c058792321295ee36d409f419armvixl  RUN();
165584a06316541258e3c058792321295ee36d409f419armvixl
165590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff00ffffaa55, 0x000000ff000055aa, q16);
165600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffaaaaabffff55ab, 0x0054ffab0000fe01, q17);
165610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ff000000aa55, 0x000000ff000055aa, q18);
165620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00a9aaab00fe55ab, 0x0054ffab0000fe01, q19);
165630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff01ffffaa57, 0x00000101000055ab, q20);
165650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffaaaaacffff55ad, 0x0054ffad0000fe02, q21);
165660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ff010000aa57, 0x00000101000055ab, q22);
165670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00a9aaac00fe55ad, 0x0054ffad0000fe02, q23);
165680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
165690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q24);
165700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q25);
165710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q26);
165720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q27);
165734a06316541258e3c058792321295ee36d409f419armvixl
165744a06316541258e3c058792321295ee36d409f419armvixl  TEARDOWN();
165754a06316541258e3c058792321295ee36d409f419armvixl}
165764a06316541258e3c058792321295ee36d409f419armvixl
165774a06316541258e3c058792321295ee36d409f419armvixl
165780cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_byelement_sqdmull) {
165794a06316541258e3c058792321295ee36d409f419armvixl  SETUP();
165804a06316541258e3c058792321295ee36d409f419armvixl
165814a06316541258e3c058792321295ee36d409f419armvixl  START();
165824a06316541258e3c058792321295ee36d409f419armvixl
165830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaa55ff55555500ff, 0xff00aa5500ff55aa);
165840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x000155aaff55ff00, 0xaa55ff55555500ff);
165854a06316541258e3c058792321295ee36d409f419armvixl
165860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull(v16.V4S(), v0.V4H(), v1.H(), 7);
165870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull2(v17.V4S(), v0.V8H(), v1.H(), 0);
165880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull(s18, h0, v1.H(), 7);
165894a06316541258e3c058792321295ee36d409f419armvixl
165900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0x0000000100000002, 0x0000000200000001);
165910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2D(), 0x0000000100000002, 0x0000000200000001);
165920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v22.V2D(), 0x0000000100000002, 0x0000000200000001);
165934a06316541258e3c058792321295ee36d409f419armvixl
165940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal(v20.V4S(), v0.V4H(), v1.H(), 7);
165950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal2(v21.V4S(), v0.V8H(), v1.H(), 0);
165960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal(s22, h0, v1.H(), 7);
165974a06316541258e3c058792321295ee36d409f419armvixl
165980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v24.V2D(), 0xfffffe00ffff54aa, 0x000001fe0000ab54);
165990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v25.V2D(), 0xff555556fffeab56, 0x00a9ff560001fc02);
166000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v26.V2D(), 0x0000000000000000, 0x000000000000ab54);
166010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl(v24.V4S(), v0.V4H(), v1.H(), 7);
166030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl2(v25.V4S(), v0.V8H(), v1.H(), 0);
166040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl(s26, h0, v1.H(), 7);
166050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
166070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
166090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xfffffe00ffff54aa, 0x000001fe0000ab54, q16);
166110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff555556fffeab56, 0x00a9ff560001fc02, q17);
166120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000ab54, q18);
166130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xfffffe01ffff54ac, 0x000002000000ab55, q20);
166150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff555557fffeab58, 0x00a9ff580001fc03, q21);
166160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000ab55, q22);
166170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q24);
166190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q25);
166200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q26);
16621ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
16623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16625ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
166260cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3diff_absdiff) {
16627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
16628ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16629ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
16630ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
166310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0xff00aa5500ff55ab, 0xff00aa5500ff55aa);
166320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x000055aaff55ff00, 0xaa55ff55555500ff);
166330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
166340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
166350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
166360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
16637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
166380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sabal(v16.V8H(), v0.V8B(), v1.V8B());
166390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uabal(v17.V8H(), v0.V8B(), v1.V8B());
166400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sabal2(v18.V8H(), v0.V16B(), v1.V16B());
166410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uabal2(v19.V8H(), v0.V16B(), v1.V16B());
16642ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
16644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16645ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
166460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x01570359055b0708, 0x095f0b620d630f55, q16);
166470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x01570359055b0708, 0x095f0bb60d630f55, q17);
166480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0103030405b107b3, 0x090b0b620d640f55, q18);
166490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x02010304055b075d, 0x0a090bb60db80fab, q19);
16650ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
16651ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16652ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16653ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
166540cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3diff_sqdmull) {
16655ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
16656ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16657ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
16658ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
166590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0x7fff7fff80008000, 0x80007fff7fff8000);
166600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x80007fff7fff8000, 0x7fff7fff80008000);
166610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(),  0x800000007fffffff, 0x7fffffff80000000);
166620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(),  0x8000000080000000, 0x8000000080000000);
166630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull(v16.V4S(),  v0.V4H(), v1.V4H());
166650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull2(v17.V4S(), v0.V8H(), v1.V8H());
166660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull(v18.V2D(),  v2.V2S(), v3.V2S());
166670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull2(v19.V2D(), v2.V4S(), v3.V4S());
166680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull(s20, h0, h1);
166690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmull(d21, s2, s3);
166700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
16671ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
16672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
166740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x800100007ffe0002, 0x800100007fffffff, q16);
166750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x800100007ffe0002, 0x800100007fffffff, q17);
166760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000100000000, 0x7fffffffffffffff, q18);
166770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffffffffffff, 0x8000000100000000, q19);
166780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q20);
166790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q21);
166800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
166810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
16682ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16683578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
166840cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3diff_sqdmlal) {
166850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
166860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
166880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0x7fff7fff80008000, 0x80007fff7fff8000);
166900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x80007fff7fff8000, 0x7fff7fff80008000);
166910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(),  0x800000007fffffff, 0x7fffffff80000000);
166920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(),  0x8000000080000000, 0x8000000080000000);
166930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
166940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0xffffffff00000001, 0x8fffffff00000001);
166950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x00000001ffffffff, 0x00000001ffffffff);
166960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x8000000000000001, 0x0000000000000001);
166970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0xffffffffffffffff, 0x7fffffffffffffff);
166980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0, 0x00000001);
166990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2D(), 0, 0x00000001);
167000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal(v16.V4S(),  v0.V4H(), v1.V4H());
167020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal2(v17.V4S(), v0.V8H(), v1.V8H());
167030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal(v18.V2D(),  v2.V2S(), v3.V2S());
167040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal2(v19.V2D(), v2.V4S(), v3.V4S());
167050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal(s20, h0, h1);
167060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlal(d21, s2, s3);
16707ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
167080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
167090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
167110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000ffff7ffe0003, 0x800000007fffffff, q16);
167120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x800100017ffe0001, 0x800100017ffffffe, q17);
167130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000000000, 0x7fffffffffffffff, q18);
167140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7ffffffffffffffe, 0x00000000ffffffff, q19);
167150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q20);
167160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q21);
16717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
16718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
16719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16720ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
167210cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3diff_sqdmlsl) {
16722ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  SETUP();
16723ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
16724ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  START();
16725ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
167260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0x7fff7fff80008000, 0x80007fff7fff8000);
167270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x80007fff7fff8000, 0x7fff7fff80008000);
167280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(),  0x800000007fffffff, 0x7fffffff80000000);
167290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(),  0x8000000080000000, 0x8000000080000000);
167300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0xffffffff00000001, 0x7ffffffe80000001);
167320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x00000001ffffffff, 0x7ffffffe00000001);
167330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x8000000000000001, 0x8000000000000001);
167340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0xfffffffffffffffe, 0x7fffffffffffffff);
167350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0, 0x00000001);
167360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2D(), 0, 0x00000001);
167370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl(v16.V4S(),  v0.V4H(), v1.V4H());
167390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl2(v17.V4S(), v0.V8H(), v1.V8H());
167400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl(v18.V2D(),  v2.V2S(), v3.V2S());
167410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl2(v19.V2D(), v2.V4S(), v3.V4S());
167420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl(s20, h0, h1);
167430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqdmlsl(d21, s2, s3);
167440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
16745ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  END();
16746ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
16747ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  RUN();
167480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7ffeffff8001ffff, 0x7fffffff80000000, q16);
167490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fff00018001fffd, 0x7fffffff80000002, q17);
167500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffff00000001, 0x8000000000000000, q18);
167510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000000000, 0x7fffffffffffffff, q19);
167520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80000002, q20);
167530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000000000000002, q21);
16754ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
16755ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl  TEARDOWN();
16756578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
16757578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
16758578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
167590cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3diff_mla) {
16760f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
167610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
167630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0xff00aa5500ff55ab, 0xff00aa5500ff55aa);
167650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x000055aaff55ff00, 0xaa55ff55555500ff);
167660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
167670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
167680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
167690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
167700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smlal(v16.V8H(), v0.V8B(), v1.V8B());
167720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umlal(v17.V8H(), v0.V8B(), v1.V8B());
167730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smlal2(v18.V8H(), v0.V16B(), v1.V16B());
167740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umlal2(v19.V8H(), v0.V16B(), v1.V16B());
167750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
16776f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
16777f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
16778f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
167790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x01580304055c2341, 0x090a0ab70d0e0f56, q16);
167800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xaa580304ae5c2341, 0x090a5fb70d0eb856, q17);
167810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x01020304e878ea7a, 0x090a0ab70cb90f00, q18);
167820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x010203043d783f7a, 0x090a5fb761b90f00, q19);
167830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
167840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
16785f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
16786f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
167870cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3diff_mls) {
167880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
167890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
167910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0xff00aa5500ff55ab, 0xff00aa5500ff55aa);
167930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0x000055aaff55ff00, 0xaa55ff55555500ff);
167940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
167950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
167960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
167970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0x0102030405060708, 0x090a0b0c0d0e0f00);
167980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
167990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smlsl(v16.V8H(), v0.V8B(), v1.V8B());
168000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umlsl(v17.V8H(), v0.V8B(), v1.V8B());
168010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smlsl2(v18.V8H(), v0.V16B(), v1.V16B());
168020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umlsl2(v19.V8H(), v0.V16B(), v1.V16B());
168030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
168050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
168070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ac030404b0eacf, 0x090a0b610d0e0eaa, q16);
168080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x57ac03045bb0eacf, 0x090ab6610d0e65aa, q17);
168090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0102030421942396, 0x090a0b610d630f00, q18);
168100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x01020304cc94ce96, 0x090ab661b8630f00, q19);
16811f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
16812f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
16813f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
16814f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
168150cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_compare) {
16816f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
16817f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
16818f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
16819f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
168200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
168210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x000055aaff55ff00, 0xaa55ff55555500ff);
168220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v16.V16B(), v0.V16B(), v0.V16B());
168240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v17.V16B(), v0.V16B(), v1.V16B());
168250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v18.V16B(), v0.V16B(), v0.V16B());
168260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v19.V16B(), v0.V16B(), v1.V16B());
168270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v20.V16B(), v0.V16B(), v0.V16B());
168280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v21.V16B(), v0.V16B(), v1.V16B());
168290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhi(v22.V16B(), v0.V16B(), v0.V16B());
168300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhi(v23.V16B(), v0.V16B(), v1.V16B());
168310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhs(v24.V16B(), v0.V16B(), v0.V16B());
168320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhs(v25.V16B(), v0.V16B(), v1.V16B());
168330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
16834f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
16835f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
16836f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
168370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q16);
168380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ff000000000000, 0x000000ff00000000, q17);
168390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q18);
168400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ff00ffff00ff00, 0xff0000ff0000ff00, q19);
168410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q20);
168420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000ffff00ff00, 0xff0000000000ff00, q21);
168430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q22);
168440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00ff0000ff00ff, 0xff00000000ffff00, q23);
168450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q24);
168460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff0000ff00ff, 0xff0000ff00ffff00, q25);
168470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
168480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
16849f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
168500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168510cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_scalar_compare) {
168520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
168530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
168550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
168570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x000055aaff55ff00, 0xaa55ff55555500ff);
168580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(d16, d0, d0);
168600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(d17, d0, d1);
168610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(d18, d1, d0);
168620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(d19, d0, d0);
168630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(d20, d0, d1);
168640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(d21, d1, d0);
168650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(d22, d0, d0);
168660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(d23, d0, d1);
168670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhi(d24, d0, d0);
168680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhi(d25, d0, d1);
168690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhs(d26, d0, d0);
168700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhs(d27, d0, d1);
168710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmhs(d28, d1, d0);
168720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
168740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
168760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q16);
168780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q17);
168790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q18);
168800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q19);
168810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q20);
168820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q21);
168830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q22);
168840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q23);
168850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q24);
168860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q25);
168870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q26);
168880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q27);
168890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q28);
16890f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
16891f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  TEARDOWN();
16892f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl}
16893f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
168940cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_fcmeq) {
168950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
16896f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
168970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
168980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
168990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0000000000000000, 0x0000000000000000);  // Zero.
169000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xffffffffffffffff, 0xffffffffffffffff);  // Nan.
169010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xbf800000bf800000, 0xbf800000bf800000);  // < 0.
169020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3f8000003f800000, 0x3f8000003f800000);  // > 0.
169030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(s16, s0, 0.0);
169050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(s17, s1, 0.0);
169060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(s18, s2, 0.0);
169070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(d19, d0, 0.0);
169080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(d20, d1, 0.0);
169090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(d21, d2, 0.0);
169100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(v22.V2S(), v0.V2S(), 0.0);
169110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(v23.V4S(), v1.V4S(), 0.0);
169120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(v24.V2D(), v1.V2D(), 0.0);
169130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmeq(v25.V2D(), v2.V2D(), 0.0);
169140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
169160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
169180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q16);
169190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q17);
169200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q18);
169210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q19);
169220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q20);
169230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q21);
169240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q22);
169250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q23);
169260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q24);
169270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q25);
169280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
169290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
169300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169310cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_fcmge) {
16932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
16933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
16935ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
169360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0000000000000000, 0x0000000000000000);  // Zero.
169370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xffffffffffffffff, 0xffffffffffffffff);  // Nan.
169380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xbf800000bf800000, 0xbf800000bf800000);  // < 0.
169390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3f8000003f800000, 0x3f8000003f800000);  // > 0.
169400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(s16, s0, 0.0);
169420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(s17, s1, 0.0);
169430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(s18, s2, 0.0);
169440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(d19, d0, 0.0);
169450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(d20, d1, 0.0);
169460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(d21, d3, 0.0);
169470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(v22.V2S(), v0.V2S(), 0.0);
169480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(v23.V4S(), v1.V4S(), 0.0);
169490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(v24.V2D(), v1.V2D(), 0.0);
169500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmge(v25.V2D(), v3.V2D(), 0.0);
169510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
16952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
16953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
169550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q16);
169560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q17);
169570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q18);
169580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q19);
169590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q20);
169600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q21);
169610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q22);
169620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q23);
169630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q24);
169640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q25);
169650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
169660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
16967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
16968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
169690cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_fcmgt) {
169700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
169710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
169730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0000000000000000, 0x0000000000000000);  // Zero.
169750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xffffffffffffffff, 0xffffffffffffffff);  // Nan.
169760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xbf800000bf800000, 0xbf800000bf800000);  // < 0.
169770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3f8000003f800000, 0x3f8000003f800000);  // > 0.
169780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(s16, s0, 0.0);
169800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(s17, s1, 0.0);
169810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(s18, s2, 0.0);
169820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(d19, d0, 0.0);
169830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(d20, d1, 0.0);
169840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(d21, d3, 0.0);
169850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(v22.V2S(), v0.V2S(), 0.0);
169860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(v23.V4S(), v1.V4S(), 0.0);
169870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(v24.V2D(), v1.V2D(), 0.0);
169880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmgt(v25.V2D(), v3.V2D(), 0.0);
169890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
169910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
169920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
169930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q16);
169940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q17);
169950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q18);
169960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q19);
169970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q20);
169980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q21);
169990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q22);
170000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q23);
170010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q24);
170020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q25);
17003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17004ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17005ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
170060cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_fcmle) {
17007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
170110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0000000000000000, 0x0000000000000000);  // Zero.
170120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xffffffffffffffff, 0xffffffffffffffff);  // Nan.
170130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xbf800000bf800000, 0xbf800000bf800000);  // < 0.
170140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3f8000003f800000, 0x3f8000003f800000);  // > 0.
170150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
170160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(s16, s0, 0.0);
170170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(s17, s1, 0.0);
170180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(s18, s3, 0.0);
170190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(d19, d0, 0.0);
170200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(d20, d1, 0.0);
170210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(d21, d2, 0.0);
170220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(v22.V2S(), v0.V2S(), 0.0);
170230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(v23.V4S(), v1.V4S(), 0.0);
170240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(v24.V2D(), v1.V2D(), 0.0);
170250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmle(v25.V2D(), v2.V2D(), 0.0);
170260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17027ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
17028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17029ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
170300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q16);
170310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q17);
170320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q18);
170330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q19);
170340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q20);
170350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q21);
170360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q22);
170370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q23);
170380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q24);
170390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q25);
17040ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17042ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17043ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
170440cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_fcmlt) {
17045ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17047ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17048ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
170490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0000000000000000, 0x0000000000000000);  // Zero.
170500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xffffffffffffffff, 0xffffffffffffffff);  // Nan.
170510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xbf800000bf800000, 0xbf800000bf800000);  // < 0.
170520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3f8000003f800000, 0x3f8000003f800000);  // > 0.
170530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
170540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(s16, s0, 0.0);
170550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(s17, s1, 0.0);
170560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(s18, s3, 0.0);
170570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(d19, d0, 0.0);
170580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(d20, d1, 0.0);
170590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(d21, d2, 0.0);
170600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(v22.V2S(), v0.V2S(), 0.0);
170610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(v23.V4S(), v1.V4S(), 0.0);
170620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(v24.V2D(), v1.V2D(), 0.0);
170630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fcmlt(v25.V2D(), v2.V2D(), 0.0);
170640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17065ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
17066ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
170680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q16);
170690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q17);
170700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q18);
170710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q19);
170720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q20);
170730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q21);
170740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q22);
170750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q23);
170760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q24);
170770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q25);
170780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
170790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17080ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
170810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_cmeq) {
170820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
170830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
170840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
17085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
170860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001000200030004, 0x0000000000000000);
170870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x000055aaff55ff00, 0x0000ff55555500ff);
170880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
170890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v16.V8B(),  v1.V8B(),  0);
170900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v17.V16B(), v1.V16B(), 0);
170910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v18.V4H(),  v1.V4H(),  0);
170920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v19.V8H(),  v1.V8H(),  0);
170930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v20.V2S(),  v0.V2S(),  0);
170940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v21.V4S(),  v0.V4S(),  0);
170950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(d22,  d0,  0);
170960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(d23,  d1,  0);
170970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmeq(v24.V2D(),  v0.V2D(),  0);
170980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
170990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
171000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
171010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
171020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffff00000000ff00, q16);
171030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff0000000000ff, 0xffff00000000ff00, q17);
171040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffff000000000000, q18);
171050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff000000000000, 0xffff000000000000, q19);
171060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q20);
171070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q21);
171080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q22);
171090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q23);
171100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q24);
17111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
171150cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_cmge) {
17116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17117ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17118ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17119ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
171200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff01000200030004, 0x0000000000000000);
171210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x000055aaff55ff00, 0x0000ff55555500ff);
171220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
171230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v16.V8B(),  v1.V8B(),  0);
171240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v17.V16B(), v1.V16B(), 0);
171250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v18.V4H(),  v1.V4H(),  0);
171260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v19.V8H(),  v1.V8H(),  0);
171270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v20.V2S(),  v0.V2S(),  0);
171280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v21.V4S(),  v0.V4S(),  0);
171290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(d22,  d0,  0);
171300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(d23,  d1,  0);
171310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmge(v24.V2D(),  v0.V2D(),  0);
171320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17133ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
17134ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
171360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffff00ffffffff00, q16);
171370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff0000ff00ff, 0xffff00ffffffff00, q17);
171380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffff0000ffffffff, q18);
171390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffff00000000, 0xffff0000ffffffff, q19);
171400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q20);
171410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000ffffffff, 0xffffffffffffffff, q21);
171420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q22);
171430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q23);
171440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q24);
171450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
171460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17147ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17148ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
171490cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_cmlt) {
171500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
171510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
171520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
171530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
171540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001000200030004, 0xff00000000000000);
171550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x000055aaff55ff00, 0x0000ff55555500ff);
171560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
171570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(v16.V8B(),  v1.V8B(),  0);
171580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(v17.V16B(), v1.V16B(), 0);
171590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(v18.V4H(),  v1.V4H(),  0);
171600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(v19.V8H(),  v1.V8H(),  0);
171610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(v20.V2S(),  v1.V2S(),  0);
171620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(v21.V4S(),  v1.V4S(),  0);
171630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(d22,  d0,  0);
171640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(d23,  d1,  0);
171650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmlt(v24.V2D(),  v0.V2D(),  0);
171660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
171670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
171680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
171690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
171700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000ff00000000ff, q16);
171710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000ffff00ff00, 0x0000ff00000000ff, q17);
171720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000ffff00000000, q18);
171730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000ffffffff, 0x0000ffff00000000, q19);
171740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q20);
171750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000ffffffff, 0x0000000000000000, q21);
171760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q22);
171770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q23);
171780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q24);
17179ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17180ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
171830cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_cmle) {
17184ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17185ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17186ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17187ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
171880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001000200030004, 0x0000000000000000);
171890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x000055aaff55ff00, 0x0000ff55555500ff);
171900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
171910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(v16.V8B(),  v1.V8B(),  0);
171920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(v17.V16B(), v1.V16B(), 0);
171930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(v18.V4H(),  v1.V4H(),  0);
171940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(v19.V8H(),  v1.V8H(),  0);
171950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(v20.V2S(),  v1.V2S(),  0);
171960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(v21.V4S(),  v1.V4S(),  0);
171970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(d22,  d0,  0);
171980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(d23,  d1,  0);
171990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmle(v24.V2D(),  v0.V2D(),  0);
172000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17201ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
17202ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17203ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
172040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffff000000ffff, q16);
172050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff00ffff00ffff, 0xffffff000000ffff, q17);
172060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffff00000000, q18);
172070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff0000ffffffff, 0xffffffff00000000, q19);
172080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q20);
172090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000ffffffff, 0x0000000000000000, q21);
172100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q22);
172110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q23);
172120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q24);
172130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
172140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17215ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17216ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
172170cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_cmgt) {
172180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
172190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
172210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001000200030004, 0x0000000000000000);
172230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x000055aaff55ff00, 0x0000ff55555500ff);
172240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v16.V8B(),  v1.V8B(),  0);
172260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v17.V16B(), v1.V16B(), 0);
172270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v18.V4H(),  v1.V4H(),  0);
172280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v19.V8H(),  v1.V8H(),  0);
172290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v20.V2S(),  v0.V2S(),  0);
172300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v21.V4S(),  v0.V4S(),  0);
172310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(d22,  d0,  0);
172320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(d23,  d1,  0);
172330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmgt(v24.V2D(),  v0.V2D(),  0);
172340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
172360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
172380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000ffffff0000, q16);
172390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ff0000ff0000, 0x000000ffffff0000, q17);
172400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00000000ffffffff, q18);
172410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ffff00000000, 0x00000000ffffffff, q19);
172420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q20);
172430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0x0000000000000000, q21);
172440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q22);
172450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffffffffffffffff, q23);
172460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0x0000000000000000, q24);
17247ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17248ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
172500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172510cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_neg) {
17252ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17255ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
172560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
172570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
172580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
172590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
172600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
172610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(v16.V8B(),  v0.V8B());
172630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(v17.V16B(), v0.V16B());
172640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(v18.V4H(),  v1.V4H());
172650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(v19.V8H(),  v1.V8H());
172660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(v20.V2S(),  v2.V2S());
172670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(v21.V4S(),  v2.V4S());
172680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(d22, d3);
172690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(v23.V2D(),  v3.V2D());
172700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Neg(v24.V2D(),  v4.V2D());
172710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17272ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
17273ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
172750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x807f0100ff81807f, q16);
172760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x81ff00017f8081ff, 0x807f0100ff81807f, q17);
172770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00010000ffff8001, q18);
172780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x80007fff00010000, 0x00010000ffff8001, q19);
172790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080000001, q20);
172800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000000001, 0x0000000080000001, q21);
172810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x8000000000000001, q22);
172820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffffffffffff, 0x8000000000000001, q23);
172830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000000000, 0x0000000000000000, q24);
17284ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
172850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
172860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
172870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172890cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_sqneg) {
172900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
172910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
172930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
172940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
172950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
172960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
172970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
172980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
172990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(v16.V8B(),  v0.V8B());
173010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(v17.V16B(), v0.V16B());
173020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(v18.V4H(),  v1.V4H());
173030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(v19.V8H(),  v1.V8H());
173040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(v20.V2S(),  v2.V2S());
173050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(v21.V4S(),  v2.V4S());
173060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(v22.V2D(),  v3.V2D());
173070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(v23.V2D(),  v4.V2D());
173080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(b24, b0);
173100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(h25, h1);
173110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(s26, s2);
173120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqneg(d27, d3);
173130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
173150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
173170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7f7f0100ff817f7f, q16);
173180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x81ff00017f7f81ff, 0x7f7f0100ff817f7f, q17);
173190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00010000ffff8001, q18);
173200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fff7fff00010000, 0x00010000ffff8001, q19);
173210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080000001, q20);
173220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff00000001, 0x0000000080000001, q21);
173230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffffffffffff, 0x8000000000000001, q22);
173240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffffffffffff, 0x0000000000000000, q23);
173250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f, q24);
173270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8001, q25);
173280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80000001, q26);
173290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000000000000001, q27);
173300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
173320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
173330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173350cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_abs) {
173360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
173370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
173390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
173410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
173420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
173430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
173440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
173450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(v16.V8B(),  v0.V8B());
173470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(v17.V16B(), v0.V16B());
173480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(v18.V4H(),  v1.V4H());
173490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(v19.V8H(),  v1.V8H());
173500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(v20.V2S(),  v2.V2S());
173510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(v21.V4S(),  v2.V4S());
173520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(d22, d3);
173530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(v23.V2D(),  v3.V2D());
173540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Abs(v24.V2D(),  v4.V2D());
173550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
173570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
173590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x807f0100017f807f, q16);
173600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7f0100017f807f01, 0x807f0100017f807f, q17);
173610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0001000000017fff, q18);
173620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x80007fff00010000, 0x0001000000017fff, q19);
173630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q20);
173640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000000001, 0x000000007fffffff, q21);
173650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7fffffffffffffff, q22);
173660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffffffffffff, 0x7fffffffffffffff, q23);
173670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000000000, 0x0000000000000000, q24);
17368ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17369ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17371ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17372ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
173730cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_sqabs) {
173740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17375578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
173760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
17377578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
173780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
173790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
173800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
173810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
173820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
173830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(v16.V8B(),  v0.V8B());
173850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(v17.V16B(), v0.V16B());
173860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(v18.V4H(),  v1.V4H());
173870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(v19.V8H(),  v1.V8H());
173880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(v20.V2S(),  v2.V2S());
173890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(v21.V4S(),  v2.V4S());
173900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(v22.V2D(),  v3.V2D());
173910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(v23.V2D(),  v4.V2D());
173920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(b24, b0);
173940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(h25, h1);
173950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(s26, s2);
173960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqabs(d27, d3);
173970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
173980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
173990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
174010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7f7f0100017f7f7f, q16);
174020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7f0100017f7f7f01, 0x7f7f0100017f7f7f, q17);
174030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0001000000017fff, q18);
174040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fff7fff00010000, 0x0001000000017fff, q19);
174050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q20);
174060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff00000001, 0x000000007fffffff, q21);
174070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffffffffffff, 0x7fffffffffffffff, q22);
174080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffffffffffff, 0x0000000000000000, q23);
174090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f, q24);
174110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q25);
174120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q26);
174130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q27);
174140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
174160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
174180cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_suqadd) {
17419578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  SETUP();
174200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17421ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17422578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
174230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
174240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x017f8081ff00017f, 0x010080ff7f0180ff);
17425578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
174260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80008001ffff0000, 0xffff000000017ffd);
174270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xffff000080008001, 0x00017fffffff0001);
17428578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
174290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x80000000fffffffe, 0xfffffff17ffffffe);
174300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0xffffffff80000000, 0x7fffffff00000002);
17431578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
174320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v6.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
174330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v7.V2D(), 0x8000000000000000, 0x8000000000000002);
17434578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
174350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V2D(), v0.V2D());
174360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V2D(), v0.V2D());
174370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V2D(), v2.V2D());
174380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(), v2.V2D());
174390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V2D(), v4.V2D());
174400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V2D(), v4.V2D());
174410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v22.V2D(), v6.V2D());
17442578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
174430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v23.V2D(), v0.V2D());
174440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v24.V2D(), v2.V2D());
174450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v25.V2D(), v4.V2D());
174460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v26.V2D(), v6.V2D());
174470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(v16.V8B(), v1.V8B());
174490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(v17.V16B(), v1.V16B());
174500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(v18.V4H(), v3.V4H());
174510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(v19.V8H(), v3.V8H());
174520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(v20.V2S(), v5.V2S());
174530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(v21.V4S(), v5.V4S());
174540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(v22.V2D(), v7.V2D());
174550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(b23, b1);
174570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(h24, h3);
174580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(s25, s5);
174590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Suqadd(d26, d7);
17460578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
17461578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  END();
174620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17463578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  RUN();
174640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x81817f7f7f7f007f, q16);
174650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7f7f7f7f7f807f7f, 0x81817f7f7f7f007f, q17);
174660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00007fff7fff7ffe, q18);
174670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fff80017fff7fff, 0x00007fff7fff7ffe, q19);
174680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7ffffff07fffffff, q20);
174690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff7ffffffe, 0x7ffffff07fffffff, q21);
174700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000001, 0x7fffffffffffffff, q22);
174710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f, q23);
174730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7ffe, q24);
174740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q25);
174750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q26);
174760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
174770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17478578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
174790cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_usqadd) {
174800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17481578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
174820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
174830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f7ffe);
174850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x017f8081ff00017f, 0x010080ff7f018002);
174860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80008001fffe0000, 0xffff000000017ffd);
174880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xffff000000028001, 0x00017fffffff0001);
17489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
174900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x80000000fffffffe, 0x00000001fffffffe);
174910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0xffffffff80000000, 0xfffffffe00000002);
174920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v6.V2D(), 0x8000000000000002, 0x7fffffffffffffff);
174940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v7.V2D(), 0x7fffffffffffffff, 0x8000000000000000);
174950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
174960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V2D(), v0.V2D());
174970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V2D(), v0.V2D());
174980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V2D(), v2.V2D());
174990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(), v2.V2D());
175000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V2D(), v4.V2D());
175010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V2D(), v4.V2D());
175020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v22.V2D(), v6.V2D());
175030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v23.V2D(), v0.V2D());
175050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v24.V2D(), v2.V2D());
175060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v25.V2D(), v4.V2D());
175070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v26.V2D(), v6.V2D());
175080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(v16.V8B(), v1.V8B());
175100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(v17.V16B(), v1.V16B());
175110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(v18.V4H(), v3.V4H());
175120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(v19.V8H(), v3.V8H());
175130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(v20.V2S(), v5.V2S());
175140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(v21.V4S(), v5.V4S());
175150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(v22.V2D(), v7.V2D());
175160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(b23, b1);
175180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(h24, h3);
175190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(s25, s5);
175200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usqadd(d26, d7);
175210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
175230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
175250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x81817f00808000ff, q16);
175260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8080008080808080, 0x81817f00808000ff, q17);
175270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffff7fff00007ffe, q18);
175280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fff8001ffff0000, 0xffff7fff00007ffe, q19);
175290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00000000ffffffff, q20);
175300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff7ffffffe, 0x00000000ffffffff, q21);
175310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0x0000000000000000, q22);
175320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff, q23);
175340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7ffe, q24);
175350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q25);
175360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q26);
17537ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17538ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17540ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
175410cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(system_sys) {
175420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
175430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const char* msg = "SYS test!";
175440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t msg_addr = reinterpret_cast<uintptr_t>(msg);
17545578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
175460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
175470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x4, msg_addr);
175480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sys(3, 0x7, 0x5, 1, x4);
175490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x3, x4);
175500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sys(3, 0x7, 0xa, 1, x3);
175510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x2, x3);
175520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sys(3, 0x7, 0xb, 1, x2);
175530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, x2);
175540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sys(3, 0x7, 0xe, 1, x1);
175550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // TODO: Add tests to check ZVA equivalent.
175560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
17557578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
175580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
175590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
17561578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
17562578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
17563ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
175640cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(system_ic) {
175650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
175660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const char* msg = "IC test!";
175670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t msg_addr = reinterpret_cast<uintptr_t>(msg);
17568578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
175690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
175700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x11, msg_addr);
175710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ic(IVAU, x11);
175720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
17573578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
175740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
175750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
175770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17578578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
175790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
175800cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(system_dc) {
17581578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  SETUP();
175820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const char* msg = "DC test!";
175830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  uintptr_t msg_addr = reinterpret_cast<uintptr_t>(msg);
175840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17585ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
175860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x20, msg_addr);
175870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dc(CVAC, x20);
175880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x21, x20);
175890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dc(CVAU, x21);
175900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x22, x21);
175910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dc(CIVAC, x22);
175920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // TODO: Add tests to check ZVA.
175930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
17594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
175950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
17596578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
175970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
175980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17599578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
17600578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
176010cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_xtn) {
176020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17603578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
176040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
17605ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
176060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
176070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
176080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
176090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
176100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
176110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Xtn(v16.V8B(),   v0.V8H());
176130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Xtn2(v16.V16B(), v1.V8H());
176140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Xtn(v17.V4H(),   v1.V4S());
176150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Xtn2(v17.V8H(),  v2.V4S());
176160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Xtn(v18.V2S(),   v3.V2D());
176170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Xtn2(v18.V4S(),  v4.V2D());
176180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
176200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
176220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001ff00ff0001ff, 0x01ff800181007f81, q16);
176230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ffff0000ffff, 0x8001000000007fff, q17);
176240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00000001ffffffff, q18);
176250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
176260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
176270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176290cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_sqxtn) {
176300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
176310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
176330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f01007a81807f01, 0x8081ff00017f8081);
176350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
176360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
176370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
176380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
176390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn(v16.V8B(),   v0.V8H());
176410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn2(v16.V16B(), v1.V8H());
176420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn(v17.V4H(),   v1.V4S());
176430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn2(v17.V8H(),  v2.V4S());
176440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn(v18.V2S(),   v3.V2D());
176450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn2(v18.V4S(),  v4.V2D());
176460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn(b19,  h0);
176470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn(h20,  s0);
176480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtn(s21,  d0);
176490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
176510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
176530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8080ff00ff00017f, 0x7f7a807f80807f80, q16);
176540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000ffff00007fff, 0x8000800080007fff, q17);
176550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000000000, 0x800000007fffffff, q18);
176560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000080, q19);
176570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000007fff, q20);
176580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080000000, q21);
176590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
176600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
176610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176630cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_uqxtn) {
176640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
176650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
176670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f01007a81807f01, 0x8081ff00017f8081);
176690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
176700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
176710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
176720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
176730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
176740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn(v16.V8B(),   v0.V8H());
176750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn2(v16.V16B(), v1.V8H());
176760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn(v17.V4H(),   v1.V4S());
176770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn2(v17.V8H(),  v2.V4S());
176780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn(v18.V2S(),   v3.V2D());
176790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn2(v18.V4S(),  v4.V2D());
176800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn(b19,  h0);
176810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn(h20,  s0);
176820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqxtn(s21,  d0);
17683578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
17684578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  END();
176850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
17686ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
176870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff00ff0001ff, 0xff7affffffffffff, q16);
176880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffff0000ffff, 0xffffffffffffffff, q17);
176890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffff00000000, 0xffffffffffffffff, q18);
176900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00000000000000ff, q19);
176910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000000000ffff, q20);
176920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00000000ffffffff, q21);
176930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
176940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17695ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
176970cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_sqxtun) {
176980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
176990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
177010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f01007a81807f01, 0x8081ff00017f8081);
177030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
177040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
177050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
177060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
177070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun(v16.V8B(),   v0.V8H());
177090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun2(v16.V16B(), v1.V8H());
177100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun(v17.V4H(),   v1.V4S());
177110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun2(v17.V8H(),  v2.V4S());
177120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun(v18.V2S(),   v3.V2D());
177130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun2(v18.V4S(),  v4.V2D());
177140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun(b19,  h0);
177150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun(h20,  s0);
177160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqxtun(s21,  d0);
177170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
17719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
177200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
177210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000000001ff, 0xff7a00ff0000ff00, q16);
177220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000000000ffff, 0x000000000000ffff, q17);
177230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00000000ffffffff, q18);
177240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q19);
177250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000000000ffff, q20);
177260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q21);
17727ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17728ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17729ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
177300cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_and) {
177310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17732ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
177330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
17734578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
177350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
177360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x00aa55aaff55ff00, 0xaa55ff00555500ff);
17737578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
177380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ And(v16.V16B(), v0.V16B(), v0.V16B());  // self test
177390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ And(v17.V16B(), v0.V16B(), v1.V16B());  // all combinations
177400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ And(v24.V8B(), v0.V8B(), v0.V8B());  // self test
177410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ And(v25.V8B(), v0.V8B(), v1.V8B());  // all combinations
177420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
177430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
177450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00aa5500ff55aa, 0xff00aa5500ff55aa, q16);
177460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000555500, 0xaa00aa00005500aa, q17);
177470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff00aa5500ff55aa, q24);
177480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xaa00aa00005500aa, q25);
177490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
17750578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
17751578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
177520cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_bic) {
177530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17754578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
177550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
177560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
177580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x00ffaa00aa55aaff, 0xffff005500ff00ff);
177590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v16.V16B(), v0.V16B(), v0.V16B());  // self test
177610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v17.V16B(), v0.V16B(), v1.V16B());  // all combinations
177620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v24.V8B(), v0.V8B(), v0.V8B());  // self test
177630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v25.V8B(), v0.V8B(), v1.V8B());  // all combinations
177640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
177650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
177670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q16);
177680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00005500aa5500, 0x0000aa0000005500, q17);
177690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q24);
177700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000aa0000005500, q25);
177710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
177720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
177730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177740cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_orr) {
17775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17776ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17777ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17778ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
177790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
177800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x00aa55aaff55ff00, 0xaa55ff00555500ff);
17781ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
177820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v16.V16B(), v0.V16B(), v0.V16B());  // self test
177830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v17.V16B(), v0.V16B(), v1.V16B());  // all combinations
177840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v24.V8B(), v0.V8B(), v0.V8B());  // self test
177850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v25.V8B(), v0.V8B(), v1.V8B());  // all combinations
177860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
17787ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
177880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
177890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00aa5500ff55aa, 0xff00aa5500ff55aa, q16);
177900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffaaffffffffffaa, 0xff55ff5555ff55ff, q17);
177910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff00aa5500ff55aa, q24);
177920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff55ff5555ff55ff, q25);
177930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
177940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17795578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
177960cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_mov) {
177970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
177980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
177990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
178000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
178010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
178020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
178030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V16B(), v0.V16B());
178040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V8H(), v0.V8H());
178050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V4S(), v0.V4S());
178060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(), v0.V2D());
178070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
178080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v24.V8B(), v0.V8B());
178090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v25.V4H(), v0.V4H());
178100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v26.V2S(), v0.V2S());
17811ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
17812ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17813ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
17814ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00aa5500ff55aa, 0xff00aa5500ff55aa, q16);
178160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00aa5500ff55aa, 0xff00aa5500ff55aa, q17);
178170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00aa5500ff55aa, 0xff00aa5500ff55aa, q18);
178180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00aa5500ff55aa, 0xff00aa5500ff55aa, q19);
17819ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff00aa5500ff55aa, q24);
178210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff00aa5500ff55aa, q25);
178220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff00aa5500ff55aa, q26);
17823578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
17824ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17825ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17826ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178270cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_orn) {
178280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17829ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
17831578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
178320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
178330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x00aa55aaff55ff00, 0xaa55ff00555500ff);
178340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
178350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orn(v16.V16B(), v0.V16B(), v0.V16B());  // self test
178360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orn(v17.V16B(), v0.V16B(), v1.V16B());  // all combinations
178370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orn(v24.V8B(), v0.V8B(), v0.V8B());  // self test
178380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orn(v25.V8B(), v0.V8B(), v1.V8B());  // all combinations
178390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
178400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
178410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
178420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q16);
178430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff55aa5500ff55ff, 0xffaaaaffaaffffaa, q17);
178440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q24);
178450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffaaaaffaaffffaa, q25);
178460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
178470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17848578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
178490cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_eor) {
17850ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17851ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17852ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17853ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00aa5500ff55aa, 0xff00aa5500ff55aa);
178550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x00ffaa00aa55aaff, 0xffff005500ff00ff);
17856ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Eor(v16.V16B(), v0.V16B(), v0.V16B());  // self test
178580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Eor(v17.V16B(), v0.V16B(), v1.V16B());  // all combinations
178590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Eor(v24.V8B(), v0.V8B(), v0.V8B());  // self test
178600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Eor(v25.V8B(), v0.V8B(), v1.V8B());  // all combinations
178610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
17862ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
178640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q16);
178650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff0055aaaaff55, 0x00ffaa0000005555, q17);
178660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q24);
178670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00ffaa0000005555, q25);
178680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
178690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178710cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_bif) {
178720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17873578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
178740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
17875578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
178760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0xffff0000ff00ffff, 0xffff00000000aaaa);
178770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00ff00ff005555, 0xaaaa5555aaaaaaaa);
178780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x00ff00ffff0055aa, 0x55aa55aa55aa55aa);
178790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
178800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x5555aa55cccccccc, 0x33333333f0f0f0f0);
178810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x555555aaff00ff00, 0xff00ff00ff00ff00);
178820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaa55aa5500ffff00, 0x00ffff0000ffff00);
178830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
178840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0, 0xf0f0f0f00f0f0f0f);
178850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0, 0xf0f0f0f0f0f0f0f0);
178860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0, 0x00ffff0000ffff00);
17887578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
178880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bif(v16.V16B(), v0.V16B(), v1.V16B());
178890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bif(v17.V16B(), v2.V16B(), v3.V16B());
178900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bif(v18.V8B(), v4.V8B(), v5.V8B());
17891ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
17892ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17893ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
17894ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
178950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff00ff0055ff, 0xffaa0055aa00aaaa, q16);
178960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x5555ffffffcccc00, 0xff333300fff0f000, q17);
178970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xf0f0f0f0f00f0ff0, q18);
178980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
178990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17900ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179010cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_bit) {
179020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17903578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
179040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
179050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0xffff0000ff00ffff, 0xffff00000000aaaa);
179070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00ff00ff005555, 0xaaaa5555aaaaaaaa);
179080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x00ff00ffff0055aa, 0x55aa55aa55aa55aa);
179090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x5555aa55cccccccc, 0x33333333f0f0f0f0);
179110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x555555aaff00ff00, 0xff00ff00ff00ff00);
179120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaa55aa5500ffff00, 0x00ffff0000ffff00);
179130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0, 0xf0f0f0f00f0f0f0f);
179150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0, 0xf0f0f0f0f0f0f0f0);
179160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0, 0x00ffff0000ffff00);
179170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bit(v16.V16B(), v0.V16B(), v1.V16B());
179190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bit(v17.V16B(), v2.V16B(), v3.V16B());
179200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bit(v18.V8B(), v4.V8B(), v5.V8B());
179210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
179220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
179240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff000000ff00ff55, 0xaaff550000aaaaaa, q16);
179260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55550000cc00ffcc, 0x3300ff33f000fff0, q17);
179270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xf0f0f0f00ff0f00f, q18);
17928ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17929ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17930ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179310cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_bsl) {
17932ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17933ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17934ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
179350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0xffff0000ff00ffff, 0xffff00000000aaaa);
179370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xff00ff00ff005555, 0xaaaa5555aaaaaaaa);
179380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x00ff00ffff0055aa, 0x55aa55aa55aa55aa);
179390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x5555aa55cccccccc, 0x33333333f0f0f0f0);
179410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x555555aaff00ff00, 0xff00ff00ff00ff00);
179420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaa55aa5500ffff00, 0x00ffff0000ffff00);
179430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0, 0xf0f0f0f00f0f0f0f);
179450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0, 0xf0f0f0f0f0f0f0f0);
179460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0, 0x00ffff0000ffff00);
179470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bsl(v16.V16B(), v0.V16B(), v1.V16B());
179490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bsl(v17.V16B(), v2.V16B(), v3.V16B());
179500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bsl(v18.V8B(), v4.V8B(), v5.V8B());
17951ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
17952ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17953ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
17954ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff0000ffff005555, 0xaaaa55aa55aaffaa, q16);
179560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff550000cc33ff00, 0x33ccff00f00fff00, q17);
179570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xf0fffff000f0f000, q18);
17958ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
17959ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
17960ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17961ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179620cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_smax) {
17963ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
17964ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17965ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
17966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaa55555555, 0xffffffff0000aa55);
179680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
17969ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smax(v16.V8B(), v0.V8B(), v1.V8B());
179710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smax(v18.V4H(), v0.V4H(), v1.V4H());
179720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smax(v20.V2S(), v0.V2S(), v1.V2S());
179730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smax(v17.V16B(), v0.V16B(), v1.V16B());
179750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smax(v19.V8H(), v0.V8H(), v1.V8H());
179760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smax(v21.V4S(), v0.V4S(), v1.V4S());
179770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
179780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
179800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
179810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000000000005555, q16);
179820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00000000000055ff, q18);
179830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000000000000aa55, q20);
179840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55aa555555555555, 0x0000000000005555, q17);
179850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55aa555555555555, 0x00000000000055ff, q19);
179860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55aa555555555555, 0x000000000000aa55, q21);
179870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
179880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
17989ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
17990ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179910cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_smaxp) {
179920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
17993ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
17995ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaa55555555, 0xffffffff0000aa55);
179970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
17998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
179990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxp(v16.V8B(), v0.V8B(), v1.V8B());
180000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxp(v18.V4H(), v0.V4H(), v1.V4H());
180010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxp(v20.V2S(), v0.V2S(), v1.V2S());
18002ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxp(v17.V16B(), v0.V16B(), v1.V16B());
180040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxp(v19.V8H(), v0.V8H(), v1.V8H());
180050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxp(v21.V4S(), v0.V4S(), v1.V4S());
18006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
18007ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18008ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
18009ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000ff55ffff0055, q16);
180110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000055ffffff0000, q18);
180120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000000000000aa55, q20);
180130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x5555aaaa0000ff55, 0xaaaa5555ffff0055, q17);
180140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55aaaaaa000055ff, 0xaaaa5555ffff0000, q19);
180150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55aa555500000000, 0x555555550000aa55, q21);
18016ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18017ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18018ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18019ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180200cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_addp_scalar) {
18021ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
18022ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18023ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
18024ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344aafe80, 0x00112233aabbfc00);
180260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
180270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaa66555555, 0xffffffff0000aa00);
18028f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
180290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addp(d16, v0.V2D());
180300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addp(d17, v1.V2D());
180310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addp(d18, v2.V2D());
18032f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
180330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18034f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
180350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
180360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
180370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00224466ef66fa80, q16);
180380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x55aa5556aa5500a9, q17);
180390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xaaaaaaa96655ff55, q18);
180400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
180410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
180420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
180430cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_acrosslanes_addv) {
180440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
180450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
180460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
180470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
180480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344aafe80, 0x00112233aabbfc00);
180490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
180500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaa66555555, 0xffffffff0000aa00);
180510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
180520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addv(b16, v0.V8B());
180530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addv(b17, v0.V16B());
180540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addv(h18, v1.V4H());
180550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addv(h19, v1.V8H());
180560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addv(s20, v2.V4S());
18057ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18058ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
18059ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18060ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
18061ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xc7, q16);
180630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x99, q17);
180640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x55a9, q18);
180650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x55fc, q19);
180660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x1100a9fe, q20);
18067ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18068ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18069ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18070ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180710cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_acrosslanes_saddlv) {
180720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18073ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18075ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344aafe80, 0x00112233aabbfc00);
180770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
180780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaa66555555, 0xffffffff0000aa00);
18079ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlv(h16, v0.V8B());
180810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlv(h17, v0.V16B());
180820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlv(s18, v1.V4H());
180830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlv(s19, v1.V8H());
180840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Saddlv(d20, v2.V4S());
18085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
180890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
180900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffc7, q16);
180910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff99, q17);
180920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000055a9, q18);
180930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000055fc, q19);
180940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000001100a9fe, q20);
180950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
18096ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18097ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18098ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
180990cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_acrosslanes_uaddlv) {
18100ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
181010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
18102ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
18103ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344aafe80, 0x00112233aabbfc00);
181050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
181060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaa66555555, 0xffffffff0000aa00);
181070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlv(h16, v0.V8B());
181090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlv(h17, v0.V16B());
181100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlv(s18, v1.V4H());
181110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlv(s19, v1.V8H());
181120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddlv(d20, v2.V4S());
18113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18114ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
181150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
18116ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
181170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x02c7, q16);
181190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0599, q17);
181200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000155a9, q18);
181210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000355fc, q19);
181220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000000021100a9fe, q20);
18123ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18124ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18125ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18126ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181270cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_acrosslanes_smaxv) {
18128ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
181290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
18130ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
18131ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344aafe80, 0x00112233aabbfc00);
181330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
181340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaa66555555, 0xffffffff0000aa00);
18135ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxv(b16, v0.V8B());
181370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxv(b17, v0.V16B());
181380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxv(h18, v1.V4H());
181390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxv(h19, v1.V8H());
181400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smaxv(s20, v2.V4S());
18141ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18143ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
18145ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x33, q16);
181470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x44, q17);
181480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x55ff, q18);
181490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x55ff, q19);
181500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x66555555, q20);
181510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
181520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
18153ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18154ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181550cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_acrosslanes_sminv) {
181560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
181570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
181590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344aafe80, 0x00112233aabbfc00);
181610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xfffa5555aaaaaaaa, 0x00000000ffaa55ff);
181620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaa66555555, 0xffffffff0000aa00);
181630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sminv(b16, v0.V8B());
181650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sminv(b17, v0.V16B());
181660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sminv(h18, v1.V4H());
181670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sminv(h19, v1.V8H());
181680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sminv(s20, v2.V4S());
18169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18170ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
181710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
18172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
18173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xaa, q16);
181750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x80, q17);
181760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffaa, q18);
181770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xaaaa, q19);
181780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xaaaaaaaa, q20);
181790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
181800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
18181ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
181820cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_acrosslanes_umaxv) {
181830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
181840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
181860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344aafe80, 0x00112233aabbfc00);
181880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaffab, 0x00000000ffaa55ff);
181890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaa66555555, 0xffffffff0000aa00);
181900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umaxv(b16, v0.V8B());
181920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umaxv(b17, v0.V16B());
181930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umaxv(h18, v1.V4H());
181940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umaxv(h19, v1.V8H());
181950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umaxv(s20, v2.V4S());
181960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
181980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
181990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
18200ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xfc, q16);
182020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xfe, q17);
182030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffaa, q18);
182040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffab, q19);
182050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffff, q20);
18206ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18207ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18208ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18209ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182100cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_acrosslanes_uminv) {
18211ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
182120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
18213ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
18214ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344aafe80, 0x02112233aabbfc01);
182160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xfffa5555aaaa0000, 0x00010003ffaa55ff);
182170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaa66555555, 0xffffffff0000aa00);
18218ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uminv(b16, v0.V8B());
182200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uminv(b17, v0.V16B());
182210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uminv(h18, v1.V4H());
182220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uminv(h19, v1.V8H());
182230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uminv(s20, v2.V4S());
18224ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
18228ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x01, q16);
182300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00, q17);
182310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0001, q18);
182320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000, q19);
182330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000aa00, q20);
182340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
182350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
182360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
182370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
182380cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_smin) {
182390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18240ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaa55555555, 0xffffffff0000aa55);
182440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
18245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smin(v16.V8B(), v0.V8B(), v1.V8B());
182470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smin(v18.V4H(), v0.V4H(), v1.V4H());
182480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smin(v20.V2S(), v0.V2S(), v1.V2S());
18249ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smin(v17.V16B(), v0.V16B(), v1.V16B());
182510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smin(v19.V8H(), v0.V8H(), v1.V8H());
182520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smin(v21.V4S(), v0.V4S(), v1.V4S());
182530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18254ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
182560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
182570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffaaaaff, q16);
182580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffaaaa55, q18);
182590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffaa55ff, q20);
182600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xaaaaaaaaaaaaaaaa, 0xffffffffffaaaaff, q17);
182610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xaaaaaaaaaaaaaaaa, 0xffffffffffaaaa55, q19);
182620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xaaaaaaaaaaaaaaaa, 0xffffffffffaa55ff, q21);
18263ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18264ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18265ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18266ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182670cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_umax) {
18268ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
182690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
18270ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
18271ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaa55555555, 0xffffffff0000aa55);
182730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
18274ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umax(v16.V8B(), v0.V8B(), v1.V8B());
182760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umax(v18.V4H(), v0.V4H(), v1.V4H());
182770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umax(v20.V2S(), v0.V2S(), v1.V2S());
18278ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umax(v17.V16B(), v0.V16B(), v1.V16B());
182800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umax(v19.V8H(), v0.V8H(), v1.V8H());
182810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umax(v21.V4S(), v0.V4S(), v1.V4S());
182820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18283ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
18285ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffaaaaff, q16);
182870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffaaaa55, q18);
182880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffaa55ff, q20);
182890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xaaaaaaaaaaaaaaaa, 0xffffffffffaaaaff, q17);
182900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xaaaaaaaaaaaaaaaa, 0xffffffffffaaaa55, q19);
182910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xaaaaaaaaaaaaaaaa, 0xffffffffffaa55ff, q21);
182920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
182930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
18294ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18295ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182960cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3same_umin) {
182970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18298ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
182990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18300ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaa55555555, 0xffffffff0000aa55);
183020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x55aa5555aaaaaaaa, 0x00000000ffaa55ff);
183030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
183040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umin(v16.V8B(), v0.V8B(), v1.V8B());
183050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umin(v18.V4H(), v0.V4H(), v1.V4H());
183060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umin(v20.V2S(), v0.V2S(), v1.V2S());
183070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
183080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umin(v17.V16B(), v0.V16B(), v1.V16B());
183090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umin(v19.V8H(), v0.V8H(), v1.V8H());
183100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umin(v21.V4S(), v0.V4S(), v1.V4S());
183110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
183120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
183130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
18314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000000000005555, q16);
183160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00000000000055ff, q18);
183170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000000000000aa55, q20);
183180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55aa555555555555, 0x0000000000005555, q17);
183190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55aa555555555555, 0x00000000000055ff, q19);
183200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x55aa555555555555, 0x000000000000aa55, q21);
18321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18322ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18323ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18324ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183250cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_mvn) {
18326ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
183270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
18328ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
18329ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x00ff00ffff0055aa, 0x55aa55aa55aa55aa);
18331ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvn(v16.V16B(), v0.V16B());
183330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvn(v17.V8H(), v0.V8H());
183340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvn(v18.V4S(), v0.V4S());
183350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvn(v19.V2D(), v0.V2D());
18336ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvn(v24.V8B(), v0.V8B());
183380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvn(v25.V4H(), v0.V4H());
183390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvn(v26.V2S(), v0.V2S());
18340ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18342ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
18344ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00ff0000ffaa55, 0xaa55aa55aa55aa55, q16);
183460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00ff0000ffaa55, 0xaa55aa55aa55aa55, q17);
183470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00ff0000ffaa55, 0xaa55aa55aa55aa55, q18);
183480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00ff0000ffaa55, 0xaa55aa55aa55aa55, q19);
18349ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xaa55aa55aa55aa55, q24);
183510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xaa55aa55aa55aa55, q25);
183520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xaa55aa55aa55aa55, q26);
183530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
183540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
18355ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18356ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183570cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_not) {
183580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18359ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
183610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
183620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x00ff00ffff0055aa, 0x55aa55aa55aa55aa);
183630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0, 0x00ffff0000ffff00);
183640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
183650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Not(v16.V16B(), v0.V16B());
183660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Not(v17.V8B(), v1.V8B());
183670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
183680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
183690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
18370ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00ff0000ffaa55, 0xaa55aa55aa55aa55, q16);
183720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff0000ffff0000ff, q17);
18373ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18374ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18375ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
183760cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_cls_clz_cnt) {
1837739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
183780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
1837939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
1838039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
183810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
183820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xfedcba9876543210, 0x0123456789abcdef);
1838339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
183840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cls(v16.V8B() , v1.V8B());
183850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cls(v17.V16B(), v1.V16B());
183860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cls(v18.V4H() , v1.V4H());
183870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cls(v19.V8H() , v1.V8H());
183880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cls(v20.V2S() , v1.V2S());
183890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cls(v21.V4S() , v1.V4S());
1839039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
183910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clz(v22.V8B() , v0.V8B());
183920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clz(v23.V16B(), v0.V16B());
183930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clz(v24.V4H() , v0.V4H());
183940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clz(v25.V8H() , v0.V8H());
183950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clz(v26.V2S() , v0.V2S());
183960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Clz(v27.V4S() , v0.V4S());
1839739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
183980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cnt(v28.V8B() , v0.V8B());
183990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cnt(v29.V16B(), v1.V16B());
1840039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
1840239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
1840439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0601000000000102, q16);
184060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0601000000000102, 0x0601000000000102, q17);
184070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0006000000000001, q18);
184080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0006000000000001, 0x0006000000000001, q19);
184090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000600000000, q20);
184100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000600000000, 0x0000000600000000, q21);
1841139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0404040404040404, q22);
184130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0807060605050505, 0x0404040404040404, q23);
184140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0004000400040004, q24);
184150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000f000600050005, 0x0004000400040004, q25);
184160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000400000004, q26);
184170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000f00000005, 0x0000000400000004, q27);
1841839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0102020302030304, q28);
184200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0705050305030301, 0x0103030503050507, q29);
1842139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
184230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
1842439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184250cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_2regmisc_rev) {
184260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
1842739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
1842939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
184310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xfedcba9876543210, 0x0123456789abcdef);
184320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
184330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev16(v16.V8B() , v0.V8B());
184340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev16(v17.V16B(), v0.V16B());
184350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
184360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev32(v18.V8B() , v0.V8B());
184370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev32(v19.V16B(), v0.V16B());
184380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev32(v20.V4H() , v0.V4H());
184390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev32(v21.V8H() , v0.V8H());
1844039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev64(v22.V8B() , v0.V8B());
184420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev64(v23.V16B(), v0.V16B());
184430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev64(v24.V4H() , v0.V4H());
184440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev64(v25.V8H() , v0.V8H());
184450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev64(v26.V2S() , v0.V2S());
184460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rev64(v27.V4S() , v0.V4S());
184470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
184480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rbit(v28.V8B() , v1.V8B());
184490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rbit(v29.V16B(), v1.V16B());
1845039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
1845139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  END();
184520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
1845339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  RUN();
1845439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x09080b0a0d0c0f0e, q16);
184560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0100030205040706, 0x09080b0a0d0c0f0e, q17);
1845739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0b0a09080f0e0d0c, q18);
184590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0302010007060504, 0x0b0a09080f0e0d0c, q19);
184600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0a0b08090e0f0c0d, q20);
184610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0203000106070405, 0x0a0b08090e0f0c0d, q21);
184620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
184630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0f0e0d0c0b0a0908, q22);
184640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0706050403020100, 0x0f0e0d0c0b0a0908, q23);
184650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0e0f0c0d0a0b0809, q24);
184660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0607040502030001, 0x0e0f0c0d0a0b0809, q25);
184670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0c0d0e0f08090a0b, q26);
184680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0405060700010203, 0x0c0d0e0f08090a0b, q27);
184690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
184700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x80c4a2e691d5b3f7, q28);
184710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7f3b5d196e2a4c08, 0x80c4a2e691d5b3f7, q29);
1847239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
1847339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
1847439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
1847539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
1847639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
184770cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sli) {
184780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18479ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
184800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
184820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
184830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xfedcba9876543210, 0x0123456789abcdef);
18484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
184850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V2D(),  v0.V2D());
184860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V2D(),  v0.V2D());
184870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V2D(),  v0.V2D());
184880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(),  v0.V2D());
184890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V2D(),  v0.V2D());
184900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V2D(),  v0.V2D());
184910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v22.V2D(),  v0.V2D());
184920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v23.V2D(),  v0.V2D());
18493ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
184940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sli(v16.V8B(),  v1.V8B(),  4);
184950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sli(v17.V16B(), v1.V16B(), 7);
184960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sli(v18.V4H(),  v1.V4H(),  8);
184970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sli(v19.V8H(),  v1.V8H(), 15);
184980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sli(v20.V2S(),  v1.V2S(),  0);
184990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sli(v21.V4S(),  v1.V4S(), 31);
185000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sli(v22.V2D(),  v1.V2D(), 48);
18501ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sli(d23,  d1, 48);
18503ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18505ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
185070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
185080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x18395a7b9cbddeff, q16);
185090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x88898a8b8c8d8e8f, q17);
185100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x2309670bab0def0f, q18);
185110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x88098a0b8c0d8e0f, q19);
185120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0123456789abcdef, q20);
185130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050607, 0x88090a0b8c0d0e0f, q21);
185140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3210020304050607, 0xcdef0a0b0c0d0e0f, q22);
185150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
185160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xcdef0a0b0c0d0e0f, q23);
18517ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
185200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
18521ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18522ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185230cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sri) {
185240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18525ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18527ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
185290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xfedcba9876543210, 0x0123456789abcdef);
18530ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V2D(),  v0.V2D());
185320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V2D(),  v0.V2D());
185330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V2D(),  v0.V2D());
185340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(),  v0.V2D());
185350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V2D(),  v0.V2D());
185360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V2D(),  v0.V2D());
185370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v22.V2D(),  v0.V2D());
185380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v23.V2D(),  v0.V2D());
18539ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sri(v16.V8B(),  v1.V8B(),  4);
185410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sri(v17.V16B(), v1.V16B(), 7);
185420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sri(v18.V4H(),  v1.V4H(),  8);
185430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sri(v19.V8H(),  v1.V8H(), 15);
185440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sri(v20.V2S(),  v1.V2S(),  1);
185450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sri(v21.V4S(),  v1.V4S(), 31);
185460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sri(v22.V2D(),  v1.V2D(), 48);
18547ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sri(d23,  d1, 48);
18549ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
18551ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18552ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
18553ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00020406080a0c0e, q16);
185550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0101030304040606, 0x08080a0a0d0d0f0f, q17);
185560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x08010a450c890ecd, q18);
185570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304040606, 0x08080a0a0c0d0e0f, q19);
185580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0091a2b344d5e6f7, q20);
185590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001020304050606, 0x08090a0a0c0d0e0f, q21);
185600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000102030405fedc, 0x08090a0b0c0d0123, q22);
185610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
185620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x08090a0b0c0d0123, q23);
185630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
18564ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18565ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18566ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18567ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18568ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185690cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_shrn) {
185700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
185710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
185720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
185730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
185740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
185750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
185760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
185770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
185780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
185790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
185800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shrn(v16.V8B(),   v0.V8H(), 8);
185810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shrn2(v16.V16B(), v1.V8H(), 1);
185820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shrn(v17.V4H(),   v1.V4S(), 16);
185830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shrn2(v17.V8H(),  v2.V4S(), 1);
185840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shrn(v18.V2S(),   v3.V2D(), 32);
185850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shrn2(v18.V4S(),  v3.V2D(), 1);
185860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
185870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
185880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
185890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
185900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ff00ff0000ff, 0x7f00817f80ff0180, q16);
185910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ffff0000ffff, 0x8000ffffffff0001, q17);
185920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000ffffffff, 0x800000007fffffff, q18);
185930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
18594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
185970cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_rshrn) {
185980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
185990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
186010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
186030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
186040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
186050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
186060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
186070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rshrn(v16.V8B(),   v0.V8H(), 8);
186090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rshrn2(v16.V16B(), v1.V8H(), 1);
186100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rshrn(v17.V4H(),   v1.V4S(), 16);
186110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rshrn2(v17.V8H(),  v2.V4S(), 1);
186120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rshrn(v18.V2S(),   v3.V2D(), 32);
186130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rshrn2(v18.V4S(),  v3.V2D(), 1);
186140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
186160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
186180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001000000000100, 0x7f01827f81ff0181, q16);
186190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x8001ffffffff0001, q17);
186200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000100000000, 0x8000000080000000, q18);
186210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
18622ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18623ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18624ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186250cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_uqshrn) {
186260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
186290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
186310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
186320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
186330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
186340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
186350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn(v16.V8B(),   v0.V8H(), 8);
186370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn2(v16.V16B(), v1.V8H(), 1);
186380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn(v17.V4H(),   v1.V4S(), 16);
186390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn2(v17.V8H(),  v2.V4S(), 1);
186400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn(v18.V2S(),   v3.V2D(), 32);
186410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn2(v18.V4S(),  v3.V2D(), 1);
186420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn(b19, h0, 8);
186440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn(h20, s1, 16);
186450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshrn(s21, d3, 32);
186460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
186480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
186500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff00ff0000ff, 0x7f00817f80ff0180, q16);
186510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffff0000ffff, 0x8000ffffffff0001, q17);
186520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0x800000007fffffff, q18);
186530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000080, q19);
186540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000001, q20);
186550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q21);
186560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
186570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
186580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
186600cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_uqrshrn) {
18661ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
18662ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18663ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
18664ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
186660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
186670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
186680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
186690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
18670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn(v16.V8B(),   v0.V8H(), 8);
186720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn2(v16.V16B(), v1.V8H(), 1);
186730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn(v17.V4H(),   v1.V4S(), 16);
186740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn2(v17.V8H(),  v2.V4S(), 1);
186750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn(v18.V2S(),   v3.V2D(), 32);
186760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn2(v18.V4S(),  v3.V2D(), 1);
18677ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn(b19, h0, 8);
186790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn(h20, s1, 16);
186800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshrn(s21, d3, 32);
18681ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18683ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
186850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff00ff0001ff, 0x7f01827f81ff0181, q16);
186860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffff0000ffff, 0x8001ffffffff0001, q17);
186870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0x8000000080000000, q18);
186880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000081, q19);
186890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000001, q20);
186900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080000000, q21);
186910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
186920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
18693ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18694ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186950cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqshrn) {
186960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
186980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
187010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
187020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
187030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
187040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
18705ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn(v16.V8B(),   v0.V8H(), 8);
187070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn2(v16.V16B(), v1.V8H(), 1);
187080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn(v17.V4H(),   v1.V4S(), 16);
187090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn2(v17.V8H(),  v2.V4S(), 1);
187100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn(v18.V2S(),   v3.V2D(), 32);
187110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn2(v18.V4S(),  v3.V2D(), 1);
187120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
187130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn(b19, h0, 8);
187140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn(h20, s1, 16);
187150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrn(s21, d3, 32);
187160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
187170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
187180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
187190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
187200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8080ff00ff00007f, 0x7f00817f80ff0180, q16);
187210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000ffff00007fff, 0x8000ffffffff0001, q17);
187220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x800000007fffffff, 0x800000007fffffff, q18);
187230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000080, q19);
187240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000001, q20);
187250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q21);
187260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
187270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
187280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
187290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
187300cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqrshrn) {
187310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
187320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
187330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
187340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
187350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
187360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
187370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
187380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
187390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
18740ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn(v16.V8B(),   v0.V8H(), 8);
187420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn2(v16.V16B(), v1.V8H(), 1);
187430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn(v17.V4H(),   v1.V4S(), 16);
187440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn2(v17.V8H(),  v2.V4S(), 1);
187450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn(v18.V2S(),   v3.V2D(), 32);
187460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn2(v18.V4S(),  v3.V2D(), 1);
18747ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn(b19, h0, 8);
187490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn(h20, s1, 16);
187500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrn(s21, d3, 32);
18751ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
18753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
187550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x808000000000017f, 0x7f01827f81ff0181, q16);
187560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000007fff, 0x8001ffffffff0001, q17);
187570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x800000007fffffff, 0x800000007fffffff, q18);
187580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000081, q19);
187590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000001, q20);
187600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q21);
18761ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18762ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18763ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18764ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187650cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqshrun) {
187660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18767ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18769ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
187710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
187720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
187730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
187740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
18775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun(v16.V8B(),   v0.V8H(), 8);
187770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun2(v16.V16B(), v1.V8H(), 1);
187780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun(v17.V4H(),   v1.V4S(), 16);
187790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun2(v17.V8H(),  v2.V4S(), 1);
187800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun(v18.V2S(),   v3.V2D(), 32);
187810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun2(v18.V4S(),  v3.V2D(), 1);
18782ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun(b19, h0, 8);
187840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun(h20, s1, 16);
187850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshrun(s21, d3, 32);
18786ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18788ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
187900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000000000ff, 0x7f00007f00000100, q16);
187910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000000000ffff, 0x0000000000000001, q17);
187920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000ffffffff, 0x000000007fffffff, q18);
187930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q19);
187940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000001, q20);
187950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q21);
187960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
187970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
18798ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
187990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
188000cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqrshrun) {
188010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18802ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18803ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
18804ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
188060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
188070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
188080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
188090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
18810ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun(v16.V8B(),   v0.V8H(), 8);
188120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun2(v16.V16B(), v1.V8H(), 1);
188130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun(v17.V4H(),   v1.V4S(), 16);
188140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun2(v17.V8H(),  v2.V4S(), 1);
188150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun(v18.V2S(),   v3.V2D(), 32);
188160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun2(v18.V4S(),  v3.V2D(), 1);
18817ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun(b19, h0, 8);
188190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun(h20, s1, 16);
188200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshrun(s21, d3, 32);
18821ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18823ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
188250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000000001ff, 0x7f01007f00000100, q16);
188260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000000000ffff, 0x0000000000000001, q17);
188270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00000000ffffffff, 0x0000000080000000, q18);
188280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q19);
188290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000001, q20);
188300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080000000, q21);
188310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
188320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
18833ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188340cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_modimm_bic) {
188350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18836ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18838ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v22.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v23.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v24.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v25.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v26.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v27.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
188510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
188520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v16.V4H(), 0x00, 0);
188530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v17.V4H(), 0xff, 8);
188540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v18.V8H(), 0x00, 0);
188550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v19.V8H(), 0xff, 8);
188560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
188570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v20.V2S(), 0x00, 0);
188580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v21.V2S(), 0xff, 8);
188590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v22.V2S(), 0x00, 16);
188600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v23.V2S(), 0xff, 24);
188610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
188620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v24.V4S(), 0xff, 0);
188630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v25.V4S(), 0x00, 8);
188640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v26.V4S(), 0xff, 16);
188650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bic(v27.V4S(), 0x00, 24);
18866ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18867ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
18868ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18869ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
18870ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x5555ffff0000aaaa, q16);
188720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x005500ff000000aa, q17);
188730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aaff55ff0055aa, 0x5555ffff0000aaaa, q18);
188740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aa0055000000aa, 0x005500ff000000aa, q19);
18875ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x5555ffff0000aaaa, q20);
188770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x555500ff000000aa, q21);
188780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x5555ffff0000aaaa, q22);
188790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0055ffff0000aaaa, q23);
188800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
188810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aaff00ff005500, 0x5555ff000000aa00, q24);
188820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aaff55ff0055aa, 0x5555ffff0000aaaa, q25);
188830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ff55ff0055aa, 0x5500ffff0000aaaa, q26);
188840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aaff55ff0055aa, 0x5555ffff0000aaaa, q27);
18885ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18886ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
18887ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18888ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18889ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
188900cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_modimm_movi_16bit_any) {
188910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
188920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
188930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
188940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
188950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V4H(), 0xabab);
188960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V4H(), 0xab00);
188970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V4H(), 0xabff);
188980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V8H(), 0x00ab);
188990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V8H(), 0xffab);
189000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V8H(), 0xabcd);
189010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
189030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
189050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xabababababababab, q0);
189070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xab00ab00ab00ab00, q1);
189080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xabffabffabffabff, q2);
189090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ab00ab00ab00ab, 0x00ab00ab00ab00ab, q3);
189100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffabffabffabffab, 0xffabffabffabffab, q4);
189110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabcdabcdabcdabcd, 0xabcdabcdabcdabcd, q5);
189120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
18914ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18915ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18916ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
189170cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_modimm_movi_32bit_any) {
189180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
189190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
189210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2S(), 0x000000ab);
189230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2S(), 0x0000ab00);
189240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V4S(), 0x00ab0000);
189250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V4S(), 0xab000000);
189260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2S(), 0xffffffab);
189280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2S(), 0xffffabff);
189290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v6.V4S(), 0xffabffff);
189300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v7.V4S(), 0xabffffff);
189310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2S(), 0x0000abff);
189330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2S(), 0x00abffff);
189340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V4S(), 0xffab0000);
189350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V4S(), 0xffffab00);
189360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V4S(), 0xabababab);
189380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V4S(), 0xabcdabcd);
189390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v22.V4S(), 0xabcdef01);
189400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v23.V4S(), 0x00ffff00);
189410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
189430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
189450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x000000ab000000ab, q0);
189470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000ab000000ab00, q1);
189480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ab000000ab0000, 0x00ab000000ab0000, q2);
189490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xab000000ab000000, 0xab000000ab000000, q3);
189500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffabffffffab, q4);
189520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffabffffffabff, q5);
189530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffabffffffabffff, 0xffabffffffabffff, q6);
189540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabffffffabffffff, 0xabffffffabffffff, q7);
189550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000abff0000abff, q16);
189570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00abffff00abffff, q17);
189580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffab0000ffab0000, 0xffab0000ffab0000, q18);
189590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffab00ffffab00, 0xffffab00ffffab00, q19);
189600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabababababababab, 0xabababababababab, q20);
189620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabcdabcdabcdabcd, 0xabcdabcdabcdabcd, q21);
189630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabcdef01abcdef01, 0xabcdef01abcdef01, q22);
189640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ffff0000ffff00, 0x00ffff0000ffff00, q23);
189650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
18966ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
18967ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18968ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
189690cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_modimm_movi_64bit_any) {
18970ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
18971ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
189720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
18973ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
189740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V1D(), 0x00ffff0000ffffff);
189750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xabababababababab);
189760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xabcdabcdabcdabcd);
189770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xabcdef01abcdef01);
189780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V1D(), 0xabcdef0123456789);
189790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0xabcdef0123456789);
18980ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
189810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
18982ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
189830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
189840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00ffff0000ffffff, q0);
189860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabababababababab, 0xabababababababab, q1);
189870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabcdabcdabcdabcd, 0xabcdabcdabcdabcd, q2);
189880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabcdef01abcdef01, 0xabcdef01abcdef01, q3);
189890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xabcdef0123456789, q4);
189900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xabcdef0123456789, 0xabcdef0123456789, q5);
189910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
189930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
189940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
189960cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_modimm_movi) {
189970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
18998ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
18999ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
19000ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V8B(),  0xaa);
190020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V16B(), 0x55);
19003ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d2,       0x00ffff0000ffffff);
190050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x00ffff0000ffffff);
19006ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V4H(), 0x00, LSL, 0);
190080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V4H(), 0xff, LSL, 8);
190090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V8H(), 0x00, LSL, 0);
190100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V8H(), 0xff, LSL, 8);
190110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2S(), 0x00, LSL, 0);
190130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2S(), 0xff, LSL, 8);
190140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v22.V2S(), 0x00, LSL, 16);
190150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v23.V2S(), 0xff, LSL, 24);
190160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v24.V4S(), 0xff, LSL, 0);
190180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v25.V4S(), 0x00, LSL, 8);
190190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v26.V4S(), 0xff, LSL, 16);
190200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v27.V4S(), 0x00, LSL, 24);
190210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v28.V2S(), 0xaa, MSL, 8);
190230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v29.V2S(), 0x55, MSL, 16);
190240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v30.V4S(), 0xff, MSL, 8);
190250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v31.V4S(), 0x00, MSL, 16);
190260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
19028ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
19030ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xaaaaaaaaaaaaaaaa, q0);
190320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x5555555555555555, 0x5555555555555555, q1);
19033ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00ffff0000ffffff, q2);
190350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ffff0000ffffff, 0x00ffff0000ffffff, q3);
19036ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000000000000000, q16);
190380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff00ff00ff00ff00, q17);
190390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q18);
190400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00ff00ff00ff00, 0xff00ff00ff00ff00, q19);
19041ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000000000000000, q20);
190430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000ff000000ff00, q21);
190440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000000000000000, q22);
190450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff000000ff000000, q23);
19046ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x000000ff000000ff, 0x000000ff000000ff, q24);
190480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q25);
190490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ff000000ff0000, 0x00ff000000ff0000, q26);
190500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000000000000, q27);
19051ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0000aaff0000aaff, q28);
190530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0055ffff0055ffff, q29);
190540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ffff0000ffff, 0x0000ffff0000ffff, q30);
190550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ffff0000ffff, 0x0000ffff0000ffff, q31);
190560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
190580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
190590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190610cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_modimm_mvni) {
190620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
190630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
190650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v16.V4H(), 0x00, LSL, 0);
190670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v17.V4H(), 0xff, LSL, 8);
190680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v18.V8H(), 0x00, LSL, 0);
190690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v19.V8H(), 0xff, LSL, 8);
190700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v20.V2S(), 0x00, LSL, 0);
190720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v21.V2S(), 0xff, LSL, 8);
190730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v22.V2S(), 0x00, LSL, 16);
190740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v23.V2S(), 0xff, LSL, 24);
190750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v24.V4S(), 0xff, LSL, 0);
190770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v25.V4S(), 0x00, LSL, 8);
190780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v26.V4S(), 0xff, LSL, 16);
190790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v27.V4S(), 0x00, LSL, 24);
190800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
190810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v28.V2S(), 0xaa, MSL, 8);
190820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v29.V2S(), 0x55, MSL, 16);
190830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v30.V4S(), 0xff, MSL, 8);
190840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mvni(v31.V4S(), 0x00, MSL, 16);
19085ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19086ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
19087ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19088ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
19089ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffffffff, q16);
190910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00ff00ff00ff00ff, q17);
190920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q18);
190930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ff00ff00ff00ff, 0x00ff00ff00ff00ff, q19);
19094ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
190950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffffffff, q20);
190960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffff00ffffff00ff, q21);
190970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffffffffffffffff, q22);
190980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x00ffffff00ffffff, q23);
19099ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
191000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff00ffffff00, 0xffffff00ffffff00, q24);
191010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q25);
191020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff00ffffff00ffff, 0xff00ffffff00ffff, q26);
191030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q27);
191040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffff5500ffff5500, q28);
191060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xffaa0000ffaa0000, q29);
191070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff0000ffff0000, 0xffff0000ffff0000, q30);
191080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff0000ffff0000, 0xffff0000ffff0000, q31);
19109ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19110ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
19111ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19112ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19113ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
191140cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_modimm_orr) {
191150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
191160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
191180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v22.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v23.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v24.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v25.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v26.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v27.V2D(), 0x00aaff55ff0055aa, 0x5555ffff0000aaaa);
191310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v16.V4H(), 0x00, 0);
191330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v17.V4H(), 0xff, 8);
191340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v18.V8H(), 0x00, 0);
191350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v19.V8H(), 0xff, 8);
191360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v20.V2S(), 0x00, 0);
191380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v21.V2S(), 0xff, 8);
191390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v22.V2S(), 0x00, 16);
191400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v23.V2S(), 0xff, 24);
191410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v24.V4S(), 0xff, 0);
191430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v25.V4S(), 0x00, 8);
191440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v26.V4S(), 0xff, 16);
191450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(v27.V4S(), 0x00, 24);
191460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
191480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
191500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x5555ffff0000aaaa, q16);
191520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff55ffffff00ffaa, q17);
191530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aaff55ff0055aa, 0x5555ffff0000aaaa, q18);
191540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffaaff55ff00ffaa, 0xff55ffffff00ffaa, q19);
191550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x5555ffff0000aaaa, q20);
191570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x5555ffff0000ffaa, q21);
191580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x5555ffff0000aaaa, q22);
191590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0xff55ffffff00aaaa, q23);
191600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aaffffff0055ff, 0x5555ffff0000aaff, q24);
191620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aaff55ff0055aa, 0x5555ffff0000aaaa, q25);
191630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ffff55ffff55aa, 0x55ffffff00ffaaaa, q26);
191640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00aaff55ff0055aa, 0x5555ffff0000aaaa, q27);
191650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
191660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
19167ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19168ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19169ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
191700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// TODO: add arbitrary values once load literal to Q registers is supported.
191710cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_modimm_fmov) {
19172ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
19173ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
191740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Immediates which can be encoded in the instructions.
191750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const float kOne = 1.0f;
191760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const float kPointFive = 0.5f;
191770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const double kMinusThirteen = -13.0;
191780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Immediates which cannot be encoded in the instructions.
191790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const float kNonImmFP32 = 255.0f;
191800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const double kNonImmFP64 = 12.3456;
191810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19182ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
191830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v11.V2S(), kOne);
191840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v12.V4S(), kPointFive);
191850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v22.V2D(), kMinusThirteen);
191860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v13.V2S(), kNonImmFP32);
191870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v14.V4S(), kNonImmFP32);
191880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v23.V2D(), kNonImmFP64);
191890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v1.V2S(), 0.0);
191900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v2.V4S(), 0.0);
191910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v3.V2D(), 0.0);
191920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v4.V2S(), kFP32PositiveInfinity);
191930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v5.V4S(), kFP32PositiveInfinity);
191940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(v6.V2D(), kFP64PositiveInfinity);
191950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
19196ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
191970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
19198ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
191990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kOne1S = float_to_rawbits(1.0);
192000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kOne2S = (kOne1S << 32) | kOne1S;
192010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kPointFive1S = float_to_rawbits(0.5);
192020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kPointFive2S = (kPointFive1S << 32) | kPointFive1S;
192030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kMinusThirteen1D = double_to_rawbits(-13.0);
192040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kNonImmFP321S = float_to_rawbits(kNonImmFP32);
192050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kNonImmFP322S = (kNonImmFP321S << 32) | kNonImmFP321S;
192060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kNonImmFP641D = double_to_rawbits(kNonImmFP64);
192070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kFP32Inf1S = float_to_rawbits(kFP32PositiveInfinity);
192080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kFP32Inf2S = (kFP32Inf1S << 32) | kFP32Inf1S;
192090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const uint64_t kFP64Inf1D = double_to_rawbits(kFP64PositiveInfinity);
192100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, kOne2S, q11);
192120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(kPointFive2S, kPointFive2S, q12);
192130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(kMinusThirteen1D, kMinusThirteen1D, q22);
192140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, kNonImmFP322S, q13);
192150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(kNonImmFP322S, kNonImmFP322S, q14);
192160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(kNonImmFP641D, kNonImmFP641D, q23);
192170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0, q1);
192180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0, q2);
192190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, 0x0, q3);
192200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0, kFP32Inf2S, q4);
192210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(kFP32Inf2S, kFP32Inf2S, q5);
192220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(kFP64Inf1D, kFP64Inf1D, q6);
19223ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
192240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
192250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
19226ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19227ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
192280cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_perm) {
192290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
19230ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
192310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
192320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0001020304050607, 0x08090a0b0c0d0e0f);
192340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x1011121314151617, 0x18191a1b1c1d1e1f);
192350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Trn1(v16.V16B(), v0.V16B(), v1.V16B());
192370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Trn2(v17.V16B(), v0.V16B(), v1.V16B());
192380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Zip1(v18.V16B(), v0.V16B(), v1.V16B());
192390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Zip2(v19.V16B(), v0.V16B(), v1.V16B());
192400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uzp1(v20.V16B(), v0.V16B(), v1.V16B());
192410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uzp2(v21.V16B(), v0.V16B(), v1.V16B());
19242ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19243ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
19244ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19245ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
19246ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
192470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1101130315051707, 0x19091b0b1d0d1f0f, q16);
192480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1000120214041606, 0x18081a0a1c0c1e0e, q17);
192490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x180819091a0a1b0b, 0x1c0c1d0d1e0e1f0f, q18);
192500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1000110112021303, 0x1404150516061707, q19);
192510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x11131517191b1d1f, 0x01030507090b0d0f, q20);
192520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x10121416181a1c1e, 0x00020406080a0c0e, q21);
19253ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
192540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
192550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
19256ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19257ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
192580cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_copy_dup_element) {
192590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
19260ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
192610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
192620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344556677, 0x8899aabbccddeeff);
192640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xffeddccbbaae9988, 0x7766554433221100);
192650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xffeddccbbaae9988, 0x0011223344556677);
192660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x7766554433221100, 0x8899aabbccddeeff);
192670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x7766554433221100, 0x0123456789abcdef);
192680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x0011223344556677, 0x0123456789abcdef);
192690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v16.V16B(), v0.B(), 0);
192710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v17.V8H(),  v1.H(), 7);
192720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v18.V4S(),  v1.S(), 3);
192730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v19.V2D(),  v0.D(), 0);
192740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v20.V8B(), v0.B(), 0);
192760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v21.V4H(), v1.H(), 7);
192770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v22.V2S(), v1.S(), 3);
192780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v23.B(), v0.B(), 0);
192800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v24.H(), v1.H(), 7);
192810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v25.S(), v1.S(), 3);
192820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v26.D(), v0.D(), 0);
192830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v2.V16B(), v2.B(), 0);
192850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v3.V8H(),  v3.H(), 7);
192860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v4.V4S(),  v4.S(), 0);
192870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v5.V2D(),  v5.D(), 1);
192880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
192900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
192920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffffffffffff, 0xffffffffffffffff, q16);
192940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffedffedffedffed, 0xffedffedffedffed, q17);
192950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffeddccbffeddccb, 0xffeddccbffeddccb, q18);
192960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8899aabbccddeeff, 0x8899aabbccddeeff, q19);
192970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
192980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q20);
192990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffedffedffedffed, q21);
193000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffeddccbffeddccb, q22);
193010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000000000ff, q23);
193030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x000000000000ffed, q24);
193040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000ffeddccb, q25);
193050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8899aabbccddeeff, q26);
193060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7777777777777777, 0x7777777777777777, q2);
193080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7766776677667766, 0x7766776677667766, q3);
193090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x89abcdef89abcdef, 0x89abcdef89abcdef, q4);
193100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0011223344556677, 0x0011223344556677, q5);
19311ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
19312ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19313ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19314ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
193150cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_copy_dup_general) {
193160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
19317ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
193180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
19319ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
193200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0011223344556677);
19321ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
193220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v16.V16B(), w0);
193230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v17.V8H(),  w0);
193240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v18.V4S(),  w0);
193250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v19.V2D(),  x0);
193261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v20.V8B(), w0);
193280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v21.V4H(), w0);
193290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v22.V2S(), w0);
193300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v2.V16B(), wzr);
193320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v3.V8H(),  wzr);
193330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v4.V4S(),  wzr);
193340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Dup(v5.V2D(),  xzr);
193350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
193370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
193390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7777777777777777, 0x7777777777777777, q16);
193410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x6677667766776677, 0x6677667766776677, q17);
193420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4455667744556677, 0x4455667744556677, q18);
193430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0011223344556677, 0x0011223344556677, q19);
193440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7777777777777777, q20);
193460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x6677667766776677, q21);
193470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x4455667744556677, q22);
193480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q2);
193500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q3);
193510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q4);
193520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q5);
193530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
193540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
193550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
193570cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_copy_ins_element) {
193580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
193591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
193611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0x0011223344556677, 0x8899aabbccddeeff);
193630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0xffeddccbbaae9988, 0x7766554433221100);
193640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0123456789abcdef, 0xfedcba9876543210);
193650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0xfedcba9876543210, 0x0123456789abcdef);
193660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x0011223344556677, 0x8899aabbccddeeff);
193670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0x0011223344556677, 0x8899aabbccddeeff);
193681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0, 0x0011223344556677);
193700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0, 0x8899aabbccddeeff);
193710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0, 0x0123456789abcdef);
193720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0, 0x0123456789abcdef);
193731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v16.V16B(), 15, v0.V16B(), 0);
193750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v17.V8H(),  0,  v1.V8H(), 7);
193760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v18.V4S(),  3,  v1.V4S(), 0);
193770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v19.V2D(),  1,  v0.V2D(), 0);
19378ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
193790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v2.V16B(), 2, v2.V16B(), 0);
193800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v3.V8H(),  0,  v3.V8H(), 7);
193810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v4.V4S(),  3,  v4.V4S(), 0);
193820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v5.V2D(),  0,  v5.V2D(), 1);
193831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
193851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
193871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff23456789abcdef, 0xfedcba9876543210, q16);
193890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xfedcba9876543210, 0x0123456789abffed, q17);
193900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3322110044556677, 0x8899aabbccddeeff, q18);
193910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8899aabbccddeeff, 0x8899aabbccddeeff, q19);
193921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
193930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0011223344776677, q2);
193940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8899aabbccdd0000, q3);
193950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x89abcdef00000000, 0x0123456789abcdef, q4);
193960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q5);
193970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
19398ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19399ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19400ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194010cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_copy_mov_element) {
1940239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
194030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19404ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
19405ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(),  0x0011223344556677, 0x8899aabbccddeeff);
194070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(),  0xffeddccbbaae9988, 0x7766554433221100);
194080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0123456789abcdef, 0xfedcba9876543210);
194090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0xfedcba9876543210, 0x0123456789abcdef);
194100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x0011223344556677, 0x8899aabbccddeeff);
194110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0x0011223344556677, 0x8899aabbccddeeff);
19412ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0, 0x0011223344556677);
194140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0, 0x8899aabbccddeeff);
194150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0, 0x0123456789abcdef);
194160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0, 0x0123456789abcdef);
19417ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V16B(), 15, v0.V16B(), 0);
194190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V8H(),  0,  v1.V8H(), 7);
194200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V4S(),  3,  v1.V4S(), 0);
194210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(),  1,  v0.V2D(), 0);
19422ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v2.V16B(), 2, v2.V16B(), 0);
194240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v3.V8H(),  0,  v3.V8H(), 7);
194250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v4.V4S(),  3,  v4.V4S(), 0);
194260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v5.V2D(),  0,  v5.V2D(), 1);
19427ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
19429ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
19431ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff23456789abcdef, 0xfedcba9876543210, q16);
194330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xfedcba9876543210, 0x0123456789abffed, q17);
194340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3322110044556677, 0x8899aabbccddeeff, q18);
194350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8899aabbccddeeff, 0x8899aabbccddeeff, q19);
19436ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0011223344776677, q2);
194380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8899aabbccdd0000, q3);
194390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x89abcdef00000000, 0x0123456789abcdef, q4);
194400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q5);
194410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
194420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
19443ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19444ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
194450cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_copy_smov) {
194460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
19447ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
19449ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
194500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0123456789abcdef, 0xfedcba9876543210);
19451ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(w0, v0.B(),  7);
194530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(w1, v0.B(), 15);
19454ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(w2, v0.H(),  0);
194560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(w3, v0.H(),  3);
19457ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(x4, v0.B(),  7);
194590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(x5, v0.B(),  15);
194600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
194610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(x6, v0.H(),  0);
194620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(x7, v0.H(),  3);
194630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
194640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(x16, v0.S(),  0);
194650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Smov(x17, v0.S(),  1);
19466ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
19467ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
194680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19469ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
19470ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xfffffffe, w0);
194720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00000001, w1);
194730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00003210, w2);
194740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0xfffffedc, w3);
194750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffffe, x4);
194760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000000001, x5);
194770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000000003210, x6);
194780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffffffedc, x7);
194790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0000000076543210, x16);
194800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfffffffffedcba98, x17);
19481ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19482ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
19483ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19484ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19485ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194860cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_copy_umov_mov) {
19487ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
194880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19489ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
19490ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0123456789abcdef, 0xfedcba9876543210);
19492ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umov(w0, v0.B(), 15);
194940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umov(w1, v0.H(),  0);
194950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umov(w2, v0.S(),  3);
194960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Umov(x3, v0.D(),  1);
19497ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
194980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w4, v0.S(),  3);
194990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x5, v0.D(),  1);
19500ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
19502ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
19504ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00000001, w0);
195060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x00003210, w1);
195070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x01234567, w2);
195080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x3);
195090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_32(0x01234567, w4);
195100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0123456789abcdef, x5);
19511ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
195130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
19514ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19515ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195160cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_copy_ins_general) {
195170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
19518ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
19520ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x0011223344556677);
195220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0123456789abcdef, 0xfedcba9876543210);
195230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0xfedcba9876543210, 0x0123456789abcdef);
195240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x0011223344556677, 0x8899aabbccddeeff);
195250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0x0011223344556677, 0x8899aabbccddeeff);
19526ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0, 0x0011223344556677);
195280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0, 0x8899aabbccddeeff);
195290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0, 0x0123456789abcdef);
195300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0, 0x0123456789abcdef);
195310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v16.V16B(), 15, w0);
195330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v17.V8H(),  0,  w0);
195340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v18.V4S(),  3,  w0);
195350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v19.V2D(),  0,  x0);
195360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v2.V16B(), 2, w0);
195380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v3.V8H(),  0, w0);
195390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v4.V4S(),  3, w0);
195400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ins(v5.V2D(),  1, x0);
19541ae093bfb93c7d6b6cc143546a4211995a9db4ebfarmvixl
19542ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
195430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19544ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
19545ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7723456789abcdef, 0xfedcba9876543210, q16);
195470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xfedcba9876543210, 0x0123456789ab6677, q17);
195480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4455667744556677, 0x8899aabbccddeeff, q18);
195490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0011223344556677, 0x0011223344556677, q19);
19550ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0011223344776677, q2);
195520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8899aabbccdd6677, q3);
195530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x4455667700000000, 0x0123456789abcdef, q4);
195540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0011223344556677, 0x0123456789abcdef, q5);
195550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
195560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
195570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195590cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_extract_ext) {
195600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
195610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
195630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0011223344556677, 0x8899aabbccddeeff);
195650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0xffeddccbbaae9988, 0x7766554433221100);
195660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0, 0x0011223344556677);
195680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0, 0x8899aabbccddeeff);
195690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ext(v16.V16B(), v0.V16B(), v1.V16B(), 0);
195710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ext(v17.V16B(), v0.V16B(), v1.V16B(), 15);
195720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ext(v1.V16B(), v0.V16B(), v1.V16B(), 8);  // Dest is same as one Src
195730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ext(v0.V16B(), v0.V16B(), v0.V16B(), 8);  // All reg are the same
195740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ext(v18.V8B(), v2.V8B(), v3.V8B(), 0);
195760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ext(v19.V8B(), v2.V8B(), v3.V8B(), 7);
195770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ext(v2.V8B(), v2.V8B(), v3.V8B(), 4);     // Dest is same as one Src
195780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ext(v3.V8B(), v3.V8B(), v3.V8B(), 4);     // All reg are the same
195790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
195810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
195830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
195840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0011223344556677, 0x8899aabbccddeeff, q16);
195850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xeddccbbaae998877, 0x6655443322110000, q17);
195860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7766554433221100, 0x0011223344556677, q1);
195870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8899aabbccddeeff, 0x0011223344556677, q0);
19588ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0011223344556677, q18);
195900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x99aabbccddeeff00, q19);
195910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xccddeeff00112233, q2);
195920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xccddeeff8899aabb, q3);
19593ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
19594ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19595ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19596ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
195970cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3different_uaddl) {
19598ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
195990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19600ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
19601ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
196020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0000000000000000, 0x0000000000000000);
196030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0, 0x00010280810e0fff);
196040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0, 0x0101010101010101);
196050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x0000000000000000, 0x0000000000000000);
196070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x0000000000000000, 0x0000000000000000);
196080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0, 0x0000000180008001);
196090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v6.V2D(), 0, 0x000e000ff000ffff);
196100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v7.V2D(), 0, 0x0001000100010001);
196110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0x0000000000000000, 0x0000000000000000);
196130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x0000000000000000, 0x0000000000000000);
196140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0, 0x0000000000000001);
196150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0, 0x80000001ffffffff);
196160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0, 0x0000000100000001);
196170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddl(v0.V8H(), v1.V8B(), v2.V8B());
196190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddl(v3.V4S(), v5.V4H(), v7.V4H());
196210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddl(v4.V4S(), v6.V4H(), v7.V4H());
196220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddl(v16.V2D(), v18.V2S(), v20.V2S());
196240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uaddl(v17.V2D(), v19.V2S(), v20.V2S());
196250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19626ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19627ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
196280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
196300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0001000200030081, 0x0082000f00100100, q0);
196320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000100000002, 0x0000800100008002, q3);
196330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000f00000010, 0x0000f00100010000, q4);
196340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000001, 0x0000000000000002, q16);
196350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000080000002, 0x0000000100000000, q17);
19636ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
19637ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19638ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19639ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
196400cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_3different_addhn_subhn) {
19641ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
196420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19643ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
19644ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
196450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
196460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
196470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
196480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
196490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
196500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addhn(v16.V8B(),   v0.V8H(), v1.V8H());
196520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Addhn2(v16.V16B(), v2.V8H(), v3.V8H());
196530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Raddhn(v17.V8B(),   v0.V8H(), v1.V8H());
196540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Raddhn2(v17.V16B(), v2.V8H(), v3.V8H());
196550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Subhn(v18.V8B(),   v0.V8H(), v1.V8H());
196560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Subhn2(v18.V16B(), v2.V8H(), v3.V8H());
196570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rsubhn(v19.V8B(),   v0.V8H(), v1.V8H());
196580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Rsubhn2(v19.V16B(), v2.V8H(), v3.V8H());
19659ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19660ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
196610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
196630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ff007fff7fff, 0xff81817f80ff0100, q16);
196650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000080008000, 0xff81817f81ff0201, q17);
196660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ffff80008000, 0xff80817f80ff0100, q18);
196670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000080008000, 0xff81827f81ff0101, q19);
19668ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
19669ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19670ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
196710cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_d_only_scalar) {
19672ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
19673ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
196740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
19675ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
196760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xf0000000f000f0f0);
196770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x7fffffff7fff7f7f);
196780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x1000000010001010);
196790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xffffffffffffffff, 2);
196800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0xffffffffffffffff, -2);
196810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
196820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(d16, d0, d0);
196830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(d17, d1, d1);
196840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Add(d18, d2, d2);
196850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(d19, d0, d0);
196860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(d20, d0, d1);
196870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sub(d21, d1, d0);
196880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushl(d22, d0, d3);
196890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushl(d23, d0, d4);
196900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshl(d24, d0, d3);
196910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshl(d25, d0, d4);
196920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushr(d26, d0, 1);
196930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshr(d27, d0, 3);
196940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shl(d28, d0, 0);
196950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shl(d29, d0, 16);
19696ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19697ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
196980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19699ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
197000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xe0000001e001e1e0, q16);
197020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffffffefffefefe, q17);
197030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2000000020002020, q18);
197040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q19);
197050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7000000170017171, q20);
197060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8ffffffe8ffe8e8f, q21);
197070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xc0000003c003c3c0, q22);
197080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3c0000003c003c3c, q23);
197090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xc0000003c003c3c0, q24);
197100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfc0000003c003c3c, q25);
197110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7800000078007878, q26);
197120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfe0000001e001e1e, q27);
197130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xf0000000f000f0f0, q28);
197140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000f000f0f00000, q29);
197150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
19716ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
19717ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19718ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19719ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
197200cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqshl_imm_scalar) {
19721ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  SETUP();
19722ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19723ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  START();
19724ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
197250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7f);
197260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x80);
197270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x01);
197280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(b16, b0, 1);
197290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(b17, b1, 1);
197300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(b18, b2, 1);
197310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fff);
197330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x8000);
197340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x0001);
197350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(h19, h0, 1);
197360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(h20, h1, 1);
197370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(h21, h2, 1);
197380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fffffff);
197400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x80000000);
197410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x00000001);
197420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(s22, s0, 1);
197430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(s23, s1, 1);
197440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(s24, s2, 1);
197450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fffffffffffffff);
197470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x8000000000000000);
197480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x0000000000000001);
197490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(d25, d0, 1);
197500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(d26, d1, 1);
197510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(d27, d2, 1);
19752ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19753ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  END();
19754ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19755ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  RUN();
19756ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
197570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f, q16);
197580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80, q17);
197590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x02, q18);
197600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q19);
197620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000, q20);
197630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0002, q21);
197640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q22);
197660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80000000, q23);
197670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000002, q24);
197680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q25);
197700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000000000000000, q26);
197710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000002, q27);
19772ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19773ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl  TEARDOWN();
19774ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}
19775ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl
19776f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
197770cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_uqshl_imm_scalar) {
19778f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  SETUP();
19779f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
19780f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  START();
19781f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
197820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7f);
197830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x80);
197840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x01);
197850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(b16, b0, 1);
197860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(b17, b1, 1);
197870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(b18, b2, 1);
197880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fff);
197900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x8000);
197910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x0001);
197920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(h19, h0, 1);
197930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(h20, h1, 1);
197940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(h21, h2, 1);
197950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
197960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fffffff);
197970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x80000000);
197980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x00000001);
197990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(s22, s0, 1);
198000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(s23, s1, 1);
198010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(s24, s2, 1);
198020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fffffffffffffff);
198040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x8000000000000000);
198050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x0000000000000001);
198060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(d25, d0, 1);
198070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(d26, d1, 1);
198080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(d27, d2, 1);
19809f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
19811f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
19813f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfe, q16);
198150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff, q17);
198160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x02, q18);
19817f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffe, q19);
198190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffff, q20);
198200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0002, q21);
19821f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffffffe, q22);
198230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q23);
198240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000002, q24);
19825f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffffffffffffffe, q25);
198270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q26);
198280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000002, q27);
19829f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
198310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
19832f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198340cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqshlu_scalar) {
198350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
198360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
198380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7f);
198400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x80);
198410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x01);
198420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(b16, b0, 2);
198430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(b17, b1, 2);
198440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(b18, b2, 2);
198450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fff);
198470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x8000);
198480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x0001);
198490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(h19, h0, 2);
198500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(h20, h1, 2);
198510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(h21, h2, 2);
198520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fffffff);
198540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x80000000);
198550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x00000001);
198560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(s22, s0, 2);
198570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(s23, s1, 2);
198580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(s24, s2, 2);
198590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x0, 0x7fffffffffffffff);
198610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x0, 0x8000000000000000);
198620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x0, 0x0000000000000001);
198630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(d25, d0, 2);
198640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(d26, d1, 2);
198650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshlu(d27, d2, 2);
19866f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
19867f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  END();
19868f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
19869f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl  RUN();
19870f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff, q16);
198720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00, q17);
198730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x04, q18);
19874f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl
198750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffff, q19);
198760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000, q20);
198770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0004, q21);
198781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
198790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q22);
198800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000000, q23);
198810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x00000004, q24);
198821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
198830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q25);
198840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000000, q26);
198850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x0000000000000004, q27);
198860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
198880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
198891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
198900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198910cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sshll) {
198921123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
198930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
198941123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
198951123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
198960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
198970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
198980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
198991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshll(v16.V8H(), v0.V8B(),  4);
199010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshll2(v17.V8H(), v0.V16B(), 4);
199021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshll(v18.V4S(),  v1.V4H(), 8);
199040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshll2(v19.V4S(),  v1.V8H(), 8);
199051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshll(v20.V2D(),  v2.V2S(), 16);
199070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sshll2(v21.V2D(),  v2.V4S(), 16);
199081123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
199101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
199121123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xf800f810fff00000, 0x001007f0f800f810, q16);
199140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x07f000100000fff0, 0xf810f80007f00010, q17);
199150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffff0000000000, 0x00000100007fff00, q18);
199160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff800000ff800100, 0xffffff0000000000, q19);
199170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00007fffffff0000, q20);
199180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff800000000000, 0xffffffffffff0000, q21);
199191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
199201123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
199211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199220cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_shll) {
199231123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
199240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
199261123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
199280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
199290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
199301123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shll(v16.V8H(), v0.V8B(),  8);
199320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shll2(v17.V8H(), v0.V16B(), 8);
199331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shll(v18.V4S(),  v1.V4H(), 16);
199350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shll2(v19.V4S(),  v1.V8H(), 16);
199361123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shll(v20.V2D(),  v2.V2S(), 32);
199380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Shll2(v21.V2D(),  v2.V4S(), 32);
199391123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
199410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  RUN();
199431123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x80008100ff000000, 0x01007f0080008100, q16);
199450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7f0001000000ff00, 0x810080007f000100, q17);
199460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff000000000000, 0x000100007fff0000, q18);
199470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000080010000, 0xffff000000000000, q19);
199480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7fffffff00000000, q20);
199490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000000000000, 0xffffffff00000000, q21);
199500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
199510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
199521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199530cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ushll) {
199540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
199550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
199570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
199590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
199600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
199610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushll(v16.V8H(), v0.V8B(),  4);
199630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushll2(v17.V8H(), v0.V16B(), 4);
199640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushll(v18.V4S(),  v1.V4H(), 8);
199660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushll2(v19.V4S(),  v1.V8H(), 8);
199670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushll(v20.V2D(),  v2.V2S(), 16);
199690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ushll2(v21.V2D(),  v2.V4S(), 16);
199700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
199721123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
199741123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x080008100ff00000, 0x001007f008000810, q16);
199760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x07f0001000000ff0, 0x0810080007f00010, q17);
199770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00ffff0000000000, 0x00000100007fff00, q18);
199780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0080000000800100, 0x00ffff0000000000, q19);
199790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00007fffffff0000, q20);
199800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000800000000000, 0x0000ffffffff0000, q21);
199811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
199821123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
199831123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199850cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sxtl) {
199861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
199870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
199891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
199910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
199920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
199931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
199940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtl(v16.V8H(), v0.V8B());
199950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtl2(v17.V8H(), v0.V16B());
199960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
199970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtl(v18.V4S(),  v1.V4H());
199980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtl2(v19.V4S(),  v1.V8H());
199990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtl(v20.V2D(),  v2.V2S());
200010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sxtl2(v21.V2D(),  v2.V4S());
200021123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
200041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
200061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xff80ff81ffff0000, 0x0001007fff80ff81, q16);
200080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x007f00010000ffff, 0xff81ff80007f0001, q17);
200090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffff00000000, 0x0000000100007fff, q18);
200100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffff8000ffff8001, 0xffffffff00000000, q19);
200110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q20);
200120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xffffffff80000000, 0xffffffffffffffff, q21);
200131123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
200141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
200151123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200170cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_uxtl) {
200180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
200191123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
200211123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
200230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
200240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
200251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxtl(v16.V8H(), v0.V8B());
200270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxtl2(v17.V8H(), v0.V16B());
200281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxtl(v18.V4S(),  v1.V4H());
200300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxtl2(v19.V4S(),  v1.V8H());
200311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxtl(v20.V2D(),  v2.V2S());
200330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uxtl2(v21.V2D(),  v2.V4S());
200341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
200360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
200380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0080008100ff0000, 0x0001007f00800081, q16);
200400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x007f0001000000ff, 0x00810080007f0001, q17);
200410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000ffff00000000, 0x0000000100007fff, q18);
200420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000800000008001, 0x0000ffff00000000, q19);
200430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x000000007fffffff, q20);
200440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000080000000, 0x00000000ffffffff, q21);
200450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
200460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
200471123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200490cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ssra) {
200501123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
200510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200521123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
200531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
200550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
200560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
200570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
200580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
200591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V2D(),   v0.V2D());
200610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V2D(),   v0.V2D());
200620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V2D(),   v1.V2D());
200630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(),   v1.V2D());
200640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V2D(),   v2.V2D());
200650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V2D(),   v2.V2D());
200660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v22.V2D(),   v3.V2D());
200670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v23.V2D(),   v4.V2D());
200680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v24.V2D(),   v3.V2D());
200690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v25.V2D(),   v4.V2D());
200700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(v16.V8B(),  v0.V8B(),  4);
200720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(v17.V16B(), v0.V16B(), 4);
200730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(v18.V4H(),  v1.V4H(), 8);
200750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(v19.V8H(),  v1.V8H(), 8);
200760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(v20.V2S(),  v2.V2S(), 16);
200780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(v21.V4S(),  v2.V4S(), 16);
200790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(v22.V2D(),  v3.V2D(), 32);
200810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(v23.V2D(),  v4.V2D(), 32);
200820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
200830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ssra(d24,  d3, 48);
200841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200851123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
200861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
200881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
200890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7879fe0001867879, q16);
200900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x860100fe79788601, 0x7879fe0001867879, q17);
200910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xfffe00000001807e, q18);
200920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7f807f81fffe0000, 0xfffe00000001807e, q19);
200930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080007ffe, q20);
200940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fff8000fffffffe, 0x0000000080007ffe, q21);
200950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff80000001, 0x800000007ffffffe, q22);
200960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff80000000, 0x0000000000000000, q23);
200970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x8000000000007ffe, q24);
200981123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
200991123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
201001123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201010cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_srsra) {
201020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
201031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
201051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
201070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
201080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
201090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
201100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
201111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V2D(),   v0.V2D());
201130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V2D(),   v0.V2D());
201140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V2D(),   v1.V2D());
201150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(),   v1.V2D());
201160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V2D(),   v2.V2D());
201170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V2D(),   v2.V2D());
201180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v22.V2D(),   v3.V2D());
201190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v23.V2D(),   v4.V2D());
201200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v24.V2D(),   v3.V2D());
201210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v25.V2D(),   v4.V2D());
201221123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(v16.V8B(),  v0.V8B(),  4);
201240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(v17.V16B(), v0.V16B(), 4);
201251123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(v18.V4H(),  v1.V4H(), 8);
201270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(v19.V8H(),  v1.V8H(), 8);
201281123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(v20.V2S(),  v2.V2S(), 16);
201300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(v21.V4S(),  v2.V4S(), 16);
201311123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(v22.V2D(),  v3.V2D(), 32);
201330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(v23.V2D(),  v4.V2D(), 32);
201341123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srsra(d24,  d3, 48);
201360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
201370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
201380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
201390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
201400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
201410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7879ff0001877879, q16);
201420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x870100ff79788701, 0x7879ff0001877879, q17);
201430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xffff00000001807f, q18);
201440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7f807f81ffff0000, 0xffff00000001807f, q19);
201450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080007fff, q20);
201460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fff8000ffffffff, 0x0000000080007fff, q21);
201470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff80000001, 0x800000007fffffff, q22);
201480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x7fffffff80000000, 0x0000000000000000, q23);
201490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x8000000000007fff, q24);
201500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
201510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
201520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
201531123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201540cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_usra) {
201551123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
201561123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
201581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
201600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
201610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
201620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
201630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
201641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V2D(),   v0.V2D());
201660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V2D(),   v0.V2D());
201670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V2D(),   v1.V2D());
201680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(),   v1.V2D());
201690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V2D(),   v2.V2D());
201700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V2D(),   v2.V2D());
201710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v22.V2D(),   v3.V2D());
201720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v23.V2D(),   v4.V2D());
201730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v24.V2D(),   v3.V2D());
201740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v25.V2D(),   v4.V2D());
201751123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(v16.V8B(),  v0.V8B(),  4);
201770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(v17.V16B(), v0.V16B(), 4);
201781123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(v18.V4H(),  v1.V4H(), 8);
201800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(v19.V8H(),  v1.V8H(), 8);
201811123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(v20.V2S(),  v2.V2S(), 16);
201830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(v21.V4S(),  v2.V4S(), 16);
201841123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(v22.V2D(),  v3.V2D(), 32);
201860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(v23.V2D(),  v4.V2D(), 32);
201871123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Usra(d24,  d3, 48);
201891123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  END();
201911123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
201931123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
201940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x88890e0001868889, q16);
201950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8601000e89888601, 0x88890e0001868889, q17);
201960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00fe00000001807e, q18);
201970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8080808100fe0000, 0x00fe00000001807e, q19);
201980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080007ffe, q20);
201990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x800080000000fffe, 0x0000000080007ffe, q21);
202000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000080000001, 0x800000007ffffffe, q22);
202010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000080000000, 0x0000000000000000, q23);
202020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x8000000000007ffe, q24);
202031123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202041123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
202051123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
202061123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202070cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_ursra) {
202080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
202091123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
202111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x7f0100ff81807f01, 0x8081ff00017f8081);
202130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x80008001ffff0000, 0xffff000000017fff);
202140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x80000000ffffffff, 0x000000007fffffff);
202150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x8000000000000001, 0x7fffffffffffffff);
202160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0x8000000000000000, 0x0000000000000000);
202170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V2D(),   v0.V2D());
202190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V2D(),   v0.V2D());
202200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V2D(),   v1.V2D());
202210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V2D(),   v1.V2D());
202220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V2D(),   v2.V2D());
202230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V2D(),   v2.V2D());
202240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v22.V2D(),   v3.V2D());
202250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v23.V2D(),   v4.V2D());
202260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v24.V2D(),   v3.V2D());
202270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v25.V2D(),   v4.V2D());
202280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(v16.V8B(),  v0.V8B(),  4);
202300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(v17.V16B(), v0.V16B(), 4);
202310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(v18.V4H(),  v1.V4H(), 8);
202330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(v19.V8H(),  v1.V8H(), 8);
202340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(v20.V2S(),  v2.V2S(), 16);
202360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(v21.V4S(),  v2.V4S(), 16);
202370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(v22.V2D(),  v3.V2D(), 32);
202390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(v23.V2D(),  v4.V2D(), 32);
202400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Ursra(d24,  d3, 48);
202420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
202441123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
202461123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x88890f0001878889, q16);
202480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8701000f89888701, 0x88890f0001878889, q17);
202490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00ff00000001807f, q18);
202500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8080808100ff0000, 0x00ff00000001807f, q19);
202510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0000000080007fff, q20);
202520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x800080000000ffff, 0x0000000080007fff, q21);
202530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000080000001, 0x800000007fffffff, q22);
202540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x8000000080000000, 0x0000000000000000, q23);
202550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x8000000000007fff, q24);
202560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
202570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
202581123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202600cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_uqshl_scalar) {
202611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  SETUP();
202620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  START();
202641123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xf0000000f000f0f0);
202660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x7fffffff7fff7f7f);
202670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x0000000000000001);
202680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaaaaaaaaaaaaaaaa, 0xffffffffffffffff);
202690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
202700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(b16, b0, b2);
202710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(b17, b0, b3);
202720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(b18, b1, b2);
202730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(b19, b1, b3);
202740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(h20, h0, h2);
202750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(h21, h0, h3);
202760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(h22, h1, h2);
202770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(h23, h1, h3);
202780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(s24, s0, s2);
202790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(s25, s0, s3);
202800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(s26, s1, s2);
202810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(s27, s1, s3);
202820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(d28, d0, d2);
202830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(d29, d0, d3);
202840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(d30, d1, d2);
202850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqshl(d31, d1, d3);
202861123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
202881123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
202901123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
202910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff, q16);
202920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x78, q17);
202930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfe, q18);
202940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3f, q19);
202950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffff, q20);
202960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7878, q21);
202970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfefe, q22);
202980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3fbf, q23);
202990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q24);
203000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x78007878, q25);
203010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffefefe, q26);
203020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3fffbfbf, q27);
203030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q28);
203040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7800000078007878, q29);
203050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffffffefffefefe, q30);
203060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3fffffffbfffbfbf, q31);
203071123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
203090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
203101123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203111123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203120cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqshl_scalar) {
203130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
203141123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
203161123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xbfffffffbfffbfbf);
203180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x4000000040004040);
203190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x0000000000000001);
203200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaaaaaaaaaaaaaaaa, 0xffffffffffffffff);
203210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
203220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(b16, b0, b2);
203230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(b17, b0, b3);
203240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(b18, b1, b2);
203250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(b19, b1, b3);
203260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(h20, h0, h2);
203270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(h21, h0, h3);
203280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(h22, h1, h2);
203290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(h23, h1, h3);
203300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(s24, s0, s2);
203310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(s25, s0, s3);
203320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(s26, s1, s2);
203330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(s27, s1, s3);
203340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(d28, d0, d2);
203350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(d29, d0, d3);
203360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(d30, d1, d2);
203370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqshl(d31, d1, d3);
203381123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
203401123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
203421123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80, q16);
203440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xdf, q17);
203450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f, q18);
203460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x20, q19);
203470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000, q20);
203480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xdfdf, q21);
203490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q22);
203500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2020, q23);
203510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80000000, q24);
203520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xdfffdfdf, q25);
203530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q26);
203540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x20002020, q27);
203550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000000000000000, q28);
203560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xdfffffffdfffdfdf, q29);
203570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q30);
203580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2000000020002020, q31);
203591123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203601123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  TEARDOWN();
203611123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl}
203621123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203631123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203640cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_urshl_scalar) {
203650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
203661123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
203681123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xf0000000f000f0f0);
203700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x7fffffff7fff7f7f);
203710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x0000000000000001);
203720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaaaaaaaaaaaaaaaa, 0xffffffffffffffff);
203731123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl
203740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Urshl(d28, d0, d2);
203750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Urshl(d29, d0, d3);
203760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Urshl(d30, d1, d2);
203770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Urshl(d31, d1, d3);
2037890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
203790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2038090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
203810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2038290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
203830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xe0000001e001e1e0, q28);
203840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7800000078007878, q29);
203850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffffffefffefefe, q30);
203860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3fffffffbfffbfc0, q31);
2038790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
203880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
203890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2039090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
203910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
203920cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_srshl_scalar) {
203930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
203940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
203950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
203960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
203970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xbfffffffbfffbfbf);
203980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x4000000040004040);
203990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x0000000000000001);
204000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaaaaaaaaaaaaaaaa, 0xffffffffffffffff);
204010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
204020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srshl(d28, d0, d2);
204030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srshl(d29, d0, d3);
204040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srshl(d30, d1, d2);
204050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Srshl(d31, d1, d3);
2040690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2040790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  END();
2040890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2041090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff7fff7f7e, q28);
204120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xdfffffffdfffdfe0, q29);
204130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000000080008080, q30);
204140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2000000020002020, q31);
2041590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2041690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  TEARDOWN();
2041790b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
2041890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2041990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204200cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_uqrshl_scalar) {
2042190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  SETUP();
204220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
2042390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  START();
2042490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xf0000000f000f0f0);
204260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x7fffffff7fff7f7f);
204270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x0000000000000001);
204280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaaaaaaaaaaaaaaaa, 0xffffffffffffffff);
204290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
204300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(b16, b0, b2);
204310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(b17, b0, b3);
204320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(b18, b1, b2);
204330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(b19, b1, b3);
204340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(h20, h0, h2);
204350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(h21, h0, h3);
204360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(h22, h1, h2);
204370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(h23, h1, h3);
204380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(s24, s0, s2);
204390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(s25, s0, s3);
204400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(s26, s1, s2);
204410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(s27, s1, s3);
204420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(d28, d0, d2);
204430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(d29, d0, d3);
204440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(d30, d1, d2);
204450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqrshl(d31, d1, d3);
2044690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2044890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2045090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff, q16);
204520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x78, q17);
204530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfe, q18);
204540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x40, q19);
204550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffff, q20);
204560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7878, q21);
204570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfefe, q22);
204580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3fc0, q23);
204590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q24);
204600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x78007878, q25);
204610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffefefe, q26);
204620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3fffbfc0, q27);
204630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q28);
204640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7800000078007878, q29);
204650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffffffefffefefe, q30);
204660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x3fffffffbfffbfc0, q31);
2046790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
204690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2047090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2047190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204720cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqrshl_scalar) {
204730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2047490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2047690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xbfffffffbfffbfbf);
204780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x4000000040004040);
204790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x0000000000000001);
204800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xaaaaaaaaaaaaaaaa, 0xffffffffffffffff);
204810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
204820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(b16, b0, b2);
204830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(b17, b0, b3);
204840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(b18, b1, b2);
204850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(b19, b1, b3);
204860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(h20, h0, h2);
204870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(h21, h0, h3);
204880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(h22, h1, h2);
204890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(h23, h1, h3);
204900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(s24, s0, s2);
204910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(s25, s0, s3);
204920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(s26, s1, s2);
204930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(s27, s1, s3);
204940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(d28, d0, d2);
204950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(d29, d0, d3);
204960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(d30, d1, d2);
204970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqrshl(d31, d1, d3);
2049890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
204990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2050090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2050290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80, q16);
205040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xe0, q17);
205050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f, q18);
205060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x20, q19);
205070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000, q20);
205080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xdfe0, q21);
205090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q22);
205100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2020, q23);
205110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80000000, q24);
205120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xdfffdfe0, q25);
205130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q26);
205140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x20002020, q27);
205150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000000000000000, q28);
205160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xdfffffffdfffdfe0, q29);
205170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q30);
205180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2000000020002020, q31);
2051990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
205210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2052290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
205240cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_uqadd_scalar) {
2052590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  SETUP();
205260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
2052790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  START();
2052890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xf0000000f000f0f0);
205300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x7fffffff7fff7f7f);
205310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x1000000010001010);
205320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
205330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(b16, b0, b0);
205340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(b17, b1, b1);
205350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(b18, b2, b2);
205360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(h19, h0, h0);
205370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(h20, h1, h1);
205380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(h21, h2, h2);
205390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(s22, s0, s0);
205400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(s23, s1, s1);
205410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(s24, s2, s2);
205420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(d25, d0, d0);
205430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(d26, d1, d1);
205440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqadd(d27, d2, d2);
2054590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2054790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2054990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xff, q16);
205510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfe, q17);
205520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x20, q18);
205530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffff, q19);
205540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfefe, q20);
205550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2020, q21);
205560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffff, q22);
205570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffefefe, q23);
205580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x20002020, q24);
205590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xffffffffffffffff, q25);
205600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0xfffffffefffefefe, q26);
205610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2000000020002020, q27);
2056290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
205640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2056590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
205670cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqadd_scalar) {
205680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
205690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
205700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
205710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
205720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0x8000000180018181);
205730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x7fffffff7fff7f7f);
205740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0xaaaaaaaaaaaaaaaa, 0x1000000010001010);
205750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
205760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(b16, b0, b0);
205770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(b17, b1, b1);
205780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(b18, b2, b2);
205790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(h19, h0, h0);
205800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(h20, h1, h1);
205810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(h21, h2, h2);
205820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(s22, s0, s0);
205830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(s23, s1, s1);
205840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(s24, s2, s2);
205850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(d25, d0, d0);
205860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(d26, d1, d1);
205870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqadd(d27, d2, d2);
2058890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2058990b0414b6c794be58f34813f84c2c06e6a15be91armvixl  END();
2059090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2059290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
205930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80, q16);
205940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f, q17);
205950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x20, q18);
205960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000, q19);
205970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q20);
205980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2020, q21);
205990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80000000, q22);
206000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q23);
206010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x20002020, q24);
206020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000000000000000, q25);
206030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q26);
206040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x2000000020002020, q27);
2060590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2060690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  TEARDOWN();
2060790b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
2060890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2060990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206100cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_uqsub_scalar) {
2061190b0414b6c794be58f34813f84c2c06e6a15be91armvixl  SETUP();
2061290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2061490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xf0000000f000f0f0);
206160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x7fffffff7fff7f7f);
206170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
206180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(b16, b0, b0);
206190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(b17, b0, b1);
206200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(b18, b1, b0);
206210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(h19, h0, h0);
206220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(h20, h0, h1);
206230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(h21, h1, h0);
206240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(s22, s0, s0);
206250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(s23, s0, s1);
206260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(s24, s1, s0);
206270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(d25, d0, d0);
206280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(d26, d0, d1);
206290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Uqsub(d27, d1, d0);
2063090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2063290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2063490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q16);
206360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x71, q17);
206370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q18);
2063890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q19);
206400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7171, q20);
206410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q21);
2064290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q22);
206440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x70017171, q23);
206450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q24);
2064690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q25);
206480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7000000170017171, q26);
206490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q27);
2065090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
206520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2065390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2065490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206550cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_sqsub_scalar) {
206560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2065790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2065990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xaaaaaaaaaaaaaaaa, 0xf0000000f000f0f0);
206610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x5555555555555555, 0x7eeeeeee7eee7e7e);
206620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
206630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(b16, b0, b0);
206640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(b17, b0, b1);
206650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(b18, b1, b0);
206660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(h19, h0, h0);
206670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(h20, h0, h1);
206680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(h21, h1, h0);
206690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(s22, s0, s0);
206700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(s23, s0, s1);
206710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(s24, s1, s0);
206720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(d25, d0, d0);
206730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(d26, d0, d1);
206740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Sqsub(d27, d1, d0);
2067590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2067690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  END();
206770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
2067890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  RUN();
2067990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q16);
206810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80, q17);
206820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7f, q18);
2068390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
206840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q19);
206850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000, q20);
206860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fff, q21);
206870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
206880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q22);
206890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x80000000, q23);
206900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffff, q24);
206910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
206920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0, q25);
206930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x8000000000000000, q26);
206940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0, 0x7fffffffffffffff, q27);
206950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
206960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
2069790b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
2069890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2069990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207000cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fmla_fmls) {
207010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2070290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
207040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0x3f80000040000000, 0x4100000000000000);
207050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x400000003f800000, 0x000000003f800000);
207060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v2.V2D(), 0x3f800000ffffffff, 0x7f800000ff800000);
207070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v16.V16B(), v0.V16B());
207080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v17.V16B(), v0.V16B());
207090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v18.V16B(), v0.V16B());
207100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v19.V16B(), v0.V16B());
207110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v20.V16B(), v0.V16B());
207120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(v21.V16B(), v0.V16B());
207130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
207140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmla(v16.V2S(), v1.V2S(), v2.V2S());
207150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmla(v17.V4S(), v1.V4S(), v2.V4S());
207160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmla(v18.V2D(), v1.V2D(), v2.V2D());
207170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmls(v19.V2S(), v1.V2S(), v2.V2S());
207180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmls(v20.V4S(), v1.V4S(), v2.V4S());
207190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmls(v21.V2D(), v1.V2D(), v2.V2D());
207200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
207210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
207220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
207230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
207240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7fc00000ff800000, q16);
207250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x40400000ffffffff, 0x7fc00000ff800000, q17);
207260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x3f9800015f8003f7, 0x41000000000000fe, q18);
207270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x7fc000007f800000, q19);
207280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xbf800000ffffffff, 0x7fc000007f800000, q20);
207290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xbf8000023f0007ee, 0x40fffffffffffe04, q21);
207300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
207310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
207320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2073390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
207350cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fmulx_scalar) {
2073690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  SETUP();
207370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
2073890b0414b6c794be58f34813f84c2c06e6a15be91armvixl  START();
207390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 2.0);
207400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 0.5);
207410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 0.0);
207420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -0.0);
207430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
207440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
207450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(s16, s0, s1);
207460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(s17, s2, s4);
207470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(s18, s2, s5);
207480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(s19, s3, s4);
207490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(s20, s3, s5);
207500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
207510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, 2.0);
207520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, 0.5);
207530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, 0.0);
207540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, -0.0);
207550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, kFP64PositiveInfinity);
207560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, kFP64NegativeInfinity);
207570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(d27, d21, d22);
207580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(d28, d23, d25);
207590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(d29, d23, d26);
207600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(d30, d24, d25);
207610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmulx(d31, d24, d26);
207620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2076390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2076590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s16);
207670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s17);
207680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s18);
207690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(-2.0, s19);
207700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s20);
207710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d27);
207720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d28);
207730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d29);
207740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(-2.0, d30);
207750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d31);
2077690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
207780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2077990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2078090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(crc32b) {
207820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
207830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
207840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
207850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
207860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0);
207870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32b(w10, w0, w1);
2078890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
207900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x138);
207910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32b(w11, w0, w1);
2079290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
207940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x38);
207950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32b(w12, w0, w1);
2079690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
207970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
207980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 128);
207990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32b(w13, w0, w1);
208000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, UINT32_MAX);
208020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 255);
208030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32b(w14, w0, w1);
208040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x00010001);
208060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x10001000);
208070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32b(w15, w0, w1);
2080890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2080990b0414b6c794be58f34813f84c2c06e6a15be91armvixl  END();
2081090b0414b6c794be58f34813f84c2c06e6a15be91armvixl  RUN();
2081190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0,        x10);
208130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x5f058808, x11);
208140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x5f058808, x12);
208150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xedb88320, x13);
208160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00ffffff, x14);
208170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x77073196, x15);
208180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
2082090b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
2082190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2082290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208230cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(crc32h) {
208240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
208250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2082690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
208280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0);
208290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32h(w10, w0, w1);
208300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
208320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x10038);
208330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32h(w11, w0, w1);
208340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
208360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x38);
208370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32h(w12, w0, w1);
208380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
208400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 128);
208410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32h(w13, w0, w1);
208420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, UINT32_MAX);
208440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 255);
208450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32h(w14, w0, w1);
208460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x00010001);
208480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x10001000);
208490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32h(w15, w0, w1);
208500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
208520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
208530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0,        x10);
208550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0e848dba, x11);
208560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0e848dba, x12);
208570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x3b83984b, x13);
208580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x2d021072, x14);
208590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x04ac2124, x15);
2086090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
208620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
208630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208650cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(crc32w) {
2086690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  SETUP();
2086790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  START();
2086890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
208700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0);
208710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32w(w10, w0, w1);
2087290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
208740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x80000031);
208750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32w(w11, w0, w1);
2087690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
208780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 128);
208790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32w(w13, w0, w1);
2088090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, UINT32_MAX);
208820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 255);
208830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32w(w14, w0, w1);
2088490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x00010001);
208860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x10001000);
208870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32w(w15, w0, w1);
2088890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
208900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2089190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
208920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0,        x10);
208930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1d937b81, x11);
208940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xed59b63b, x13);
208950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00be2612, x14);
208960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xa036e530, x15);
208970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
208980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
208990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2090090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
209020cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(crc32x) {
209030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
209040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
209050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
209060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
209070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
209080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32x(w10, w0, x1);
209090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
209100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
209110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, UINT64_C(0x0000000800000031));
209120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32x(w11, w0, x1);
209130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
209140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
209150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 128);
209160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32x(w13, w0, x1);
209170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
209180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, UINT32_MAX);
209190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 255);
209200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32x(w14, w0, x1);
209210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
209220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x00010001);
209230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, UINT64_C(0x1000100000000000));
209240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32x(w15, w0, x1);
2092590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2092690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  END();
2092790b0414b6c794be58f34813f84c2c06e6a15be91armvixl  RUN();
2092890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0,        x10);
209300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x40797b92, x11);
209310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x533b85da, x13);
209320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbc962670, x14);
209330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0667602f, x15);
209340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
209350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
2093690b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
2093790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2093890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209390cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(crc32cb) {
209400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
209410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2094290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
209440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0);
209450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cb(w10, w0, w1);
2094690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
209480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x138);
209490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cb(w11, w0, w1);
2095090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
209520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x38);
209530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cb(w12, w0, w1);
2095490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
209560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 128);
209570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cb(w13, w0, w1);
2095890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, UINT32_MAX);
209600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 255);
209610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cb(w14, w0, w1);
2096290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x00010001);
209640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x10001000);
209650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cb(w15, w0, w1);
2096690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
209680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2096990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0,        x10);
209710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x4851927d, x11);
209720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x4851927d, x12);
209730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x82f63b78, x13);
209740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x00ffffff, x14);
209750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xf26b8203, x15);
2097690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
209780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2097990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2098090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(crc32ch) {
209820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
209830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2098490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
209860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0);
209870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32ch(w10, w0, w1);
2098890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
209900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x10038);
209910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32ch(w11, w0, w1);
2099290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
209940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x38);
209950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32ch(w12, w0, w1);
2099690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
209970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
209980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 128);
209990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32ch(w13, w0, w1);
2100090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, UINT32_MAX);
210020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 255);
210030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32ch(w14, w0, w1);
2100490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x00010001);
210060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x10001000);
210070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32ch(w15, w0, w1);
2100890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
210100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2101190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0,        x10);
210130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xcef8494c, x11);
210140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xcef8494c, x12);
210150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xfbc3faf9, x13);
210160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xad7dacae, x14);
210170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x03fc5f19, x15);
2101890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
210200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2102190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2102290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210230cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(crc32cw) {
210240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
210250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2102690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
210280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0);
210290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cw(w10, w0, w1);
2103090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
210320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x80000031);
210330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cw(w11, w0, w1);
2103490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
210360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 128);
210370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cw(w13, w0, w1);
2103890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, UINT32_MAX);
210400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 255);
210410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cw(w14, w0, w1);
2104290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x00010001);
210440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w1, 0x10001000);
210450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cw(w15, w0, w1);
2104690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
210480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2104990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0,        x10);
210510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xbcb79ece, x11);
210520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x52a0c93f, x13);
210530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x9f9b5c7a, x14);
210540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xae1b882a, x15);
2105590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
210570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
210580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
210590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
210600cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(crc32cx) {
210610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
210620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
210630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
210640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
210650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
210660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cx(w10, w0, x1);
210670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
210680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x1);
210690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, UINT64_C(0x0000000800000031));
210700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cx(w11, w0, x1);
210710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
210720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0);
210730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 128);
210740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cx(w13, w0, x1);
210750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
210760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, UINT32_MAX);
210770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 255);
210780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cx(w14, w0, x1);
210790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
210800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(w0, 0x00010001);
210810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, UINT64_C(0x1000100000000000));
210820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Crc32cx(w15, w0, x1);
210830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
210840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
210850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2108690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x0,        x10);
210880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7f320fcb, x11);
210890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x34019664, x13);
210900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x6cc27dd0, x14);
210910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0xc6f0acdb, x15);
2109290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
210940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2109590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2109690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
210970cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fabd_scalar) {
210980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2109990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
211010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s0, 2.0);
211020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s1, 0.5);
211030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s2, 0.0);
211040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s3, -0.0);
211050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s4, kFP32PositiveInfinity);
211060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(s5, kFP32NegativeInfinity);
211070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(s16, s1, s0);
211080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(s17, s2, s3);
211090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(s18, s2, s5);
211100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(s19, s3, s4);
211110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(s20, s3, s5);
211120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
211130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d21, 2.0);
211140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d22, 0.5);
211150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d23, 0.0);
211160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d24, -0.0);
211170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d25, kFP64PositiveInfinity);
211180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmov(d26, kFP64NegativeInfinity);
211190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(d27, d21, d22);
211200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(d28, d23, d24);
211210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(d29, d23, d26);
211220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(d30, d24, d25);
211230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fabd(d31, d24, d26);
211240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2112590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2112790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.5, s16);
211290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s17);
211300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s18);
211310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s19);
211320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s20);
211330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.5, d27);
211340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d28);
211350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d29);
211360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d30);
211370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d31);
211380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
211390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
2114090b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
2114190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2114290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211430cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_faddp_scalar) {
211440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2114590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
211470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d0, 0x3f80000040000000);
211480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d1, 0xff8000007f800000);
211490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d2, 0x0000000080000000);
211500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Faddp(s0, v0.V2S());
211510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Faddp(s1, v1.V2S());
211520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Faddp(s2, v2.V2S());
211530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
211540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0xc000000000000000, 0x4000000000000000);
211550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0xfff8000000000000, 0x7ff8000000000000);
211560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x0000000000000000, 0x8000000000000000);
211570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Faddp(d3, v3.V2D());
211580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Faddp(d4, v4.V2D());
211590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Faddp(d5, v5.V2D());
211600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2116190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2116390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(3.0, s0);
211650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s1);
211660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(0.0, s2);
211670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d3);
211680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d4);
211690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(0.0, d5);
2117090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
211720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2117390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2117490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211750cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fmaxp_scalar) {
211760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2117790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
211790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d0, 0x3f80000040000000);
211800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d1, 0xff8000007f800000);
211810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d2, 0x7fc00000ff800000);
211820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxp(s0, v0.V2S());
211830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxp(s1, v1.V2S());
211840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxp(s2, v2.V2S());
211850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
211860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3ff0000000000000, 0x4000000000000000);
211870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0xfff0000000000000, 0x7ff0000000000000);
211880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x7ff0000000000000, 0x7ff8000000000000);
211890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxp(d3, v3.V2D());
211900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxp(d4, v4.V2D());
211910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxp(d5, v5.V2D());
211920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2119390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2119590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
211960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s0);
211970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s1);
211980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s2);
211990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d3);
212000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d4);
212010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d5);
2120290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
212040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2120590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2120690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212070cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fmaxnmp_scalar) {
212080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2120990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
212110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d0, 0x3f80000040000000);
212120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d1, 0xff8000007f800000);
212130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d2, 0x7fc00000ff800000);
212140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxnmp(s0, v0.V2S());
212150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxnmp(s1, v1.V2S());
212160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxnmp(s2, v2.V2S());
212170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
212180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3ff0000000000000, 0x4000000000000000);
212190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0xfff0000000000000, 0x7ff0000000000000);
212200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x7ff8000000000000, 0xfff0000000000000);
212210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxnmp(d3, v3.V2D());
212220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxnmp(d4, v4.V2D());
212230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fmaxnmp(d5, v5.V2D());
212240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2122590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2122790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(2.0, s0);
212290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32PositiveInfinity, s1);
212300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s2);
212310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(2.0, d3);
212320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64PositiveInfinity, d4);
212330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d5);
2123490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
212360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2123790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2123890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212390cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fminp_scalar) {
212400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2124190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
212430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d0, 0x3f80000040000000);
212440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d1, 0xff8000007f800000);
212450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d2, 0x7fc00000ff800000);
212460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminp(s0, v0.V2S());
212470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminp(s1, v1.V2S());
212480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminp(s2, v2.V2S());
212490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
212500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3ff0000000000000, 0x4000000000000000);
212510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0xfff0000000000000, 0x7ff0000000000000);
212520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x7ff0000000000000, 0x7ff8000000000000);
212530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminp(d3, v3.V2D());
212540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminp(d4, v4.V2D());
212550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminp(d5, v5.V2D());
212560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2125790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2125990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
212610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s1);
212620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32DefaultNaN, s2);
212630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d3);
212640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d4);
212650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64DefaultNaN, d5);
2126690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
212680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2126990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2127090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212710cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_fminnmp_scalar) {
212720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2127390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
212750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d0, 0x3f80000040000000);
212760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d1, 0xff8000007f800000);
212770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(d2, 0x7fc00000ff800000);
212780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminnmp(s0, v0.V2S());
212790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminnmp(s1, v1.V2S());
212800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminnmp(s2, v2.V2S());
212810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
212820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v3.V2D(), 0x3ff0000000000000, 0x4000000000000000);
212830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0xfff0000000000000, 0x7ff0000000000000);
212840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x7ff8000000000000, 0xfff0000000000000);
212850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminnmp(d3, v3.V2D());
212860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminnmp(d4, v4.V2D());
212870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Fminnmp(d5, v5.V2D());
212880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2128990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2129190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(1.0, s0);
212930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s1);
212940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP32(kFP32NegativeInfinity, s2);
212950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(1.0, d3);
212960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d4);
212970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_FP64(kFP64NegativeInfinity, d5);
2129890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
212990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
213000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2130190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2130290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213030cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(neon_tbl) {
213040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2130590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
213070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v30.V2D(), 0xbf561e188b1280e9, 0xbd542b8cbd24e8e8);
213080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v31.V2D(), 0xb5e9883d2c88a46d, 0x12276d5b614c915e);
213090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v0.V2D(), 0xc45b7782bc5ecd72, 0x5dd4fe5a4bc6bf5e);
213100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v1.V2D(), 0x1e3254094bd1746a, 0xf099ecf50e861c80);
213110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
213120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v4.V2D(), 0xf80c030100031f16, 0x00070504031201ff);
213130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v5.V2D(), 0x1f01001afc14202a, 0x2a081e1b0c02020c);
213140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v6.V2D(), 0x353f1a13022a2360, 0x2c464a00203a0a33);
213150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v7.V2D(), 0x64801a1c054cf30d, 0x793a2c052e213739);
213160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
213170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v8.V2D(), 0xb7f60ad7d7d88f13, 0x13eefc240496e842);
213180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v9.V2D(), 0x1be199c7c69b47ec, 0x8e4b9919f6eed443);
213190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v10.V2D(), 0x9bd2e1654c69e48f, 0x2143d089e426c6d2);
213200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v11.V2D(), 0xc31dbdc4a0393065, 0x1ecc2077caaf64d8);
213210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v12.V2D(), 0x29b24463967bc6eb, 0xdaf59970df01c93b);
213220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v13.V2D(), 0x3e20a4a4cb6813f4, 0x20a5832713dae669);
213230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v14.V2D(), 0xc5ff9a94041b1fdf, 0x2f46cde38cba2682);
213240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v15.V2D(), 0xd8cc5b0e61f387e6, 0xe69d6d314971e8fd);
213250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
213260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbl(v8.V16B(), v1.V16B(), v4.V16B());
213270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbl(v9.V16B(), v0.V16B(), v1.V16B(), v5.V16B());
213280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbl(v10.V16B(), v31.V16B(), v0.V16B(), v1.V16B(), v6.V16B());
213290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbl(v11.V16B(), v30.V16B(), v31.V16B(), v0.V16B(), v1.V16B(), v7.V16B());
213300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbl(v12.V8B(), v1.V16B(), v4.V8B());
213310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbl(v13.V8B(), v0.V16B(), v1.V16B(), v5.V8B());
213320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbl(v14.V8B(), v31.V16B(), v0.V16B(), v1.V16B(), v6.V8B());
213330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbl(v15.V8B(), v30.V16B(), v31.V16B(), v0.V16B(), v1.V16B(), v7.V8B());
213340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
213350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v16.V2D(), 0xb7f60ad7d7d88f13, 0x13eefc240496e842);
213360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v17.V2D(), 0x1be199c7c69b47ec, 0x8e4b9919f6eed443);
213370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v18.V2D(), 0x9bd2e1654c69e48f, 0x2143d089e426c6d2);
213380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v19.V2D(), 0xc31dbdc4a0393065, 0x1ecc2077caaf64d8);
213390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v20.V2D(), 0x29b24463967bc6eb, 0xdaf59970df01c93b);
213400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v21.V2D(), 0x3e20a4a4cb6813f4, 0x20a5832713dae669);
213410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v22.V2D(), 0xc5ff9a94041b1fdf, 0x2f46cde38cba2682);
213420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Movi(v23.V2D(), 0xd8cc5b0e61f387e6, 0xe69d6d314971e8fd);
213430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
213440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbx(v16.V16B(), v1.V16B(), v4.V16B());
213450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbx(v17.V16B(), v0.V16B(), v1.V16B(), v5.V16B());
213460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbx(v18.V16B(), v31.V16B(), v0.V16B(), v1.V16B(), v6.V16B());
213470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbx(v19.V16B(), v30.V16B(), v31.V16B(), v0.V16B(), v1.V16B(), v7.V16B());
213480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbx(v20.V8B(), v1.V16B(), v4.V8B());
213490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbx(v21.V8B(), v0.V16B(), v1.V16B(), v5.V8B());
213500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbx(v22.V8B(), v31.V16B(), v0.V16B(), v1.V16B(), v6.V8B());
213510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbx(v23.V8B(), v30.V16B(), v31.V16B(), v0.V16B(), v1.V16B(), v7.V8B());
213520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2135390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2135590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00090e1c800e0000, 0x80f0ecf50e001c00, v8);
213570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1ebf5ed100f50000, 0x0072324b82c6c682, v9);
213580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x00005e4b4cd10e00, 0x0900005e80008800, v10);
213590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000883d2b00001e, 0x00d1822b5bbff074, v11);
213600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x80f0ecf50e001c00, v12);
213610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0072324b82c6c682, v13);
213620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0900005e80008800, v14);
213630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x00d1822b5bbff074, v15);
213640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
213650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xb7090e1c800e8f13, 0x80f0ecf50e961c42, v16);
213660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x1ebf5ed1c6f547ec, 0x8e72324b82c6c682, v17);
213670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x9bd25e4b4cd10e8f, 0x0943d05e802688d2, v18);
213680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0xc31d883d2b39301e, 0x1ed1822b5bbff074, v19);
213690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x80f0ecf50e011c3b, v20);
213700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x2072324b82c6c682, v21);
213710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0x0946cd5e80ba8882, v22);
213720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_128(0x0000000000000000, 0xe6d1822b5bbff074, v23);
2137390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
213750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2137690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2137790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213780cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(regress_cmp_shift_imm) {
213790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2138039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
213810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2138290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0x3d720c8d);
213840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x0, Operand(0x3d720c8d));
2138590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
213870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2138890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_NZCV(ZCFlag);
2139090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
213920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2139390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2139490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213950cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(compute_address) {
213960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2139790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
213980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
213990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t base_address = INT64_C(0x123000000abc);
214000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int64_t reg_offset = INT64_C(0x1087654321);
214010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register base = x0;
214020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Register offset = x1;
2140390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(base, base_address);
214050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(offset, reg_offset);
2140690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2140790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x2, MemOperand(base, 0));
214090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x3, MemOperand(base, 8));
214100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x4, MemOperand(base, -100));
2141190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x5, MemOperand(base, offset));
214130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x6, MemOperand(base, offset, LSL, 2));
214140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x7, MemOperand(base, offset, LSL, 4));
214150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x8, MemOperand(base, offset, LSL, 8));
2141690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x9, MemOperand(base, offset, SXTW));
214180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x10, MemOperand(base, offset, UXTW, 1));
214190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x11, MemOperand(base, offset, SXTW, 2));
214200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ ComputeAddress(x12, MemOperand(base, offset, UXTW, 3));
2142190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2142390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2142590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(base_address, base);
2142790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x123000000abc), x2);
214290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x123000000ac4), x3);
214300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x123000000a58), x4);
2143190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x124087654ddd), x5);
214330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x12721d951740), x6);
214340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x133876543ccc), x7);
214350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x22b765432bbc), x8);
2143690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x122f87654ddd), x9);
214380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x12310eca90fe), x10);
214390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x122e1d951740), x11);
214400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(INT64_C(0x12343b2a23c4), x12);
214410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
214420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
2144390b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
2144490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2144590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214460cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(far_branch_backward) {
214470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test that the MacroAssembler correctly resolves backward branches to labels
214480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // that are outside the immediate range of branch instructions.
214490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Take into account that backward branches can reach one instruction further
214500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // than forward branches.
214510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int overflow_size = kInstructionSize +
214520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    std::max(Instruction::ImmBranchForwardRange(TestBranchType),
214530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl             std::max(Instruction::ImmBranchForwardRange(CompareBranchType),
214540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      Instruction::ImmBranchForwardRange(CondBranchType)));
2145590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
214570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2145890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label done, fail;
214600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label test_tbz, test_cbz, test_bcond;
214610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label success_tbz, success_cbz, success_bcond;
2146290b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
214640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 1);
214650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, 0);
214660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
214670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&test_tbz);
214680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&success_tbz);
214690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(x0, x0, 1 << 0);
214700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&test_cbz);
214710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&success_cbz);
214720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(x0, x0, 1 << 1);
214730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&test_bcond);
214740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&success_bcond);
214750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(x0, x0, 1 << 2);
214760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
214770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&done);
214780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
214790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Generate enough code to overflow the immediate range of the three types of
214800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // branches below.
214810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < overflow_size / kInstructionSize; ++i) {
214820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (i % 100 == 0) {
214830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // If we do land in this code, we do not want to execute so many nops
214840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // before reaching the end of test (especially if tracing is activated).
214850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ B(&fail);
214860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else {
214870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Nop();
2148890b0414b6c794be58f34813f84c2c06e6a15be91armvixl    }
214890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
214900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&fail);
2149190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
214920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&test_tbz);
214930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbz(x10, 7, &success_tbz);
214940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&test_cbz);
214950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x10, &success_cbz);
214960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&test_bcond);
214970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x10, 0);
214980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(eq, &success_bcond);
2149990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // For each out-of-range branch instructions, at least two instructions should
215010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // have been generated.
215020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(masm.SizeOfCodeGeneratedSince(&test_tbz) >= 7 * kInstructionSize);
2150390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&fail);
215050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
215060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
2150790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
215090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2151090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7, x0);
215120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1, x1);
2151390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
215150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2151690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2151790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215180cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(single_veneer) {
215190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
215200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2152190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int max_range = Instruction::ImmBranchForwardRange(TestBranchType);
2152390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label success, fail, done;
2152590b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
215270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 1);
215280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, 0);
2152990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbz(x10, 7, &success);
2153190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Generate enough code to overflow the immediate range of the `tbz`.
215330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < max_range / kInstructionSize + 1; ++i) {
215340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (i % 100 == 0) {
215350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // If we do land in this code, we do not want to execute so many nops
215360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // before reaching the end of test (especially if tracing is activated).
215370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ B(&fail);
215380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else {
215390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Nop();
215400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
215410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
215420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&fail);
2154390b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&success);
215450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 1);
2154690b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&done);
215480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&fail);
215490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
215500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&done);
2155190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
215530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  RUN();
2155490b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x0);
215560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(1, x1);
2155790b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
2155990b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
2156090b0414b6c794be58f34813f84c2c06e6a15be91armvixl
2156190b0414b6c794be58f34813f84c2c06e6a15be91armvixl
215620cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(simple_veneers) {
215630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Test that the MacroAssembler correctly emits veneers for forward branches
215640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // to labels that are outside the immediate range of branch instructions.
215650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int max_range =
215660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    std::max(Instruction::ImmBranchForwardRange(TestBranchType),
215670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl             std::max(Instruction::ImmBranchForwardRange(CompareBranchType),
215680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl                      Instruction::ImmBranchForwardRange(CondBranchType)));
215690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
2157039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
2157139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
2157239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
215730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label done, fail;
215740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label test_tbz, test_cbz, test_bcond;
215750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label success_tbz, success_cbz, success_bcond;
2157639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
215770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x0, 0);
215780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 1);
215790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x10, 0);
2158039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
215810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&test_tbz);
215820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbz(x10, 7, &success_tbz);
215830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&test_cbz);
215840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x10, &success_cbz);
215850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&test_bcond);
215860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cmp(x10, 0);
215870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(eq, &success_bcond);
215880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
215890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Generate enough code to overflow the immediate range of the three types of
215900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // branches below.
215910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < max_range / kInstructionSize + 1; ++i) {
215920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    if (i % 100 == 0) {
215930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // If we do land in this code, we do not want to execute so many nops
215940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      // before reaching the end of test (especially if tracing is activated).
215950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ B(&fail);
215960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    } else {
215970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      __ Nop();
215980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    }
215990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
216000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&fail);
2160139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&success_tbz);
216030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(x0, x0, 1 << 0);
216040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&test_cbz);
216050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&success_cbz);
216060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(x0, x0, 1 << 1);
216070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&test_bcond);
216080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&success_bcond);
216090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Orr(x0, x0, 1 << 2);
2161039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ B(&done);
216120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&fail);
216130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Mov(x1, 0);
2161439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  __ Bind(&done);
2161539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
2161639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  END();
2161739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  RUN();
2161839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x7, x0);
216200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_EQUAL_64(0x1, x1);
2162139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
2162239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
2162339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
2162439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
2162539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216260cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(veneers_stress) {
2162739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  SETUP();
2162839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
2162939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This is a code generation test stressing the emission of veneers. The code
216310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // generated is not executed.
2163239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label target;
216340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const unsigned max_range = Instruction::ImmBranchForwardRange(CondBranchType);
216350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const unsigned iterations =
216360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      (max_range + max_range / 4) / (4 * kInstructionSize);
216370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (unsigned i = 0; i < iterations; i++) {
216380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ B(&target);
216390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ B(eq, &target);
216400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Cbz(x0, &target);
216410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Tbz(x0, 0, &target);
216420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
216430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&target);
2164439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
216460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
216470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
2164839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
2164939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216500cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(veneers_two_out_of_range) {
216510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
216520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
2165339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This is a code generation test. The code generated is not executed.
216550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Ensure that the MacroAssembler considers unresolved branches to chose when
216560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // a veneer pool should be emitted. We generate two branches that go out of
216570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // range at the same offset. When the MacroAssembler decides to emit the
216580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // veneer pool, the emission of a first veneer should not cause the other
216590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // branch to go out of range.
2166039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int range_cbz = Instruction::ImmBranchForwardRange(CompareBranchType);
216620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int range_tbz = Instruction::ImmBranchForwardRange(TestBranchType);
216635ee436a3a51863de7b5dc9326cf02895248050c2armvixl  int max_target = static_cast<int>(masm.CursorOffset()) + range_cbz;
2166439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label done;
2166639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We use different labels to prevent the MacroAssembler from sharing veneers.
216680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label target_cbz, target_tbz;
216690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
216700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Cbz(x0, &target_cbz);
216710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  while (masm.CursorOffset() < max_target - range_tbz) {
216720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Nop();
216730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
216740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbz(x0, 0, &target_tbz);
216750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  while (masm.CursorOffset() < max_target) {
216760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Nop();
216770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2167839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This additional nop makes the branches go out of range.
216800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Nop();
216810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
216820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&target_cbz);
216830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&target_tbz);
216840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
216850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2168639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
2168739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
2168839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
2168939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216900cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(veneers_hanging) {
216910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
2169239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  START();
2169339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
216940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This is a code generation test. The code generated is not executed.
216950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Ensure that the MacroAssembler considers unresolved branches to chose when
216960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // a veneer pool should be emitted. This is similar to the
216970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // 'veneers_two_out_of_range' test. We try to trigger the following situation:
216980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   b.eq label
216990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   b.eq label
217000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   ...
217010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   nop
217020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   ...
217030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   cbz x0, label
217040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   cbz x0, label
217050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   ...
217060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   tbz x0, 0 label
217070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   nop
217080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   ...
217090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   nop    <- From here the `b.eq` and `cbz` instructions run out of range,
217100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //             so a literal pool is required.
217110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   veneer
217120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   veneer
217130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   veneer <- The `tbz` runs out of range somewhere in the middle of the
217140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   veneer    veneer pool.
217150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //   veneer
217160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
217170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int range_bcond = Instruction::ImmBranchForwardRange(CondBranchType);
217180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int range_cbz = Instruction::ImmBranchForwardRange(CompareBranchType);
217190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int range_tbz = Instruction::ImmBranchForwardRange(TestBranchType);
217205ee436a3a51863de7b5dc9326cf02895248050c2armvixl  const int max_target = static_cast<int>(masm.CursorOffset()) + range_bcond;
2172139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label done;
217230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int n_bcond = 100;
217240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int n_cbz = 100;
217250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int n_tbz = 1;
217260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int kNTotalBranches = n_bcond + n_cbz + n_tbz;
217270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
217280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We use different labels to prevent the MacroAssembler from sharing veneers.
217290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label labels[kNTotalBranches];
217300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < kNTotalBranches; i++) {
217310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    new(&labels[i]) Label();
217320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2173339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < n_bcond; i++) {
217350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ B(eq, &labels[i]);
217360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2173739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  while (masm.CursorOffset() < max_target - range_cbz) {
217390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Nop();
217400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2174139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < n_cbz; i++) {
217430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Cbz(x0, &labels[n_bcond + i]);
217440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2174539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Ensure the 'tbz' will go out of range after some of the previously
217470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // generated branches.
217480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  int margin = (n_bcond / 2) * kInstructionSize;
217490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  while (masm.CursorOffset() < max_target - range_tbz + margin) {
217500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Nop();
217510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2175239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbz(x0, 0, &labels[n_bcond + n_cbz]);
2175439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  while (masm.CursorOffset() < max_target) {
217560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Nop();
217570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2175839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This additional nop makes the 'b.eq' and 'cbz' instructions go out of range
217600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // and forces the emission of a veneer pool. The 'tbz' is not yet out of
217610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // range, but will go out of range while veneers are emitted for the other
217620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // branches.
217630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The MacroAssembler should ensure that veneers are correctly emitted for all
217640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // the branches, including the 'tbz'. Checks will fail if the target of a
217650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // branch is out of range.
217660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Nop();
2176739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < kNTotalBranches; i++) {
217690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Bind(&labels[i]);
217700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
2177139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
2177339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl  TEARDOWN();
2177439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl}
2177539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
2177639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixl
217770cc8b6ece4b3e757e11a906a81ece292437713abarmvixlTEST(collision_literal_veneer_pools) {
217780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  SETUP();
217790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  START();
217800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
217810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // This is a code generation test. The code generated is not executed.
217820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
217830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Make sure the literal pool is empty;
217840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  masm.EmitLiteralPool(LiteralPool::kBranchRequired);
217850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_LITERAL_POOL_SIZE(0);
217860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
217870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // We chose the offsets below to (try to) trigger the following situation:
217880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // buffer offset
217890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //              0:   tbz x0, 0, target_tbz ----------------------------------.
217900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //              4:   nop                                                     |
217910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   ...                                                     |
217920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   nop                                                     |
217930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //    literal gen:   ldr s0, [pc + ...]   ; load from `pool start + 0`       |
217940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   ldr s0, [pc + ...]   ; load from `pool start + 4`       |
217950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   ...                                                     |
217960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   ldr s0, [pc + ...]                                      |
217970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //     pool start:   floating-point literal (0.1)                            |
217980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   floating-point literal (1.1)                            |
217990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   ...                                                     |
218000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   floating-point literal (<n>.1)     <-----tbz-max-range--'
218010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   floating-point literal (<n+1>.1)
218020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  //                   ...
218030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int range_tbz = Instruction::ImmBranchForwardRange(TestBranchType);
218055ee436a3a51863de7b5dc9326cf02895248050c2armvixl  const int max_target = static_cast<int>(masm.CursorOffset()) + range_tbz;
218060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const size_t target_literal_pool_size = 100 * kInstructionSize;
218080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  const int offset_start_literal_gen =
218090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      target_literal_pool_size + target_literal_pool_size / 2;
218100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Label target_tbz;
218130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Tbz(x0, 0, &target_tbz);
218150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(masm.NumberOfPotentialVeneers() == 1);
218160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  while (masm.CursorOffset() < max_target - offset_start_literal_gen) {
218170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Nop();
218180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
218190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(masm.NumberOfPotentialVeneers() == 1);
218200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  for (int i = 0; i < 100; i++) {
218220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    // Use a different value to force one literal pool entry per iteration.
218230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    __ Ldr(s0, i + 0.1);
218240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  }
218250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(masm.LiteralPoolSize() >= target_literal_pool_size);
218260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // Force emission of a literal pool.
218280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  masm.EmitLiteralPool(LiteralPool::kBranchRequired);
218290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  ASSERT_LITERAL_POOL_SIZE(0);
218300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // The branch should not have gone out of range during the emission of the
218320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  // literal pool.
218330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  __ Bind(&target_tbz);
218340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  VIXL_CHECK(masm.NumberOfPotentialVeneers() == 0);
218360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
218370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  END();
218380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  TEARDOWN();
218390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
218405ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218415ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218425ee436a3a51863de7b5dc9326cf02895248050c2armvixlTEST(ldr_literal_explicit) {
218435ee436a3a51863de7b5dc9326cf02895248050c2armvixl  SETUP();
218445ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218455ee436a3a51863de7b5dc9326cf02895248050c2armvixl  START();
218465ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int64_t> automatically_placed_literal(1, masm.GetLiteralPool());
218475ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int64_t> manually_placed_literal(2);
218485ee436a3a51863de7b5dc9326cf02895248050c2armvixl  {
218495ee436a3a51863de7b5dc9326cf02895248050c2armvixl    CodeBufferCheckScope scope(&masm,
218505ee436a3a51863de7b5dc9326cf02895248050c2armvixl                               kInstructionSize + sizeof(int64_t),
218515ee436a3a51863de7b5dc9326cf02895248050c2armvixl                               CodeBufferCheckScope::kCheck,
218525ee436a3a51863de7b5dc9326cf02895248050c2armvixl                               CodeBufferCheckScope::kExactSize);
218535ee436a3a51863de7b5dc9326cf02895248050c2armvixl    Label over_literal;
218545ee436a3a51863de7b5dc9326cf02895248050c2armvixl    __ b(&over_literal);
218555ee436a3a51863de7b5dc9326cf02895248050c2armvixl    __ place(&manually_placed_literal);
218565ee436a3a51863de7b5dc9326cf02895248050c2armvixl    __ bind(&over_literal);
218575ee436a3a51863de7b5dc9326cf02895248050c2armvixl  }
218585ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(x1, &manually_placed_literal);
218595ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(x2, &automatically_placed_literal);
218605ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Add(x0, x1, x2);
218615ee436a3a51863de7b5dc9326cf02895248050c2armvixl  END();
218625ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218635ee436a3a51863de7b5dc9326cf02895248050c2armvixl  RUN();
218645ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218655ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(3, x0);
218665ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218675ee436a3a51863de7b5dc9326cf02895248050c2armvixl  TEARDOWN();
218685ee436a3a51863de7b5dc9326cf02895248050c2armvixl}
218695ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218705ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218715ee436a3a51863de7b5dc9326cf02895248050c2armvixlTEST(ldr_literal_automatically_placed) {
218725ee436a3a51863de7b5dc9326cf02895248050c2armvixl  SETUP();
218735ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218745ee436a3a51863de7b5dc9326cf02895248050c2armvixl  START();
218755ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218765ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // We start with an empty literal pool.
218775ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
218785ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218795ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // Create a literal that should be placed by the literal pool.
218805ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int64_t> explicit_literal(2, masm.GetLiteralPool());
218815ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // It should not appear in the literal pool until its first use.
218825ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
218835ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218845ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // Check that using standard literals does not break the use of explicitly
218855ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // created literals.
218865ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(d1, 1.1);
218875ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(8);
218885ee436a3a51863de7b5dc9326cf02895248050c2armvixl  masm.EmitLiteralPool(LiteralPool::kBranchRequired);
218895ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
218905ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218915ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(x2, &explicit_literal);
218925ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(8);
218935ee436a3a51863de7b5dc9326cf02895248050c2armvixl  masm.EmitLiteralPool(LiteralPool::kBranchRequired);
218945ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
218955ee436a3a51863de7b5dc9326cf02895248050c2armvixl
218965ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(d3, 3.3);
218975ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(8);
218985ee436a3a51863de7b5dc9326cf02895248050c2armvixl  masm.EmitLiteralPool(LiteralPool::kBranchRequired);
218995ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
219005ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219015ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // Re-use our explicitly created literal. It has already been placed, so it
219025ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // should not impact the literal pool.
219035ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(x4, &explicit_literal);
219045ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
219055ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219065ee436a3a51863de7b5dc9326cf02895248050c2armvixl  END();
219075ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219085ee436a3a51863de7b5dc9326cf02895248050c2armvixl  RUN();
219095ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219105ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_FP64(1.1, d1);
219115ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(2, x2);
219125ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_FP64(3.3, d3);
219135ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(2, x4);
219145ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219155ee436a3a51863de7b5dc9326cf02895248050c2armvixl  TEARDOWN();
219165ee436a3a51863de7b5dc9326cf02895248050c2armvixl}
219175ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219185ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219195ee436a3a51863de7b5dc9326cf02895248050c2armvixlTEST(literal_update_overwrite) {
219205ee436a3a51863de7b5dc9326cf02895248050c2armvixl  SETUP();
219215ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219225ee436a3a51863de7b5dc9326cf02895248050c2armvixl  START();
219235ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219245ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
219255ee436a3a51863de7b5dc9326cf02895248050c2armvixl  LiteralPool* literal_pool = masm.GetLiteralPool();
219265ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219275ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int32_t> lit_32_update_before_pool(0xbad, literal_pool);
219285ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int32_t> lit_32_update_after_pool(0xbad, literal_pool);
219295ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int64_t> lit_64_update_before_pool(0xbad, literal_pool);
219305ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int64_t> lit_64_update_after_pool(0xbad, literal_pool);
219315ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219325ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
219335ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219345ee436a3a51863de7b5dc9326cf02895248050c2armvixl  lit_32_update_before_pool.UpdateValue(32);
219355ee436a3a51863de7b5dc9326cf02895248050c2armvixl  lit_64_update_before_pool.UpdateValue(64);
219365ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219375ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(w1, &lit_32_update_before_pool);
219385ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(x2, &lit_64_update_before_pool);
219395ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(w3, &lit_32_update_after_pool);
219405ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(x4, &lit_64_update_after_pool);
219415ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219425ee436a3a51863de7b5dc9326cf02895248050c2armvixl  masm.EmitLiteralPool(LiteralPool::kBranchRequired);
219435ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219445ee436a3a51863de7b5dc9326cf02895248050c2armvixl  VIXL_ASSERT(lit_32_update_after_pool.IsPlaced());
219455ee436a3a51863de7b5dc9326cf02895248050c2armvixl  VIXL_ASSERT(lit_64_update_after_pool.IsPlaced());
219465ee436a3a51863de7b5dc9326cf02895248050c2armvixl  lit_32_update_after_pool.UpdateValue(128, &masm);
219475ee436a3a51863de7b5dc9326cf02895248050c2armvixl  lit_64_update_after_pool.UpdateValue(256, &masm);
219485ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219495ee436a3a51863de7b5dc9326cf02895248050c2armvixl  END();
219505ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219515ee436a3a51863de7b5dc9326cf02895248050c2armvixl  RUN();
219525ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219535ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(32, x1);
219545ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(64, x2);
219555ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(128, x3);
219565ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(256, x4);
219575ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219585ee436a3a51863de7b5dc9326cf02895248050c2armvixl  TEARDOWN();
219595ee436a3a51863de7b5dc9326cf02895248050c2armvixl}
219605ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219615ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219625ee436a3a51863de7b5dc9326cf02895248050c2armvixlTEST(literal_deletion_policies) {
219635ee436a3a51863de7b5dc9326cf02895248050c2armvixl  SETUP();
219645ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219655ee436a3a51863de7b5dc9326cf02895248050c2armvixl  START();
219665ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219675ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // We cannot check exactly when the deletion of the literals occur, but we
219685ee436a3a51863de7b5dc9326cf02895248050c2armvixl  // check that usage of the deletion policies is not broken.
219695ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219705ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
219715ee436a3a51863de7b5dc9326cf02895248050c2armvixl  LiteralPool* literal_pool = masm.GetLiteralPool();
219725ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219735ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int32_t> lit_manual(0xbad, literal_pool);
219745ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int32_t>* lit_deleted_on_placement =
219755ee436a3a51863de7b5dc9326cf02895248050c2armvixl      new Literal<int32_t>(0xbad,
219765ee436a3a51863de7b5dc9326cf02895248050c2armvixl                           literal_pool,
219775ee436a3a51863de7b5dc9326cf02895248050c2armvixl                           RawLiteral::kDeletedOnPlacementByPool);
219785ee436a3a51863de7b5dc9326cf02895248050c2armvixl  Literal<int32_t>* lit_deleted_on_pool_destruction =
219795ee436a3a51863de7b5dc9326cf02895248050c2armvixl      new Literal<int32_t>(0xbad,
219805ee436a3a51863de7b5dc9326cf02895248050c2armvixl                           literal_pool,
219815ee436a3a51863de7b5dc9326cf02895248050c2armvixl                           RawLiteral::kDeletedOnPoolDestruction);
219825ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219835ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_LITERAL_POOL_SIZE(0);
219845ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219855ee436a3a51863de7b5dc9326cf02895248050c2armvixl  lit_manual.UpdateValue(32);
219865ee436a3a51863de7b5dc9326cf02895248050c2armvixl  lit_deleted_on_placement->UpdateValue(64);
219875ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219885ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(w1, &lit_manual);
219895ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(w2, lit_deleted_on_placement);
219905ee436a3a51863de7b5dc9326cf02895248050c2armvixl  __ Ldr(w3, lit_deleted_on_pool_destruction);
219915ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219925ee436a3a51863de7b5dc9326cf02895248050c2armvixl  masm.EmitLiteralPool(LiteralPool::kBranchRequired);
219935ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219945ee436a3a51863de7b5dc9326cf02895248050c2armvixl  VIXL_ASSERT(lit_manual.IsPlaced());
219955ee436a3a51863de7b5dc9326cf02895248050c2armvixl  VIXL_ASSERT(lit_deleted_on_pool_destruction->IsPlaced());
219965ee436a3a51863de7b5dc9326cf02895248050c2armvixl  lit_deleted_on_pool_destruction->UpdateValue(128, &masm);
219975ee436a3a51863de7b5dc9326cf02895248050c2armvixl
219985ee436a3a51863de7b5dc9326cf02895248050c2armvixl  END();
219995ee436a3a51863de7b5dc9326cf02895248050c2armvixl
220005ee436a3a51863de7b5dc9326cf02895248050c2armvixl  RUN();
220015ee436a3a51863de7b5dc9326cf02895248050c2armvixl
220025ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(32, x1);
220035ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(64, x2);
220045ee436a3a51863de7b5dc9326cf02895248050c2armvixl  ASSERT_EQUAL_64(128, x3);
220055ee436a3a51863de7b5dc9326cf02895248050c2armvixl
220065ee436a3a51863de7b5dc9326cf02895248050c2armvixl  TEARDOWN();
220075ee436a3a51863de7b5dc9326cf02895248050c2armvixl}
220085ee436a3a51863de7b5dc9326cf02895248050c2armvixl
220095ee436a3a51863de7b5dc9326cf02895248050c2armvixl
22010ad96eda8944ab1c1ba55715c50d9d6f0a3ed1dcarmvixl}  // namespace vixl
22011