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