1b78f13911bfe6eda303e91ef215c87a165aae8aeAlexandre Rames// Copyright 2016, VIXL authors 288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// All rights reserved. 388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// 488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// Redistribution and use in source and binary forms, with or without 588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// modification, are permitted provided that the following conditions are met: 688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// 788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// * Redistributions of source code must retain the above copyright notice, 888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// this list of conditions and the following disclaimer. 988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// * Redistributions in binary form must reproduce the above copyright notice, 1088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// this list of conditions and the following disclaimer in the documentation 1188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// and/or other materials provided with the distribution. 1288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// * Neither the name of ARM Limited nor the names of its contributors may be 1388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// used to endorse or promote products derived from this software without 1488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// specific prior written permission. 1588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// 1688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 1788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 1988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 2088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 2288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 2388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 2488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 2719c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois 2888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// ----------------------------------------------------------------------------- 2988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// This file is auto generated from the 30d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames// test/aarch32/config/template-simulator-aarch32.cc.in template file using 3188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// tools/generate_tests.py. 3288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// 3388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// PLEASE DO NOT EDIT. 3488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// ----------------------------------------------------------------------------- 3588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 3619c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois 3788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#include "test-runner.h" 3888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 3988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#include "test-utils.h" 40d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "test-utils-aarch32.h" 4188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 42d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/assembler-aarch32.h" 43d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/macro-assembler-aarch32.h" 44d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/disasm-aarch32.h" 4588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 4688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#define __ masm. 4788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#define BUF_SIZE (4096) 4888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 491e85b7f2e8ad2bfb233de29405aade635ed207cePierre Langlois#ifdef VIXL_INCLUDE_SIMULATOR_AARCH32 5088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// Run tests with the simulator. 5188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 5288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#define SETUP() MacroAssembler masm(BUF_SIZE) 5388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 54919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames#define START() masm.GetBuffer()->Reset() 5588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 5688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#define END() \ 5788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Hlt(0); \ 5888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ FinalizeCode(); 5988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 6088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// TODO: Run the tests in the simulator. 6188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#define RUN() 6288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 6388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#define TEARDOWN() 6488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 651e85b7f2e8ad2bfb233de29405aade635ed207cePierre Langlois#else // ifdef VIXL_INCLUDE_SIMULATOR_AARCH32. 6688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 674cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli#define SETUP() \ 684cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli MacroAssembler masm(BUF_SIZE); \ 694cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli UseScratchRegisterScope harness_scratch(&masm); \ 704cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli harness_scratch.ExcludeAll(); 7188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 72919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames#define START() \ 73919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames masm.GetBuffer()->Reset(); \ 74919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames __ Push(r4); \ 75919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames __ Push(r5); \ 76919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames __ Push(r6); \ 77919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames __ Push(r7); \ 78919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames __ Push(r8); \ 79919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames __ Push(r9); \ 80919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames __ Push(r10); \ 81919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames __ Push(r11); \ 824cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Push(lr); \ 834cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli harness_scratch.Include(ip); 844cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli 854cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli#define END() \ 864cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli harness_scratch.Exclude(ip); \ 874cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(lr); \ 884cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(r11); \ 894cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(r10); \ 904cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(r9); \ 914cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(r8); \ 924cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(r7); \ 934cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(r6); \ 944cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(r5); \ 954cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Pop(r4); \ 964cb13e841305b38acbd8195b1c511d59c91ec8d9Georgia Kouveli __ Bx(lr); \ 97cb6592f4b00347a84f9d7638473f0af8f1b6b1ddGeorgia Kouveli __ FinalizeCode(); 9888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 99919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames#define RUN() \ 100919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames { \ 101919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames int pcs_offset = masm.IsUsingT32() ? 1 : 0; \ 1026a049f97861bd71c69d81f643e42308d28c5de31Alexandre Rames masm.GetBuffer()->SetExecutable(); \ 103919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames ExecuteMemory(masm.GetBuffer()->GetStartAddress<byte*>(), \ 104919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames masm.GetSizeOfCodeGenerated(), \ 105919e3fe28a5024c53ede42922092bbc32e89dcb8Alexandre Rames pcs_offset); \ 1066a049f97861bd71c69d81f643e42308d28c5de31Alexandre Rames masm.GetBuffer()->SetWritable(); \ 10788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 10888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 109cb6592f4b00347a84f9d7638473f0af8f1b6b1ddGeorgia Kouveli#define TEARDOWN() harness_scratch.Close(); 11088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 1111e85b7f2e8ad2bfb233de29405aade635ed207cePierre Langlois#endif // ifdef VIXL_INCLUDE_SIMULATOR_AARCH32 11288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 11388c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisnamespace vixl { 11488c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisnamespace aarch32 { 11588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 11688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// List of instruction encodings: 11788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#define FOREACH_INSTRUCTION(M) \ 11888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois M(Cmn) \ 11988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois M(Cmp) \ 12088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois M(Mov) \ 12188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois M(Movs) \ 12288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois M(Mvn) \ 12388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois M(Mvns) \ 12488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois M(Teq) \ 12588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois M(Tst) 12688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 12719c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois 1281d451fce2580f360ef249893135526156985a85cPierre Langlois// The following definitions are defined again in each generated test, therefore 1291d451fce2580f360ef249893135526156985a85cPierre Langlois// we need to place them in an anomymous namespace. It expresses that they are 1301d451fce2580f360ef249893135526156985a85cPierre Langlois// local to this file only, and the compiler is not allowed to share these types 1311d451fce2580f360ef249893135526156985a85cPierre Langlois// across test files during template instantiation. Specifically, `Operands` and 1321d451fce2580f360ef249893135526156985a85cPierre Langlois// `Inputs` have various layouts across generated tests so they absolutely 1331d451fce2580f360ef249893135526156985a85cPierre Langlois// cannot be shared. 1341d451fce2580f360ef249893135526156985a85cPierre Langlois 1359a9331faeba996d6c85e6e2a6355ccfc22c6cab6Rodolph Perfetta#ifdef VIXL_INCLUDE_TARGET_T32 1361d451fce2580f360ef249893135526156985a85cPierre Langloisnamespace { 1371d451fce2580f360ef249893135526156985a85cPierre Langlois 13888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// Values to be passed to the assembler to produce the instruction under test. 13988c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstruct Operands { 14088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Condition cond; 14188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Register rd; 14288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t immediate; 14388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}; 14488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 14588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// Input data to feed to the instruction. 14688c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstruct Inputs { 14788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t apsr; 14888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t rd; 14988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}; 15088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 15188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// This structure contains all input data needed to test one specific encoding. 15288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// It used to generate a loop over an instruction. 15388c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstruct TestLoopData { 15488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // The `operands` fields represents the values to pass to the assembler to 15588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // produce the instruction. 15688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Operands operands; 15788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Description of the operands, used for error reporting. 15888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const char* operands_description; 15988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Unique identifier, used for generating traces. 16088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const char* identifier; 16188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Array of values to be fed to the instruction. 16288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois size_t input_size; 16388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const Inputs* inputs; 16488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}; 16588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 16688c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstatic const Inputs kCondition[] = {{NFlag, 0xabababab}, 16788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {ZFlag, 0xabababab}, 16888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {CFlag, 0xabababab}, 16988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {VFlag, 0xabababab}, 17088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NZFlag, 0xabababab}, 17188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NCFlag, 0xabababab}, 17288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NVFlag, 0xabababab}, 17388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {ZCFlag, 0xabababab}, 17488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {ZVFlag, 0xabababab}, 17588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {CVFlag, 0xabababab}, 17688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NZCFlag, 0xabababab}, 17788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NZVFlag, 0xabababab}, 17888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NCVFlag, 0xabababab}, 17988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {ZCVFlag, 0xabababab}, 18088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NZCVFlag, 0xabababab}}; 18188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 18288c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstatic const Inputs kModifiedImmediate[] = {{NoFlag, 0x00000000}, 18388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x00000001}, 18488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x00000002}, 18588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x00000020}, 18688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x0000007d}, 18788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x0000007e}, 18888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x0000007f}, 18988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x00007ffd}, 19088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x00007ffe}, 19188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x00007fff}, 19288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x33333333}, 19388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x55555555}, 19488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x7ffffffd}, 19588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x7ffffffe}, 19688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x7fffffff}, 19788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x80000000}, 19888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0x80000001}, 19988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xaaaaaaaa}, 20088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xcccccccc}, 20188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffff8000}, 20288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffff8001}, 20388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffff8002}, 20488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffff8003}, 20588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffffff80}, 20688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffffff81}, 20788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffffff82}, 20888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffffff83}, 20988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffffffe0}, 21088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xfffffffd}, 21188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xfffffffe}, 21288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois {NoFlag, 0xffffffff}}; 21388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 21419c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois 21588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// A loop will be generated for each element of this array. 2161d451fce2580f360ef249893135526156985a85cPierre Langloisconst TestLoopData kTests[] = {{{eq, r0, 0xabababab}, 2171d451fce2580f360ef249893135526156985a85cPierre Langlois "eq r0 0xabababab", 2181d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_eq_r0_0xabababab", 2191d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2201d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2211d451fce2580f360ef249893135526156985a85cPierre Langlois {{ne, r0, 0xabababab}, 2221d451fce2580f360ef249893135526156985a85cPierre Langlois "ne r0 0xabababab", 2231d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_ne_r0_0xabababab", 2241d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2251d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2261d451fce2580f360ef249893135526156985a85cPierre Langlois {{cs, r0, 0xabababab}, 2271d451fce2580f360ef249893135526156985a85cPierre Langlois "cs r0 0xabababab", 2281d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_cs_r0_0xabababab", 2291d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2301d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2311d451fce2580f360ef249893135526156985a85cPierre Langlois {{cc, r0, 0xabababab}, 2321d451fce2580f360ef249893135526156985a85cPierre Langlois "cc r0 0xabababab", 2331d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_cc_r0_0xabababab", 2341d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2351d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2361d451fce2580f360ef249893135526156985a85cPierre Langlois {{mi, r0, 0xabababab}, 2371d451fce2580f360ef249893135526156985a85cPierre Langlois "mi r0 0xabababab", 2381d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_mi_r0_0xabababab", 2391d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2401d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2411d451fce2580f360ef249893135526156985a85cPierre Langlois {{pl, r0, 0xabababab}, 2421d451fce2580f360ef249893135526156985a85cPierre Langlois "pl r0 0xabababab", 2431d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_pl_r0_0xabababab", 2441d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2451d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2461d451fce2580f360ef249893135526156985a85cPierre Langlois {{vs, r0, 0xabababab}, 2471d451fce2580f360ef249893135526156985a85cPierre Langlois "vs r0 0xabababab", 2481d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_vs_r0_0xabababab", 2491d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2501d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2511d451fce2580f360ef249893135526156985a85cPierre Langlois {{vc, r0, 0xabababab}, 2521d451fce2580f360ef249893135526156985a85cPierre Langlois "vc r0 0xabababab", 2531d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_vc_r0_0xabababab", 2541d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2551d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2561d451fce2580f360ef249893135526156985a85cPierre Langlois {{hi, r0, 0xabababab}, 2571d451fce2580f360ef249893135526156985a85cPierre Langlois "hi r0 0xabababab", 2581d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_hi_r0_0xabababab", 2591d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2601d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2611d451fce2580f360ef249893135526156985a85cPierre Langlois {{ls, r0, 0xabababab}, 2621d451fce2580f360ef249893135526156985a85cPierre Langlois "ls r0 0xabababab", 2631d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_ls_r0_0xabababab", 2641d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2651d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2661d451fce2580f360ef249893135526156985a85cPierre Langlois {{ge, r0, 0xabababab}, 2671d451fce2580f360ef249893135526156985a85cPierre Langlois "ge r0 0xabababab", 2681d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_ge_r0_0xabababab", 2691d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2701d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2711d451fce2580f360ef249893135526156985a85cPierre Langlois {{lt, r0, 0xabababab}, 2721d451fce2580f360ef249893135526156985a85cPierre Langlois "lt r0 0xabababab", 2731d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_lt_r0_0xabababab", 2741d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2751d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2761d451fce2580f360ef249893135526156985a85cPierre Langlois {{gt, r0, 0xabababab}, 2771d451fce2580f360ef249893135526156985a85cPierre Langlois "gt r0 0xabababab", 2781d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_gt_r0_0xabababab", 2791d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2801d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2811d451fce2580f360ef249893135526156985a85cPierre Langlois {{le, r0, 0xabababab}, 2821d451fce2580f360ef249893135526156985a85cPierre Langlois "le r0 0xabababab", 2831d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_le_r0_0xabababab", 2841d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2851d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2861d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0xabababab}, 2871d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0xabababab", 2881d451fce2580f360ef249893135526156985a85cPierre Langlois "Condition_al_r0_0xabababab", 2891d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kCondition), 2901d451fce2580f360ef249893135526156985a85cPierre Langlois kCondition}, 2911d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x000001fe}, 2921d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x000001fe", 2931d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x000001fe", 2941d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 2951d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 2961d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x000003fc}, 2971d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x000003fc", 2981d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x000003fc", 2991d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3001d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3011d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x000007f8}, 3021d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x000007f8", 3031d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x000007f8", 3041d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3051d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3061d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00000ff0}, 3071d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00000ff0", 3081d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00000ff0", 3091d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3101d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3111d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00001fe0}, 3121d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00001fe0", 3131d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00001fe0", 3141d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3151d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3161d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00003fc0}, 3171d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00003fc0", 3181d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00003fc0", 3191d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3201d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3211d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00007f80}, 3221d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00007f80", 3231d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00007f80", 3241d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3251d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3261d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x0000ff00}, 3271d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x0000ff00", 3281d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x0000ff00", 3291d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3301d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3311d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x0001fe00}, 3321d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x0001fe00", 3331d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x0001fe00", 3341d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3351d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3361d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x0003fc00}, 3371d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x0003fc00", 3381d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x0003fc00", 3391d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3401d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3411d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x0007f800}, 3421d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x0007f800", 3431d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x0007f800", 3441d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3451d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3461d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x000ff000}, 3471d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x000ff000", 3481d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x000ff000", 3491d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3501d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3511d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x001fe000}, 3521d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x001fe000", 3531d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x001fe000", 3541d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3551d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3561d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x003fc000}, 3571d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x003fc000", 3581d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x003fc000", 3591d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3601d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3611d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x007f8000}, 3621d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x007f8000", 3631d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x007f8000", 3641d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3651d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3661d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00ff0000}, 3671d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00ff0000", 3681d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00ff0000", 3691d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3701d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3711d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x01fe0000}, 3721d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x01fe0000", 3731d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x01fe0000", 3741d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3751d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3761d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x03fc0000}, 3771d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x03fc0000", 3781d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x03fc0000", 3791d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3801d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3811d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x07f80000}, 3821d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x07f80000", 3831d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x07f80000", 3841d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3851d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3861d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x0ff00000}, 3871d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x0ff00000", 3881d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x0ff00000", 3891d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3901d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3911d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x1fe00000}, 3921d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x1fe00000", 3931d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x1fe00000", 3941d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 3951d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 3961d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x3fc00000}, 3971d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x3fc00000", 3981d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x3fc00000", 3991d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4001d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4011d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x7f800000}, 4021d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x7f800000", 4031d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x7f800000", 4041d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4051d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4061d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0xff000000}, 4071d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0xff000000", 4081d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0xff000000", 4091d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4101d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4111d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x000000ff}, 4121d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x000000ff", 4131d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x000000ff", 4141d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4151d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4161d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00ff00ff}, 4171d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00ff00ff", 4181d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00ff00ff", 4191d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4201d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4211d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0xff00ff00}, 4221d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0xff00ff00", 4231d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0xff00ff00", 4241d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4251d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4261d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0xffffffff}, 4271d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0xffffffff", 4281d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0xffffffff", 4291d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4301d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4311d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00000156}, 4321d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00000156", 4331d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00000156", 4341d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4351d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4361d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x000002ac}, 4371d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x000002ac", 4381d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x000002ac", 4391d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4401d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4411d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00000558}, 4421d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00000558", 4431d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00000558", 4441d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4451d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4461d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00000ab0}, 4471d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00000ab0", 4481d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00000ab0", 4491d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4501d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4511d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00001560}, 4521d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00001560", 4531d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00001560", 4541d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4551d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4561d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00002ac0}, 4571d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00002ac0", 4581d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00002ac0", 4591d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4601d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4611d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00005580}, 4621d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00005580", 4631d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00005580", 4641d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4651d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4661d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x0000ab00}, 4671d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x0000ab00", 4681d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x0000ab00", 4691d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4701d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4711d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00015600}, 4721d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00015600", 4731d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00015600", 4741d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4751d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4761d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x0002ac00}, 4771d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x0002ac00", 4781d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x0002ac00", 4791d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4801d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4811d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00055800}, 4821d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00055800", 4831d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00055800", 4841d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4851d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4861d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x000ab000}, 4871d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x000ab000", 4881d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x000ab000", 4891d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4901d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4911d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00156000}, 4921d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00156000", 4931d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00156000", 4941d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 4951d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 4961d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x002ac000}, 4971d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x002ac000", 4981d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x002ac000", 4991d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5001d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5011d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00558000}, 5021d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00558000", 5031d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00558000", 5041d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5051d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5061d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00ab0000}, 5071d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00ab0000", 5081d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00ab0000", 5091d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5101d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5111d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x01560000}, 5121d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x01560000", 5131d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x01560000", 5141d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5151d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5161d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x02ac0000}, 5171d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x02ac0000", 5181d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x02ac0000", 5191d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5201d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5211d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x05580000}, 5221d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x05580000", 5231d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x05580000", 5241d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5251d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5261d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x0ab00000}, 5271d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x0ab00000", 5281d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x0ab00000", 5291d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5301d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5311d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x15600000}, 5321d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x15600000", 5331d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x15600000", 5341d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5351d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5361d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x2ac00000}, 5371d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x2ac00000", 5381d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x2ac00000", 5391d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5401d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5411d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x55800000}, 5421d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x55800000", 5431d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x55800000", 5441d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5451d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5461d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0xab000000}, 5471d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0xab000000", 5481d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0xab000000", 5491d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5501d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5511d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x000000ab}, 5521d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x000000ab", 5531d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x000000ab", 5541d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5551d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5561d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0x00ab00ab}, 5571d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0x00ab00ab", 5581d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0x00ab00ab", 5591d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5601d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5611d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0xab00ab00}, 5621d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0xab00ab00", 5631d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0xab00ab00", 5641d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5651d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}, 5661d451fce2580f360ef249893135526156985a85cPierre Langlois {{al, r0, 0xabababab}, 5671d451fce2580f360ef249893135526156985a85cPierre Langlois "al r0 0xabababab", 5681d451fce2580f360ef249893135526156985a85cPierre Langlois "ModifiedImmediate_al_r0_0xabababab", 5691d451fce2580f360ef249893135526156985a85cPierre Langlois ARRAY_SIZE(kModifiedImmediate), 5701d451fce2580f360ef249893135526156985a85cPierre Langlois kModifiedImmediate}}; 57188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 57288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// We record all inputs to the instructions as outputs. This way, we also check 57388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// that what shouldn't change didn't change. 57488c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisstruct TestResult { 57588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois size_t output_size; 57688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const Inputs* outputs; 57788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}; 57888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 57988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// These headers each contain an array of `TestResult` with the reference output 58088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// values. The reference arrays are names `kReference{mnemonic}`. 581d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/traces/simulator-cond-rd-operand-const-t32-cmn.h" 582d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/traces/simulator-cond-rd-operand-const-t32-cmp.h" 583d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/traces/simulator-cond-rd-operand-const-t32-mov.h" 584d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/traces/simulator-cond-rd-operand-const-t32-movs.h" 585d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/traces/simulator-cond-rd-operand-const-t32-mvn.h" 586d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/traces/simulator-cond-rd-operand-const-t32-mvns.h" 587d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/traces/simulator-cond-rd-operand-const-t32-teq.h" 588d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch32/traces/simulator-cond-rd-operand-const-t32-tst.h" 58988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 59019c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois 59188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// The maximum number of errors to report in detail for each test. 5921d451fce2580f360ef249893135526156985a85cPierre Langloisconst unsigned kErrorReportLimit = 8; 59388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 59419c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langloistypedef void (MacroAssembler::*Fn)(Condition cond, 59519c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois Register rd, 59688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois const Operand& op); 59788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 59828ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langloisvoid TestHelper(Fn instruction, 59928ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois const char* mnemonic, 60028ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois const TestResult reference[]) { 60188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois SETUP(); 60210dae1a549308bddc1931f29754d6a4459f70c9bJacob Bramley masm.UseT32(); 60388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois START(); 60488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 60588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Data to compare to `reference`. 60688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois TestResult* results[ARRAY_SIZE(kTests)]; 60788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 60888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Test cases for memory bound instructions may allocate a buffer and save its 60988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // address in this array. 61088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois byte* scratch_memory_buffers[ARRAY_SIZE(kTests)]; 61188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 61288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Generate a loop for each element in `kTests`. Each loop tests one specific 61388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // instruction. 61488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois for (unsigned i = 0; i < ARRAY_SIZE(kTests); i++) { 61588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Allocate results on the heap for this test. 61688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois results[i] = new TestResult; 61788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois results[i]->outputs = new Inputs[kTests[i].input_size]; 61888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois results[i]->output_size = kTests[i].input_size; 61988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 620f5348cedd702124c90fc75e75d0195e2e485c620Pierre Langlois size_t input_stride = sizeof(kTests[i].inputs[0]) * kTests[i].input_size; 621f5348cedd702124c90fc75e75d0195e2e485c620Pierre Langlois VIXL_ASSERT(IsUint32(input_stride)); 62288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 62388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois scratch_memory_buffers[i] = NULL; 62488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 62588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Label loop; 62688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois UseScratchRegisterScope scratch_registers(&masm); 62788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Include all registers from r0 ro r12. 62888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois scratch_registers.Include(RegisterList(0x1fff)); 62988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 63088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Values to pass to the macro-assembler. 63188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Condition cond = kTests[i].operands.cond; 63288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Register rd = kTests[i].operands.rd; 63388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t immediate = kTests[i].operands.immediate; 63488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Operand op(immediate); 63588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois scratch_registers.Exclude(rd); 63688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 63788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Allocate reserved registers for our own use. 63888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Register input_ptr = scratch_registers.Acquire(); 63988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Register input_end = scratch_registers.Acquire(); 64088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Register result_ptr = scratch_registers.Acquire(); 64188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 64288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Initialize `input_ptr` to the first element and `input_end` the address 64388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // after the array. 644f5348cedd702124c90fc75e75d0195e2e485c620Pierre Langlois __ Mov(input_ptr, Operand::From(kTests[i].inputs)); 645f5348cedd702124c90fc75e75d0195e2e485c620Pierre Langlois __ Add(input_end, input_ptr, static_cast<uint32_t>(input_stride)); 646f5348cedd702124c90fc75e75d0195e2e485c620Pierre Langlois __ Mov(result_ptr, Operand::From(results[i]->outputs)); 64788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Bind(&loop); 64888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 64988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois { 65088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois UseScratchRegisterScope temp_registers(&masm); 65188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Register nzcv_bits = temp_registers.Acquire(); 65288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Register saved_q_bit = temp_registers.Acquire(); 65388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Save the `Q` bit flag. 65488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Mrs(saved_q_bit, APSR); 65588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ And(saved_q_bit, saved_q_bit, QFlag); 65688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Set the `NZCV` and `Q` flags together. 65788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Ldr(nzcv_bits, MemOperand(input_ptr, offsetof(Inputs, apsr))); 65888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Orr(nzcv_bits, nzcv_bits, saved_q_bit); 65988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Msr(APSR_nzcvq, nzcv_bits); 66088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 66188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Ldr(rd, MemOperand(input_ptr, offsetof(Inputs, rd))); 66288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 66388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois (masm.*instruction)(cond, rd, op); 66488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 66588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois { 66688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois UseScratchRegisterScope temp_registers(&masm); 66788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois Register nzcv_bits = temp_registers.Acquire(); 66888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Mrs(nzcv_bits, APSR); 66988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Only record the NZCV bits. 67088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ And(nzcv_bits, nzcv_bits, NZCVFlag); 67188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Str(nzcv_bits, MemOperand(result_ptr, offsetof(Inputs, apsr))); 67288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 67388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Str(rd, MemOperand(result_ptr, offsetof(Inputs, rd))); 67488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 67588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Advance the result pointer. 676f5348cedd702124c90fc75e75d0195e2e485c620Pierre Langlois __ Add(result_ptr, result_ptr, Operand::From(sizeof(kTests[i].inputs[0]))); 67788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Loop back until `input_ptr` is lower than `input_base`. 678f5348cedd702124c90fc75e75d0195e2e485c620Pierre Langlois __ Add(input_ptr, input_ptr, Operand::From(sizeof(kTests[i].inputs[0]))); 67988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ Cmp(input_ptr, input_end); 68088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois __ B(ne, &loop); 68188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 68288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 68388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois END(); 68488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 68588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois RUN(); 68688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 68788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois if (Test::generate_test_trace()) { 68888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Print the results. 68988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 6901d451fce2580f360ef249893135526156985a85cPierre Langlois printf("const Inputs kOutputs_%s_%s[] = {\n", 69119c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois mnemonic, 69288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois kTests[i].identifier); 69388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois for (size_t j = 0; j < results[i]->output_size; j++) { 69488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(" { "); 69588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("0x%08" PRIx32, results[i]->outputs[j].apsr); 69688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(", "); 69788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("0x%08" PRIx32, results[i]->outputs[j].rd); 69888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(" },\n"); 69988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 70088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("};\n"); 70188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 7021d451fce2580f360ef249893135526156985a85cPierre Langlois printf("const TestResult kReference%s[] = {\n", mnemonic); 70388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 70488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(" {\n"); 70519c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois printf(" ARRAY_SIZE(kOutputs_%s_%s),\n", 70619c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois mnemonic, 70788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois kTests[i].identifier); 70888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(" kOutputs_%s_%s,\n", mnemonic, kTests[i].identifier); 70988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(" },\n"); 71088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 71188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("};\n"); 71254fce717d9371fa2e8fc46e1d811bdb4ab74f279Alexandre Rames } else if (kCheckSimulatorTestResults) { 71388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Check the results. 71488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois unsigned total_error_count = 0; 71588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 71688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois bool instruction_has_errors = false; 71788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois for (size_t j = 0; j < kTests[i].input_size; j++) { 71888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t apsr = results[i]->outputs[j].apsr; 71988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t rd = results[i]->outputs[j].rd; 72088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t apsr_input = kTests[i].inputs[j].apsr; 72188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t rd_input = kTests[i].inputs[j].rd; 72288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t apsr_ref = reference[i].outputs[j].apsr; 72388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois uint32_t rd_ref = reference[i].outputs[j].rd; 72488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 72588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois if (((apsr != apsr_ref) || (rd != rd_ref)) && 72688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois (++total_error_count <= kErrorReportLimit)) { 72788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Print the instruction once even if it triggered multiple failures. 72888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois if (!instruction_has_errors) { 72919c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois printf("Error(s) when testing \"%s %s\":\n", 73019c0535d3c9c0bec6eeecce0ae704a7fd527a9d8Pierre Langlois mnemonic, 73188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois kTests[i].operands_description); 73288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois instruction_has_errors = true; 73388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 73488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois // Print subsequent errors. 73588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(" Input: "); 73688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("0x%08" PRIx32, apsr_input); 73788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(", "); 73888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("0x%08" PRIx32, rd_input); 73988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("\n"); 74088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(" Expected: "); 74188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("0x%08" PRIx32, apsr_ref); 74288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(", "); 74388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("0x%08" PRIx32, rd_ref); 74488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("\n"); 74588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(" Found: "); 74688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("0x%08" PRIx32, apsr); 74788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf(", "); 74888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("0x%08" PRIx32, rd); 74988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("\n\n"); 75088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 75188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 75288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 75388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 75488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois if (total_error_count > kErrorReportLimit) { 75588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois printf("%u other errors follow.\n", 75688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois total_error_count - kErrorReportLimit); 75788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 75888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois VIXL_CHECK(total_error_count == 0); 75954fce717d9371fa2e8fc46e1d811bdb4ab74f279Alexandre Rames } else { 76054fce717d9371fa2e8fc46e1d811bdb4ab74f279Alexandre Rames VIXL_WARNING("Assembled the code, but did not run anything.\n"); 76188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 76288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 76388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 76488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois delete[] results[i]->outputs; 76588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois delete results[i]; 766ec4fdd22abecf1b8f52ee9dbff596ebdded9b5d6Serban Constantinescu delete[] scratch_memory_buffers[i]; 76788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } 76888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 76988c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois TEARDOWN(); 77088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois} 77188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 77288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois// Instantiate tests for each instruction in the list. 77328ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois// TODO: Remove this limitation by having a sandboxing mechanism. 77428ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois#if defined(VIXL_HOST_POINTER_32) 77588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#define TEST(mnemonic) \ 7761d451fce2580f360ef249893135526156985a85cPierre Langlois void Test_##mnemonic() { \ 77788c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois TestHelper(&MacroAssembler::mnemonic, #mnemonic, kReference##mnemonic); \ 77888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois } \ 7791d451fce2580f360ef249893135526156985a85cPierre Langlois Test test_##mnemonic( \ 78088c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois "AARCH32_SIMULATOR_COND_RD_OPERAND_CONST_T32_" #mnemonic, \ 78188c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois &Test_##mnemonic); 78228ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois#else 78328ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois#define TEST(mnemonic) \ 78428ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois void Test_##mnemonic() { \ 78528ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois VIXL_WARNING("This test can only run on a 32-bit host.\n"); \ 78628ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois USE(TestHelper); \ 78728ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois } \ 78828ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois Test test_##mnemonic( \ 78928ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois "AARCH32_SIMULATOR_COND_RD_OPERAND_CONST_T32_" #mnemonic, \ 79028ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois &Test_##mnemonic); 79128ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois#endif 79228ee02e59261f0aaa4824953fa3db5dd8f7f8dcfPierre Langlois 79388c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisFOREACH_INSTRUCTION(TEST) 79488c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois#undef TEST 79588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois 7961d451fce2580f360ef249893135526156985a85cPierre Langlois} // namespace 7979a9331faeba996d6c85e6e2a6355ccfc22c6cab6Rodolph Perfetta#endif 7981d451fce2580f360ef249893135526156985a85cPierre Langlois 7991d451fce2580f360ef249893135526156985a85cPierre Langlois} // namespace aarch32 8001d451fce2580f360ef249893135526156985a85cPierre Langlois} // namespace vixl 801