14d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// Copyright 2016, VIXL authors 24d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// All rights reserved. 34d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// 44d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// Redistribution and use in source and binary forms, with or without 54d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// modification, are permitted provided that the following conditions are met: 64d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// 74d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// * Redistributions of source code must retain the above copyright notice, 84d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// this list of conditions and the following disclaimer. 94d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// * Redistributions in binary form must reproduce the above copyright notice, 104d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// this list of conditions and the following disclaimer in the documentation 114d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// and/or other materials provided with the distribution. 124d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// * Neither the name of ARM Limited nor the names of its contributors may be 134d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// used to endorse or promote products derived from this software without 144d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// specific prior written permission. 154d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// 164d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 174d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 184d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 194d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 204d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 214d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 224d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 234d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 244d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 254d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 264d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 274d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 284d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// ----------------------------------------------------------------------------- 294d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// This file is auto generated from the 304d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// test/aarch32/config/template-assembler-aarch32.cc.in template file using 314d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// tools/generate_tests.py. 324d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// 334d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// PLEASE DO NOT EDIT. 344d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// ----------------------------------------------------------------------------- 354d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 364d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 374d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#include "test-runner.h" 384d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 394d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#include "test-utils.h" 404d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#include "test-utils-aarch32.h" 414d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 424d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#include "aarch32/assembler-aarch32.h" 434d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#include "aarch32/macro-assembler-aarch32.h" 444d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 454d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#define BUF_SIZE (4096) 464d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 474d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisnamespace vixl { 484d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisnamespace aarch32 { 494d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 504d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// List of instruction mnemonics. 514d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#define FOREACH_INSTRUCTION(M) \ 524d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois M(vadd) \ 534d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois M(vsub) 544d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 554d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 564d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// The following definitions are defined again in each generated test, therefore 574d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// we need to place them in an anomymous namespace. It expresses that they are 584d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// local to this file only, and the compiler is not allowed to share these types 594d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// across test files during template instantiation. Specifically, `Operands` has 604d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// various layouts across generated tests so it absolutely cannot be shared. 614d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 624d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#ifdef VIXL_INCLUDE_TARGET_T32 634d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisnamespace { 644d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 654d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// Values to be passed to the assembler to produce the instruction under test. 664d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisstruct Operands { 674d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DataType dt; 684d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rd; 694d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rn; 704d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rm; 714d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois}; 724d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 734d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// This structure contains all data needed to test one specific 744d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// instruction. 754d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisstruct TestData { 764d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // The `operands` field represents what to pass to the assembler to 774d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // produce the instruction. 784d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois Operands operands; 794d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // True if we need to generate an IT instruction for this test to be valid. 804d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois bool in_it_block; 814d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // The condition to give the IT instruction, this will be set to "al" by 824d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // default. 834d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois Condition it_condition; 844d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // Description of the operands, used for error reporting. 854d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois const char* operands_description; 864d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // Unique identifier, used for generating traces. 874d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois const char* identifier; 884d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois}; 894d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 904d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisstruct TestResult { 914d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois size_t size; 924d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois const byte* encoding; 934d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois}; 944d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 954d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// Each element of this array produce one instruction encoding. 964d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisconst TestData kTests[] = 974d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{{F64, d16, d17, d14}, false, al, "F64 d16 d17 d14", "F64_d16_d17_d14"}, 984d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d21, d29, d16}, false, al, "F64 d21 d29 d16", "F64_d21_d29_d16"}, 994d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d19, d28, d12}, false, al, "F64 d19 d28 d12", "F64_d19_d28_d12"}, 1004d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d5, d16, d12}, false, al, "F32 d5 d16 d12", "F32_d5_d16_d12"}, 1014d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d31, d7, d1}, false, al, "F64 d31 d7 d1", "F64_d31_d7_d1"}, 1024d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d22, d6, d1}, false, al, "F64 d22 d6 d1", "F64_d22_d6_d1"}, 1034d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d22, d28, d12}, false, al, "F32 d22 d28 d12", "F32_d22_d28_d12"}, 1044d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d15, d1, d6}, false, al, "F32 d15 d1 d6", "F32_d15_d1_d6"}, 1054d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d18, d17, d23}, false, al, "F32 d18 d17 d23", "F32_d18_d17_d23"}, 1064d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d29, d21, d18}, false, al, "F64 d29 d21 d18", "F64_d29_d21_d18"}, 1074d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d28, d29, d29}, false, al, "F64 d28 d29 d29", "F64_d28_d29_d29"}, 1084d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d26, d28, d26}, false, al, "F64 d26 d28 d26", "F64_d26_d28_d26"}, 1094d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d2, d18, d10}, false, al, "F64 d2 d18 d10", "F64_d2_d18_d10"}, 1104d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d4, d30, d6}, false, al, "F64 d4 d30 d6", "F64_d4_d30_d6"}, 1114d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d11, d25, d14}, false, al, "F64 d11 d25 d14", "F64_d11_d25_d14"}, 1124d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d4, d26, d15}, false, al, "F32 d4 d26 d15", "F32_d4_d26_d15"}, 1134d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d9, d20, d30}, false, al, "F64 d9 d20 d30", "F64_d9_d20_d30"}, 1144d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d18, d12, d20}, false, al, "F64 d18 d12 d20", "F64_d18_d12_d20"}, 1154d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d1, d27, d15}, false, al, "F64 d1 d27 d15", "F64_d1_d27_d15"}, 1164d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d22, d22, d3}, false, al, "F32 d22 d22 d3", "F32_d22_d22_d3"}, 1174d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d29, d19, d6}, false, al, "F32 d29 d19 d6", "F32_d29_d19_d6"}, 1184d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d9, d23, d8}, false, al, "F64 d9 d23 d8", "F64_d9_d23_d8"}, 1194d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d12, d18, d29}, false, al, "F32 d12 d18 d29", "F32_d12_d18_d29"}, 1204d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d0, d12, d13}, false, al, "F64 d0 d12 d13", "F64_d0_d12_d13"}, 1214d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d9, d17, d17}, false, al, "F64 d9 d17 d17", "F64_d9_d17_d17"}, 1224d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d11, d0, d29}, false, al, "F64 d11 d0 d29", "F64_d11_d0_d29"}, 1234d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d24, d16, d28}, false, al, "F64 d24 d16 d28", "F64_d24_d16_d28"}, 1244d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d22, d14, d26}, false, al, "F64 d22 d14 d26", "F64_d22_d14_d26"}, 1254d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d11, d14, d22}, false, al, "F64 d11 d14 d22", "F64_d11_d14_d22"}, 1264d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d19, d12, d6}, false, al, "F64 d19 d12 d6", "F64_d19_d12_d6"}, 1274d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d29, d3, d28}, false, al, "F64 d29 d3 d28", "F64_d29_d3_d28"}, 1284d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d21, d8, d3}, false, al, "F64 d21 d8 d3", "F64_d21_d8_d3"}, 1294d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d1, d15, d25}, false, al, "F32 d1 d15 d25", "F32_d1_d15_d25"}, 1304d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d22, d8, d8}, false, al, "F64 d22 d8 d8", "F64_d22_d8_d8"}, 1314d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d29, d23, d10}, false, al, "F64 d29 d23 d10", "F64_d29_d23_d10"}, 1324d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d3, d16, d8}, false, al, "F32 d3 d16 d8", "F32_d3_d16_d8"}, 1334d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d1, d0, d13}, false, al, "F32 d1 d0 d13", "F32_d1_d0_d13"}, 1344d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d11, d11, d4}, false, al, "F64 d11 d11 d4", "F64_d11_d11_d4"}, 1354d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d10, d22, d24}, false, al, "F64 d10 d22 d24", "F64_d10_d22_d24"}, 1364d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d16, d22, d3}, false, al, "F64 d16 d22 d3", "F64_d16_d22_d3"}, 1374d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d1, d22, d17}, false, al, "F64 d1 d22 d17", "F64_d1_d22_d17"}, 1384d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d5, d26, d24}, false, al, "F32 d5 d26 d24", "F32_d5_d26_d24"}, 1394d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d17, d1, d18}, false, al, "F64 d17 d1 d18", "F64_d17_d1_d18"}, 1404d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d19, d15, d0}, false, al, "F32 d19 d15 d0", "F32_d19_d15_d0"}, 1414d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d22, d3, d3}, false, al, "F32 d22 d3 d3", "F32_d22_d3_d3"}, 1424d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d30, d16, d4}, false, al, "F32 d30 d16 d4", "F32_d30_d16_d4"}, 1434d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d31, d28, d16}, false, al, "F64 d31 d28 d16", "F64_d31_d28_d16"}, 1444d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d9, d9, d26}, false, al, "F64 d9 d9 d26", "F64_d9_d9_d26"}, 1454d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d18, d12, d5}, false, al, "F32 d18 d12 d5", "F32_d18_d12_d5"}, 1464d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d1, d1, d14}, false, al, "F64 d1 d1 d14", "F64_d1_d1_d14"}, 1474d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d10, d26, d27}, false, al, "F64 d10 d26 d27", "F64_d10_d26_d27"}, 1484d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d4, d24, d28}, false, al, "F32 d4 d24 d28", "F32_d4_d24_d28"}, 1494d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d5, d17, d1}, false, al, "F64 d5 d17 d1", "F64_d5_d17_d1"}, 1504d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d20, d4, d8}, false, al, "F64 d20 d4 d8", "F64_d20_d4_d8"}, 1514d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d14, d5, d27}, false, al, "F32 d14 d5 d27", "F32_d14_d5_d27"}, 1524d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d19, d26, d13}, false, al, "F32 d19 d26 d13", "F32_d19_d26_d13"}, 1534d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d26, d6, d19}, false, al, "F64 d26 d6 d19", "F64_d26_d6_d19"}, 1544d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d5, d26, d31}, false, al, "F64 d5 d26 d31", "F64_d5_d26_d31"}, 1554d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d7, d26, d7}, false, al, "F64 d7 d26 d7", "F64_d7_d26_d7"}, 1564d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d14, d10, d17}, false, al, "F32 d14 d10 d17", "F32_d14_d10_d17"}, 1574d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d4, d16, d30}, false, al, "F32 d4 d16 d30", "F32_d4_d16_d30"}, 1584d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d10, d12, d2}, false, al, "F64 d10 d12 d2", "F64_d10_d12_d2"}, 1594d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d15, d17, d10}, false, al, "F32 d15 d17 d10", "F32_d15_d17_d10"}, 1604d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d20, d25, d20}, false, al, "F64 d20 d25 d20", "F64_d20_d25_d20"}, 1614d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d12, d21, d28}, false, al, "F32 d12 d21 d28", "F32_d12_d21_d28"}, 1624d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d20, d23, d16}, false, al, "F64 d20 d23 d16", "F64_d20_d23_d16"}, 1634d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d11, d19, d18}, false, al, "F64 d11 d19 d18", "F64_d11_d19_d18"}, 1644d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d3, d6, d7}, false, al, "F64 d3 d6 d7", "F64_d3_d6_d7"}, 1654d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d23, d20, d7}, false, al, "F32 d23 d20 d7", "F32_d23_d20_d7"}, 1664d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d3, d16, d19}, false, al, "F32 d3 d16 d19", "F32_d3_d16_d19"}, 1674d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d2, d17, d31}, false, al, "F64 d2 d17 d31", "F64_d2_d17_d31"}, 1684d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d10, d30, d23}, false, al, "F64 d10 d30 d23", "F64_d10_d30_d23"}, 1694d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d27, d11, d2}, false, al, "F64 d27 d11 d2", "F64_d27_d11_d2"}, 1704d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d19, d10, d19}, false, al, "F64 d19 d10 d19", "F64_d19_d10_d19"}, 1714d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d16, d4, d15}, false, al, "F64 d16 d4 d15", "F64_d16_d4_d15"}, 1724d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d8, d28, d1}, false, al, "F32 d8 d28 d1", "F32_d8_d28_d1"}, 1734d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d13, d31, d5}, false, al, "F32 d13 d31 d5", "F32_d13_d31_d5"}, 1744d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d17, d13, d29}, false, al, "F64 d17 d13 d29", "F64_d17_d13_d29"}, 1754d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d27, d19, d10}, false, al, "F32 d27 d19 d10", "F32_d27_d19_d10"}, 1764d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d8, d4, d0}, false, al, "F64 d8 d4 d0", "F64_d8_d4_d0"}, 1774d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d31, d1, d29}, false, al, "F64 d31 d1 d29", "F64_d31_d1_d29"}, 1784d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d6, d2, d12}, false, al, "F64 d6 d2 d12", "F64_d6_d2_d12"}, 1794d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d25, d23, d24}, false, al, "F64 d25 d23 d24", "F64_d25_d23_d24"}, 1804d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d3, d12, d1}, false, al, "F64 d3 d12 d1", "F64_d3_d12_d1"}, 1814d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d24, d18, d16}, false, al, "F64 d24 d18 d16", "F64_d24_d18_d16"}, 1824d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d13, d21, d16}, false, al, "F32 d13 d21 d16", "F32_d13_d21_d16"}, 1834d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d9, d6, d23}, false, al, "F32 d9 d6 d23", "F32_d9_d6_d23"}, 1844d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d14, d14, d13}, false, al, "F64 d14 d14 d13", "F64_d14_d14_d13"}, 1854d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d25, d23, d17}, false, al, "F32 d25 d23 d17", "F32_d25_d23_d17"}, 1864d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d13, d25, d3}, false, al, "F64 d13 d25 d3", "F64_d13_d25_d3"}, 1874d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d9, d11, d8}, false, al, "F64 d9 d11 d8", "F64_d9_d11_d8"}, 1884d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d18, d13, d26}, false, al, "F32 d18 d13 d26", "F32_d18_d13_d26"}, 1894d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d16, d14, d15}, false, al, "F64 d16 d14 d15", "F64_d16_d14_d15"}, 1904d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d5, d30, d13}, false, al, "F32 d5 d30 d13", "F32_d5_d30_d13"}, 1914d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d4, d21, d14}, false, al, "F32 d4 d21 d14", "F32_d4_d21_d14"}, 1924d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d7, d4, d5}, false, al, "F32 d7 d4 d5", "F32_d7_d4_d5"}, 1934d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F64, d2, d23, d13}, false, al, "F64 d2 d23 d13", "F64_d2_d23_d13"}, 1944d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d16, d30, d23}, false, al, "F32 d16 d30 d23", "F32_d16_d30_d23"}, 1954d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d18, d15, d28}, false, al, "F32 d18 d15 d28", "F32_d18_d15_d28"}, 1964d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois {{F32, d6, d31, d23}, false, al, "F32 d6 d31 d23", "F32_d6_d31_d23"}}; 1974d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 1984d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// These headers each contain an array of `TestResult` with the reference output 1994d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// values. The reference arrays are names `kReference{mnemonic}`. 2004d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#include "aarch32/traces/assembler-cond-dt-drt-drd-drn-drm-float-not-f16-vadd-t32.h" 2014d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#include "aarch32/traces/assembler-cond-dt-drt-drd-drn-drm-float-not-f16-vsub-t32.h" 2024d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2034d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2044d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// The maximum number of errors to report in detail for each test. 2054d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisconst unsigned kErrorReportLimit = 8; 2064d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2074d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloistypedef void (MacroAssembler::*Fn)(DataType dt, 2084d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rd, 2094d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rn, 2104d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rm); 2114d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2124d912ac1b98ffe0638320815636b0b9661a8846cPierre Langloisvoid TestHelper(Fn instruction, 2134d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois const char* mnemonic, 2144d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois const TestResult reference[]) { 2154d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois unsigned total_error_count = 0; 2164d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois MacroAssembler masm(BUF_SIZE); 2174d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2184d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois masm.UseT32(); 2194d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2204d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois for (unsigned i = 0; i < ARRAY_SIZE(kTests); i++) { 2214d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // Values to pass to the macro-assembler. 2224d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DataType dt = kTests[i].operands.dt; 2234d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rd = kTests[i].operands.rd; 2244d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rn = kTests[i].operands.rn; 2254d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois DRegister rm = kTests[i].operands.rm; 2264d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2274d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois int32_t start = masm.GetCursorOffset(); 2284d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois { 2294d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // We never generate more that 4 bytes, as IT instructions are only 2304d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // allowed for narrow encodings. 2314d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois ExactAssemblyScope scope(&masm, 4, ExactAssemblyScope::kMaximumSize); 2324d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (kTests[i].in_it_block) { 2334d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois masm.it(kTests[i].it_condition); 2344d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2354d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois (masm.*instruction)(dt, rd, rn, rm); 2364d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2374d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois int32_t end = masm.GetCursorOffset(); 2384d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2394d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois const byte* result_ptr = 2404d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois masm.GetBuffer()->GetOffsetAddress<const byte*>(start); 2414d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois VIXL_ASSERT(start < end); 2424d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois uint32_t result_size = end - start; 2434d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2444d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (Test::generate_test_trace()) { 2454d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // Print the result bytes. 2464d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("const byte kInstruction_%s_%s[] = {\n", 2474d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois mnemonic, 2484d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois kTests[i].identifier); 2494d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois for (uint32_t j = 0; j < result_size; j++) { 2504d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (j == 0) { 2514d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" 0x%02" PRIx8, result_ptr[j]); 2524d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } else { 2534d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(", 0x%02" PRIx8, result_ptr[j]); 2544d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2554d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2564d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // This comment is meant to be used by external tools to validate 2574d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // the encoding. We can parse the comment to figure out what 2584d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // instruction this corresponds to. 2594d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (kTests[i].in_it_block) { 2604d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" // It %s; %s %s\n};\n", 2614d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois kTests[i].it_condition.GetName(), 2624d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois mnemonic, 2634d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois kTests[i].operands_description); 2644d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } else { 2654d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" // %s %s\n};\n", mnemonic, kTests[i].operands_description); 2664d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2674d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } else { 2684d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // Check we've emitted the exact same encoding as present in the 2694d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // trace file. Only print up to `kErrorReportLimit` errors. 2704d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (((result_size != reference[i].size) || 2714d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois (memcmp(result_ptr, reference[i].encoding, reference[i].size) != 2724d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 0)) && 2734d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois (++total_error_count <= kErrorReportLimit)) { 2744d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("Error when testing \"%s\" with operands \"%s\":\n", 2754d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois mnemonic, 2764d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois kTests[i].operands_description); 2774d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" Expected: "); 2784d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois for (uint32_t j = 0; j < reference[i].size; j++) { 2794d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (j == 0) { 2804d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("0x%02" PRIx8, reference[i].encoding[j]); 2814d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } else { 2824d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(", 0x%02" PRIx8, reference[i].encoding[j]); 2834d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2844d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2854d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("\n"); 2864d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" Found: "); 2874d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois for (uint32_t j = 0; j < result_size; j++) { 2884d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (j == 0) { 2894d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("0x%02" PRIx8, result_ptr[j]); 2904d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } else { 2914d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(", 0x%02" PRIx8, result_ptr[j]); 2924d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2934d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2944d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("\n"); 2954d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2964d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2974d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 2984d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 2994d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois masm.FinalizeCode(); 3004d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 3014d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (Test::generate_test_trace()) { 3024d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // Finalize the trace file by writing the final `TestResult` array 3034d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // which links all generated instruction encodings. 3044d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("const TestResult kReference%s[] = {\n", mnemonic); 3054d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois for (unsigned i = 0; i < ARRAY_SIZE(kTests); i++) { 3064d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" {\n"); 3074d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" ARRAY_SIZE(kInstruction_%s_%s),\n", 3084d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois mnemonic, 3094d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois kTests[i].identifier); 3104d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" kInstruction_%s_%s,\n", mnemonic, kTests[i].identifier); 3114d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf(" },\n"); 3124d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 3134d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("};\n"); 3144d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } else { 3154d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois if (total_error_count > kErrorReportLimit) { 3164d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois printf("%u other errors follow.\n", 3174d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois total_error_count - kErrorReportLimit); 3184d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 3194d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois // Crash if the test failed. 3204d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois VIXL_CHECK(total_error_count == 0); 3214d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } 3224d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois} 3234d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 3244d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois// Instantiate tests for each instruction in the list. 3254d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#define TEST(mnemonic) \ 3264d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois void Test_##mnemonic() { \ 3274d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois TestHelper(&MacroAssembler::mnemonic, #mnemonic, kReference##mnemonic); \ 3284d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois } \ 3294d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois Test test_##mnemonic( \ 3304d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois "AARCH32_ASSEMBLER_COND_DT_DRT_DRD_DRN_DRM_FLOAT_NOT_F16_" #mnemonic \ 3314d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois "_T32", \ 3324d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois &Test_##mnemonic); 3334d912ac1b98ffe0638320815636b0b9661a8846cPierre LangloisFOREACH_INSTRUCTION(TEST) 3344d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#undef TEST 3354d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 3364d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois} // namespace 3374d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois#endif 3384d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois 3394d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois} // namespace aarch32 3404d912ac1b98ffe0638320815636b0b9661a8846cPierre Langlois} // namespace vixl 341