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