1// Copyright 2016, VIXL authors 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are met: 6// 7// * Redistributions of source code must retain the above copyright notice, 8// this list of conditions and the following disclaimer. 9// * Redistributions in binary form must reproduce the above copyright notice, 10// this list of conditions and the following disclaimer in the documentation 11// and/or other materials provided with the distribution. 12// * Neither the name of ARM Limited nor the names of its contributors may be 13// used to endorse or promote products derived from this software without 14// specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 20// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 27 28// ----------------------------------------------------------------------------- 29// This file is auto generated from the 30// test/aarch32/config/template-simulator-aarch32.cc.in template file using 31// tools/generate_tests.py. 32// 33// PLEASE DO NOT EDIT. 34// ----------------------------------------------------------------------------- 35 36 37#include "test-runner.h" 38 39#include "test-utils.h" 40#include "test-utils-aarch32.h" 41 42#include "aarch32/assembler-aarch32.h" 43#include "aarch32/disasm-aarch32.h" 44#include "aarch32/macro-assembler-aarch32.h" 45 46#define __ masm. 47#define BUF_SIZE (4096) 48 49#ifdef VIXL_INCLUDE_SIMULATOR_AARCH32 50// Run tests with the simulator. 51 52#define SETUP() MacroAssembler masm(BUF_SIZE) 53 54#define START() masm.GetBuffer()->Reset() 55 56#define END() \ 57 __ Hlt(0); \ 58 __ FinalizeCode(); 59 60// TODO: Run the tests in the simulator. 61#define RUN() 62 63#else // ifdef VIXL_INCLUDE_SIMULATOR_AARCH32. 64 65#define SETUP() \ 66 MacroAssembler masm(BUF_SIZE); \ 67 UseScratchRegisterScope harness_scratch; 68 69#define START() \ 70 harness_scratch.Open(&masm); \ 71 harness_scratch.ExcludeAll(); \ 72 masm.GetBuffer()->Reset(); \ 73 __ Push(r4); \ 74 __ Push(r5); \ 75 __ Push(r6); \ 76 __ Push(r7); \ 77 __ Push(r8); \ 78 __ Push(r9); \ 79 __ Push(r10); \ 80 __ Push(r11); \ 81 __ Push(lr); \ 82 harness_scratch.Include(ip); 83 84#define END() \ 85 harness_scratch.Exclude(ip); \ 86 __ Pop(lr); \ 87 __ Pop(r11); \ 88 __ Pop(r10); \ 89 __ Pop(r9); \ 90 __ Pop(r8); \ 91 __ Pop(r7); \ 92 __ Pop(r6); \ 93 __ Pop(r5); \ 94 __ Pop(r4); \ 95 __ Bx(lr); \ 96 __ FinalizeCode(); \ 97 harness_scratch.Close(); 98 99#define RUN() \ 100 { \ 101 int pcs_offset = masm.IsUsingT32() ? 1 : 0; \ 102 masm.GetBuffer()->SetExecutable(); \ 103 ExecuteMemory(masm.GetBuffer()->GetStartAddress<byte*>(), \ 104 masm.GetSizeOfCodeGenerated(), \ 105 pcs_offset); \ 106 masm.GetBuffer()->SetWritable(); \ 107 } 108 109#endif // ifdef VIXL_INCLUDE_SIMULATOR_AARCH32 110 111namespace vixl { 112namespace aarch32 { 113 114// List of instruction encodings: 115#define FOREACH_INSTRUCTION(M) \ 116 M(Vadd) \ 117 M(Vsub) 118 119 120// The following definitions are defined again in each generated test, therefore 121// we need to place them in an anomymous namespace. It expresses that they are 122// local to this file only, and the compiler is not allowed to share these types 123// across test files during template instantiation. Specifically, `Operands` and 124// `Inputs` have various layouts across generated tests so they absolutely 125// cannot be shared. 126 127#ifdef VIXL_INCLUDE_TARGET_A32 128namespace { 129 130// Values to be passed to the assembler to produce the instruction under test. 131struct Operands { 132 DataType dt; 133 DRegister rd; 134 DRegister rn; 135 DRegister rm; 136}; 137 138// Input data to feed to the instruction. 139struct Inputs { 140 uint32_t fpscr; 141 uint64_t rd; 142 uint64_t rn; 143 uint64_t rm; 144}; 145 146// This structure contains all input data needed to test one specific encoding. 147// It used to generate a loop over an instruction. 148struct TestLoopData { 149 // The `operands` fields represents the values to pass to the assembler to 150 // produce the instruction. 151 Operands operands; 152 // Description of the operands, used for error reporting. 153 const char* operands_description; 154 // Unique identifier, used for generating traces. 155 const char* identifier; 156 // Array of values to be fed to the instruction. 157 size_t input_size; 158 const Inputs* inputs; 159}; 160 161static const Inputs kFloats[] = 162 {{0x0, 0x3fefffffffffffff, 0x000fffffffffffff, 0xfff0000000000000}, 163 {0x0, 0xffefffffffffffff, 0xbfe0000000000000, 0x3ff0000000000000}, 164 {0x0, 0x7ff0000000000000, 0x3ff0000000000001, 0x0000000000000000}, 165 {0x0, 0xbff0000000000000, 0x4024000000000000, 0x4024000000000000}, 166 {0x0, 0xbff0000000000000, 0x3fdfffffffffffff, 0x0000000000000000}, 167 {0x0, 0x3fefffffffffffff, 0x7fefffffffffffff, 0xfff0000000000000}, 168 {0x0, 0xbfe0000000000000, 0xc024000000000000, 0x7ff123456789abcd}, 169 {0x0, 0x000fffffffffffff, 0x3ff0000000000001, 0xbff0000000000001}, 170 {0x0, 0x0000000000000001, 0x0000000000000000, 0x3fdfffffffffffff}, 171 {0x0, 0x8000000000000000, 0xfff123456789abcd, 0xfff0000000000000}, 172 {0x0, 0xfff923456789abcd, 0xc024000000000000, 0x3ff0000000000000}, 173 {0x0, 0x7ff0000000000000, 0x3ff8000000000000, 0x3fdfffffffffffff}, 174 {0x0, 0x7ff923456789abcd, 0x3ff0000000000001, 0x8000000000000001}, 175 {0x0, 0x0010000000000000, 0x0000000000000001, 0xbff0000000000000}, 176 {0x0, 0x3fefffffffffffff, 0x3fdfffffffffffff, 0xfff0000000000000}, 177 {0x0, 0x3fe0000000000001, 0x800fffffffffffff, 0xfff123456789abcd}, 178 {0x0, 0xffefffffffffffff, 0x3ff0000000000001, 0x800fffffffffffff}, 179 {0x0, 0x0010000000000000, 0xbfe0000000000001, 0xbfe0000000000000}, 180 {0x0, 0xc024000000000000, 0x0000000000000000, 0xbff0000000000000}, 181 {0x0, 0xfff0000000000000, 0x8000000000000001, 0x7ff0000000000000}, 182 {0x0, 0x3fdfffffffffffff, 0xbfdfffffffffffff, 0x3fe0000000000001}, 183 {0x0, 0x4024000000000000, 0x000fffffffffffff, 0x7ff923456789abcd}, 184 {0x0, 0xfff8000000000000, 0xbfe0000000000001, 0x3ff0000000000001}, 185 {0x0, 0x7fefffffffffffff, 0xbfe0000000000001, 0x3ff0000000000000}, 186 {0x0, 0x7fefffffffffffff, 0xbfe0000000000001, 0xfff123456789abcd}, 187 {0x0, 0xfff8000000000000, 0x7ff0000000000000, 0x7fefffffffffffff}, 188 {0x0, 0xbfe0000000000000, 0x7ff123456789abcd, 0x800123456789abcd}, 189 {0x0, 0x3ff0000000000001, 0xffefffffffffffff, 0xfff923456789abcd}, 190 {0x0, 0x3fe0000000000000, 0x0000000000000001, 0x3ff8000000000000}, 191 {0x0, 0x800123456789abcd, 0xbfe0000000000001, 0x8000000000000000}, 192 {0x0, 0xbfe0000000000000, 0x3fe0000000000000, 0x3ff8000000000000}, 193 {0x0, 0x8010000000000000, 0x0010000000000000, 0x8010000000000000}, 194 {0x0, 0x3fe0000000000001, 0x7ff923456789abcd, 0x000123456789abcd}, 195 {0x0, 0x3fe0000000000001, 0x3ff8000000000000, 0xbfe0000000000001}, 196 {0x0, 0xbfefffffffffffff, 0x0000000000000001, 0x0010000000000000}, 197 {0x0, 0xbfefffffffffffff, 0xbfdfffffffffffff, 0xbff8000000000000}, 198 {0x0, 0x0000000000000000, 0x3ff0000000000000, 0x3fe0000000000001}, 199 {0x0, 0xbff0000000000000, 0xffefffffffffffff, 0x3fefffffffffffff}, 200 {0x0, 0x3ff8000000000000, 0x7ff8000000000000, 0x7ff0000000000000}, 201 {0x0, 0x4024000000000000, 0xbfefffffffffffff, 0xfff8000000000000}, 202 {0x0, 0x0000000000000000, 0x000123456789abcd, 0x3fe0000000000000}, 203 {0x0, 0x7fefffffffffffff, 0x3fe0000000000001, 0xfff0000000000000}, 204 {0x0, 0xbfefffffffffffff, 0x000123456789abcd, 0x800fffffffffffff}, 205 {0x0, 0xfff8000000000000, 0x8000000000000001, 0x7fefffffffffffff}, 206 {0x0, 0x3ff8000000000000, 0x3ff0000000000001, 0xfff123456789abcd}, 207 {0x0, 0xbfe0000000000001, 0x0000000000000000, 0xbfefffffffffffff}, 208 {0x0, 0x7fefffffffffffff, 0xfff0000000000000, 0xbff0000000000000}, 209 {0x0, 0x7ff0000000000000, 0x3fe0000000000000, 0x7ff123456789abcd}, 210 {0x0, 0x3ff0000000000000, 0x3ff0000000000000, 0x8000000000000001}, 211 {0x0, 0xbff8000000000000, 0x4024000000000000, 0x3ff8000000000000}, 212 {0x0, 0xfff923456789abcd, 0xbff8000000000000, 0x000fffffffffffff}, 213 {0x0, 0x800123456789abcd, 0x0000000000000001, 0x4024000000000000}, 214 {0x0, 0x0000000000000000, 0xfff923456789abcd, 0x0000000000000000}, 215 {0x0, 0x3ff0000000000000, 0xfff8000000000000, 0xbfefffffffffffff}, 216 {0x0, 0x8000000000000000, 0x0000000000000001, 0x3fefffffffffffff}, 217 {0x0, 0xbff8000000000000, 0xbff0000000000000, 0x7ff8000000000000}, 218 {0x0, 0x3fdfffffffffffff, 0x8000000000000001, 0x3fdfffffffffffff}, 219 {0x0, 0x8010000000000000, 0x0000000000000001, 0x000123456789abcd}, 220 {0x0, 0xbfe0000000000001, 0x000fffffffffffff, 0xbfe0000000000001}, 221 {0x0, 0x7ff8000000000000, 0xbff0000000000001, 0x7ff0000000000000}, 222 {0x0, 0xbfdfffffffffffff, 0x7ff123456789abcd, 0x4024000000000000}, 223 {0x0, 0x3ff8000000000000, 0xbff0000000000000, 0xbfdfffffffffffff}, 224 {0x0, 0x000123456789abcd, 0x3fefffffffffffff, 0x0000000000000000}, 225 {0x0, 0x800fffffffffffff, 0xc024000000000000, 0x0000000000000001}, 226 {0x0, 0xbff8000000000000, 0xbfe0000000000000, 0x8010000000000000}, 227 {0x0, 0x3fdfffffffffffff, 0x000fffffffffffff, 0x3fdfffffffffffff}, 228 {0x0, 0x0010000000000000, 0x800fffffffffffff, 0x3ff0000000000001}, 229 {0x0, 0x3ff8000000000000, 0xfff0000000000000, 0x000fffffffffffff}, 230 {0x0, 0x3fefffffffffffff, 0xbfefffffffffffff, 0x3fe0000000000000}, 231 {0x0, 0x7ff0000000000000, 0xbff0000000000001, 0xbff8000000000000}, 232 {0x0, 0x000fffffffffffff, 0xfff0000000000000, 0xbfe0000000000000}, 233 {0x0, 0x0000000000000000, 0x3fdfffffffffffff, 0x7ff123456789abcd}, 234 {0x0, 0x3ff8000000000000, 0xbff8000000000000, 0x000fffffffffffff}, 235 {0x0, 0x7ff923456789abcd, 0x7ff0000000000000, 0x7ff923456789abcd}, 236 {0x0, 0x000fffffffffffff, 0x000fffffffffffff, 0x3fe0000000000000}, 237 {0x0, 0x7ff923456789abcd, 0xbff0000000000000, 0x8000000000000001}, 238 {0x0, 0x3fe0000000000001, 0x3ff0000000000000, 0x7fefffffffffffff}, 239 {0x0, 0xfff923456789abcd, 0x3fe0000000000000, 0xc024000000000000}, 240 {0x0, 0xbff0000000000000, 0x8010000000000000, 0x000fffffffffffff}, 241 {0x0, 0xbff0000000000001, 0x4024000000000000, 0x7fefffffffffffff}, 242 {0x0, 0xfff0000000000000, 0x0000000000000000, 0xffefffffffffffff}, 243 {0x0, 0xfff8000000000000, 0x3fe0000000000000, 0x800fffffffffffff}, 244 {0x0, 0x000fffffffffffff, 0xbfe0000000000000, 0x7fefffffffffffff}, 245 {0x0, 0x000fffffffffffff, 0xffefffffffffffff, 0x7ff0000000000000}, 246 {0x0, 0xbff0000000000001, 0x3ff0000000000001, 0x7ff123456789abcd}, 247 {0x0, 0xc024000000000000, 0x8000000000000001, 0x3ff8000000000000}, 248 {0x0, 0xbfe0000000000001, 0x8000000000000001, 0xbfdfffffffffffff}, 249 {0x0, 0xfff0000000000000, 0x0000000000000000, 0xfff923456789abcd}, 250 {0x0, 0x3fefffffffffffff, 0xbfdfffffffffffff, 0x8000000000000001}, 251 {0x0, 0x3fe0000000000000, 0xfff123456789abcd, 0xffefffffffffffff}, 252 {0x0, 0x3fefffffffffffff, 0xfff923456789abcd, 0x800123456789abcd}, 253 {0x0, 0x8010000000000000, 0x3ff0000000000000, 0xc024000000000000}, 254 {0x0, 0x7ff123456789abcd, 0x3fe0000000000001, 0x0000000000000001}, 255 {0x0, 0x7ff0000000000000, 0xffefffffffffffff, 0x3fe0000000000001}, 256 {0x0, 0x0010000000000000, 0xfff923456789abcd, 0x000fffffffffffff}, 257 {0x0, 0x4024000000000000, 0x7ff8000000000000, 0x000123456789abcd}, 258 {0x0, 0x8010000000000000, 0x8000000000000001, 0xbfe0000000000000}, 259 {0x0, 0x000fffffffffffff, 0x3ff0000000000000, 0x3ff0000000000001}, 260 {0x0, 0xbff0000000000000, 0x3fe0000000000000, 0xbff0000000000000}, 261 {0x0, 0x3fe0000000000001, 0xbfe0000000000000, 0x7ff0000000000000}}; 262 263static const Inputs kFloatsSameRegisters[] = 264 {{0x0, 0x8000000000000000, 0xbfdfffffffffffff, 0xbfdfffffffffffff}, 265 {0x0, 0xbfe0000000000000, 0xfff0000000000000, 0xfff0000000000000}, 266 {0x0, 0x0000000000000001, 0x3fdfffffffffffff, 0x3fdfffffffffffff}, 267 {0x0, 0xfff8000000000000, 0x8000000000000001, 0x8000000000000001}, 268 {0x0, 0x7ff0000000000000, 0x7ff923456789abcd, 0x7ff923456789abcd}, 269 {0x0, 0x7ff123456789abcd, 0xfff0000000000000, 0xfff0000000000000}, 270 {0x0, 0xbff0000000000001, 0xfff123456789abcd, 0xfff123456789abcd}, 271 {0x0, 0xbfe0000000000001, 0x8000000000000000, 0x8000000000000000}, 272 {0x0, 0xc024000000000000, 0x3fe0000000000001, 0x3fe0000000000001}, 273 {0x0, 0xfff0000000000000, 0x8000000000000001, 0x8000000000000001}, 274 {0x0, 0x800fffffffffffff, 0x7ff8000000000000, 0x7ff8000000000000}, 275 {0x0, 0x800fffffffffffff, 0xfff8000000000000, 0xfff8000000000000}, 276 {0x0, 0xbfe0000000000001, 0x7ff8000000000000, 0x7ff8000000000000}, 277 {0x0, 0x0010000000000000, 0x7fefffffffffffff, 0x7fefffffffffffff}, 278 {0x0, 0xfff0000000000000, 0xbff0000000000000, 0xbff0000000000000}, 279 {0x0, 0xc024000000000000, 0xfff8000000000000, 0xfff8000000000000}, 280 {0x0, 0xbfe0000000000001, 0xbfe0000000000000, 0xbfe0000000000000}, 281 {0x0, 0xbff0000000000001, 0x3ff0000000000000, 0x3ff0000000000000}, 282 {0x0, 0x3fdfffffffffffff, 0xbfe0000000000000, 0xbfe0000000000000}, 283 {0x0, 0xfff923456789abcd, 0xfff123456789abcd, 0xfff123456789abcd}, 284 {0x0, 0x7ff0000000000000, 0x800123456789abcd, 0x800123456789abcd}, 285 {0x0, 0x3ff8000000000000, 0xbfdfffffffffffff, 0xbfdfffffffffffff}, 286 {0x0, 0xffefffffffffffff, 0xbfe0000000000000, 0xbfe0000000000000}, 287 {0x0, 0x800123456789abcd, 0xbff0000000000001, 0xbff0000000000001}, 288 {0x0, 0x0000000000000000, 0x800fffffffffffff, 0x800fffffffffffff}, 289 {0x0, 0xfff0000000000000, 0x3ff8000000000000, 0x3ff8000000000000}, 290 {0x0, 0x7ff0000000000000, 0x7ff0000000000000, 0x7ff0000000000000}, 291 {0x0, 0x0010000000000000, 0xfff923456789abcd, 0xfff923456789abcd}, 292 {0x0, 0x3fefffffffffffff, 0xfff0000000000000, 0xfff0000000000000}, 293 {0x0, 0x000fffffffffffff, 0x7ff0000000000000, 0x7ff0000000000000}, 294 {0x0, 0x000123456789abcd, 0xbfe0000000000001, 0xbfe0000000000001}, 295 {0x0, 0xfff923456789abcd, 0x3fefffffffffffff, 0x3fefffffffffffff}, 296 {0x0, 0x3fdfffffffffffff, 0xbff0000000000001, 0xbff0000000000001}, 297 {0x0, 0x000123456789abcd, 0xbfe0000000000000, 0xbfe0000000000000}, 298 {0x0, 0xfff0000000000000, 0xbfefffffffffffff, 0xbfefffffffffffff}, 299 {0x0, 0xfff8000000000000, 0xfff0000000000000, 0xfff0000000000000}, 300 {0x0, 0x3fe0000000000000, 0xbfdfffffffffffff, 0xbfdfffffffffffff}, 301 {0x0, 0x0010000000000000, 0xfff0000000000000, 0xfff0000000000000}, 302 {0x0, 0xfff123456789abcd, 0x3fe0000000000000, 0x3fe0000000000000}, 303 {0x0, 0x3fe0000000000000, 0xfff0000000000000, 0xfff0000000000000}, 304 {0x0, 0x3fdfffffffffffff, 0xbff8000000000000, 0xbff8000000000000}, 305 {0x0, 0xbff0000000000001, 0x3fefffffffffffff, 0x3fefffffffffffff}, 306 {0x0, 0x0000000000000000, 0x7ff0000000000000, 0x7ff0000000000000}, 307 {0x0, 0x7ff0000000000000, 0xffefffffffffffff, 0xffefffffffffffff}, 308 {0x0, 0x000123456789abcd, 0x3fdfffffffffffff, 0x3fdfffffffffffff}, 309 {0x0, 0xc024000000000000, 0x4024000000000000, 0x4024000000000000}, 310 {0x0, 0x3fefffffffffffff, 0xbfdfffffffffffff, 0xbfdfffffffffffff}, 311 {0x0, 0x0010000000000000, 0x7ff8000000000000, 0x7ff8000000000000}, 312 {0x0, 0x3fe0000000000001, 0x7ff8000000000000, 0x7ff8000000000000}, 313 {0x0, 0x8000000000000000, 0x7fefffffffffffff, 0x7fefffffffffffff}, 314 {0x0, 0x7ff123456789abcd, 0xfff0000000000000, 0xfff0000000000000}, 315 {0x0, 0x7ff0000000000000, 0x000fffffffffffff, 0x000fffffffffffff}, 316 {0x0, 0x7ff923456789abcd, 0xbff8000000000000, 0xbff8000000000000}, 317 {0x0, 0x7ff0000000000000, 0xbfefffffffffffff, 0xbfefffffffffffff}, 318 {0x0, 0xfff123456789abcd, 0x3ff0000000000000, 0x3ff0000000000000}, 319 {0x0, 0xfff923456789abcd, 0x3ff0000000000001, 0x3ff0000000000001}, 320 {0x0, 0xc024000000000000, 0xfff123456789abcd, 0xfff123456789abcd}, 321 {0x0, 0xbfe0000000000001, 0x8010000000000000, 0x8010000000000000}, 322 {0x0, 0xfff923456789abcd, 0xbfdfffffffffffff, 0xbfdfffffffffffff}, 323 {0x0, 0x8010000000000000, 0x3fe0000000000000, 0x3fe0000000000000}, 324 {0x0, 0xfff123456789abcd, 0x3ff8000000000000, 0x3ff8000000000000}, 325 {0x0, 0x800fffffffffffff, 0x000fffffffffffff, 0x000fffffffffffff}, 326 {0x0, 0xffefffffffffffff, 0xfff0000000000000, 0xfff0000000000000}, 327 {0x0, 0x4024000000000000, 0xbfe0000000000001, 0xbfe0000000000001}, 328 {0x0, 0xfff0000000000000, 0xfff923456789abcd, 0xfff923456789abcd}, 329 {0x0, 0x7ff123456789abcd, 0xfff0000000000000, 0xfff0000000000000}, 330 {0x0, 0x8000000000000000, 0x7ff123456789abcd, 0x7ff123456789abcd}, 331 {0x0, 0x0000000000000001, 0xc024000000000000, 0xc024000000000000}, 332 {0x0, 0x0010000000000000, 0x7ff0000000000000, 0x7ff0000000000000}, 333 {0x0, 0x3fe0000000000000, 0xbff0000000000000, 0xbff0000000000000}, 334 {0x0, 0xbfdfffffffffffff, 0x8010000000000000, 0x8010000000000000}, 335 {0x0, 0xbff8000000000000, 0x3fe0000000000001, 0x3fe0000000000001}, 336 {0x0, 0xffefffffffffffff, 0x8000000000000000, 0x8000000000000000}, 337 {0x0, 0x3fe0000000000000, 0x7ff8000000000000, 0x7ff8000000000000}, 338 {0x0, 0xbff0000000000001, 0xbff8000000000000, 0xbff8000000000000}, 339 {0x0, 0xbfe0000000000000, 0xbfe0000000000001, 0xbfe0000000000001}, 340 {0x0, 0xc024000000000000, 0x7ff0000000000000, 0x7ff0000000000000}, 341 {0x0, 0x8000000000000001, 0x7fefffffffffffff, 0x7fefffffffffffff}, 342 {0x0, 0x7ff923456789abcd, 0xfff0000000000000, 0xfff0000000000000}, 343 {0x0, 0x8010000000000000, 0x7ff0000000000000, 0x7ff0000000000000}, 344 {0x0, 0xc024000000000000, 0x800123456789abcd, 0x800123456789abcd}, 345 {0x0, 0x7ff0000000000000, 0xc024000000000000, 0xc024000000000000}, 346 {0x0, 0x4024000000000000, 0x0010000000000000, 0x0010000000000000}, 347 {0x0, 0x3ff0000000000000, 0x7ff0000000000000, 0x7ff0000000000000}, 348 {0x0, 0xbfe0000000000001, 0xc024000000000000, 0xc024000000000000}, 349 {0x0, 0xbfdfffffffffffff, 0x7ff0000000000000, 0x7ff0000000000000}, 350 {0x0, 0x000123456789abcd, 0xfff8000000000000, 0xfff8000000000000}, 351 {0x0, 0xbff0000000000001, 0x000123456789abcd, 0x000123456789abcd}, 352 {0x0, 0x0000000000000000, 0x7ff123456789abcd, 0x7ff123456789abcd}, 353 {0x0, 0x3ff0000000000001, 0x7ff8000000000000, 0x7ff8000000000000}, 354 {0x0, 0x3fe0000000000001, 0x3ff0000000000001, 0x3ff0000000000001}, 355 {0x0, 0x3ff0000000000001, 0x000123456789abcd, 0x000123456789abcd}, 356 {0x0, 0x3ff8000000000000, 0x8010000000000000, 0x8010000000000000}, 357 {0x0, 0x8000000000000000, 0x800fffffffffffff, 0x800fffffffffffff}, 358 {0x0, 0x7ff8000000000000, 0x7ff0000000000000, 0x7ff0000000000000}, 359 {0x0, 0xbff0000000000000, 0xfff8000000000000, 0xfff8000000000000}, 360 {0x0, 0x000fffffffffffff, 0xbff8000000000000, 0xbff8000000000000}, 361 {0x0, 0x7ff123456789abcd, 0x8010000000000000, 0x8010000000000000}, 362 {0x0, 0x8000000000000000, 0x3fefffffffffffff, 0x3fefffffffffffff}, 363 {0x0, 0xbfe0000000000000, 0x7ff0000000000000, 0x7ff0000000000000}}; 364 365 366// A loop will be generated for each element of this array. 367const TestLoopData kTests[] = {{{F64, d3, d31, d11}, 368 "F64 d3 d31 d11", 369 "Floats_F64_d3_d31_d11", 370 ARRAY_SIZE(kFloats), 371 kFloats}, 372 {{F64, d21, d17, d0}, 373 "F64 d21 d17 d0", 374 "Floats_F64_d21_d17_d0", 375 ARRAY_SIZE(kFloats), 376 kFloats}, 377 {{F64, d8, d4, d16}, 378 "F64 d8 d4 d16", 379 "Floats_F64_d8_d4_d16", 380 ARRAY_SIZE(kFloats), 381 kFloats}, 382 {{F64, d18, d11, d29}, 383 "F64 d18 d11 d29", 384 "Floats_F64_d18_d11_d29", 385 ARRAY_SIZE(kFloats), 386 kFloats}, 387 {{F64, d18, d7, d16}, 388 "F64 d18 d7 d16", 389 "Floats_F64_d18_d7_d16", 390 ARRAY_SIZE(kFloats), 391 kFloats}, 392 {{F64, d31, d28, d30}, 393 "F64 d31 d28 d30", 394 "Floats_F64_d31_d28_d30", 395 ARRAY_SIZE(kFloats), 396 kFloats}, 397 {{F64, d3, d27, d4}, 398 "F64 d3 d27 d4", 399 "Floats_F64_d3_d27_d4", 400 ARRAY_SIZE(kFloats), 401 kFloats}, 402 {{F64, d16, d17, d25}, 403 "F64 d16 d17 d25", 404 "Floats_F64_d16_d17_d25", 405 ARRAY_SIZE(kFloats), 406 kFloats}, 407 {{F64, d12, d16, d21}, 408 "F64 d12 d16 d21", 409 "Floats_F64_d12_d16_d21", 410 ARRAY_SIZE(kFloats), 411 kFloats}, 412 {{F64, d13, d3, d9}, 413 "F64 d13 d3 d9", 414 "Floats_F64_d13_d3_d9", 415 ARRAY_SIZE(kFloats), 416 kFloats}, 417 {{F64, d14, d15, d9}, 418 "F64 d14 d15 d9", 419 "Floats_F64_d14_d15_d9", 420 ARRAY_SIZE(kFloats), 421 kFloats}, 422 {{F64, d23, d3, d9}, 423 "F64 d23 d3 d9", 424 "Floats_F64_d23_d3_d9", 425 ARRAY_SIZE(kFloats), 426 kFloats}, 427 {{F64, d8, d5, d4}, 428 "F64 d8 d5 d4", 429 "Floats_F64_d8_d5_d4", 430 ARRAY_SIZE(kFloats), 431 kFloats}, 432 {{F64, d28, d10, d8}, 433 "F64 d28 d10 d8", 434 "Floats_F64_d28_d10_d8", 435 ARRAY_SIZE(kFloats), 436 kFloats}, 437 {{F64, d8, d28, d11}, 438 "F64 d8 d28 d11", 439 "Floats_F64_d8_d28_d11", 440 ARRAY_SIZE(kFloats), 441 kFloats}, 442 {{F64, d1, d2, d23}, 443 "F64 d1 d2 d23", 444 "Floats_F64_d1_d2_d23", 445 ARRAY_SIZE(kFloats), 446 kFloats}, 447 {{F64, d27, d26, d30}, 448 "F64 d27 d26 d30", 449 "Floats_F64_d27_d26_d30", 450 ARRAY_SIZE(kFloats), 451 kFloats}, 452 {{F64, d3, d22, d7}, 453 "F64 d3 d22 d7", 454 "Floats_F64_d3_d22_d7", 455 ARRAY_SIZE(kFloats), 456 kFloats}, 457 {{F64, d3, d19, d24}, 458 "F64 d3 d19 d24", 459 "Floats_F64_d3_d19_d24", 460 ARRAY_SIZE(kFloats), 461 kFloats}, 462 {{F64, d27, d30, d22}, 463 "F64 d27 d30 d22", 464 "Floats_F64_d27_d30_d22", 465 ARRAY_SIZE(kFloats), 466 kFloats}, 467 {{F64, d27, d25, d7}, 468 "F64 d27 d25 d7", 469 "Floats_F64_d27_d25_d7", 470 ARRAY_SIZE(kFloats), 471 kFloats}, 472 {{F64, d21, d8, d10}, 473 "F64 d21 d8 d10", 474 "Floats_F64_d21_d8_d10", 475 ARRAY_SIZE(kFloats), 476 kFloats}, 477 {{F64, d28, d17, d14}, 478 "F64 d28 d17 d14", 479 "Floats_F64_d28_d17_d14", 480 ARRAY_SIZE(kFloats), 481 kFloats}, 482 {{F64, d1, d5, d24}, 483 "F64 d1 d5 d24", 484 "Floats_F64_d1_d5_d24", 485 ARRAY_SIZE(kFloats), 486 kFloats}, 487 {{F64, d20, d12, d17}, 488 "F64 d20 d12 d17", 489 "Floats_F64_d20_d12_d17", 490 ARRAY_SIZE(kFloats), 491 kFloats}, 492 {{F64, d30, d29, d10}, 493 "F64 d30 d29 d10", 494 "Floats_F64_d30_d29_d10", 495 ARRAY_SIZE(kFloats), 496 kFloats}, 497 {{F64, d25, d14, d25}, 498 "F64 d25 d14 d25", 499 "Floats_F64_d25_d14_d25", 500 ARRAY_SIZE(kFloats), 501 kFloats}, 502 {{F64, d1, d27, d16}, 503 "F64 d1 d27 d16", 504 "Floats_F64_d1_d27_d16", 505 ARRAY_SIZE(kFloats), 506 kFloats}, 507 {{F64, d6, d28, d7}, 508 "F64 d6 d28 d7", 509 "Floats_F64_d6_d28_d7", 510 ARRAY_SIZE(kFloats), 511 kFloats}, 512 {{F64, d23, d23, d15}, 513 "F64 d23 d23 d15", 514 "Floats_F64_d23_d23_d15", 515 ARRAY_SIZE(kFloats), 516 kFloats}, 517 {{F64, d7, d23, d3}, 518 "F64 d7 d23 d3", 519 "Floats_F64_d7_d23_d3", 520 ARRAY_SIZE(kFloats), 521 kFloats}, 522 {{F64, d7, d23, d16}, 523 "F64 d7 d23 d16", 524 "Floats_F64_d7_d23_d16", 525 ARRAY_SIZE(kFloats), 526 kFloats}, 527 {{F64, d23, d18, d21}, 528 "F64 d23 d18 d21", 529 "Floats_F64_d23_d18_d21", 530 ARRAY_SIZE(kFloats), 531 kFloats}, 532 {{F64, d16, d9, d17}, 533 "F64 d16 d9 d17", 534 "Floats_F64_d16_d9_d17", 535 ARRAY_SIZE(kFloats), 536 kFloats}, 537 {{F64, d5, d21, d9}, 538 "F64 d5 d21 d9", 539 "Floats_F64_d5_d21_d9", 540 ARRAY_SIZE(kFloats), 541 kFloats}, 542 {{F64, d28, d15, d11}, 543 "F64 d28 d15 d11", 544 "Floats_F64_d28_d15_d11", 545 ARRAY_SIZE(kFloats), 546 kFloats}, 547 {{F64, d2, d17, d1}, 548 "F64 d2 d17 d1", 549 "Floats_F64_d2_d17_d1", 550 ARRAY_SIZE(kFloats), 551 kFloats}, 552 {{F64, d25, d29, d17}, 553 "F64 d25 d29 d17", 554 "Floats_F64_d25_d29_d17", 555 ARRAY_SIZE(kFloats), 556 kFloats}, 557 {{F64, d16, d2, d12}, 558 "F64 d16 d2 d12", 559 "Floats_F64_d16_d2_d12", 560 ARRAY_SIZE(kFloats), 561 kFloats}, 562 {{F64, d14, d18, d24}, 563 "F64 d14 d18 d24", 564 "Floats_F64_d14_d18_d24", 565 ARRAY_SIZE(kFloats), 566 kFloats}, 567 {{F64, d3, d4, d25}, 568 "F64 d3 d4 d25", 569 "Floats_F64_d3_d4_d25", 570 ARRAY_SIZE(kFloats), 571 kFloats}, 572 {{F64, d29, d10, d21}, 573 "F64 d29 d10 d21", 574 "Floats_F64_d29_d10_d21", 575 ARRAY_SIZE(kFloats), 576 kFloats}, 577 {{F64, d29, d27, d24}, 578 "F64 d29 d27 d24", 579 "Floats_F64_d29_d27_d24", 580 ARRAY_SIZE(kFloats), 581 kFloats}, 582 {{F64, d30, d19, d23}, 583 "F64 d30 d19 d23", 584 "Floats_F64_d30_d19_d23", 585 ARRAY_SIZE(kFloats), 586 kFloats}, 587 {{F64, d3, d2, d14}, 588 "F64 d3 d2 d14", 589 "Floats_F64_d3_d2_d14", 590 ARRAY_SIZE(kFloats), 591 kFloats}, 592 {{F64, d17, d26, d0}, 593 "F64 d17 d26 d0", 594 "Floats_F64_d17_d26_d0", 595 ARRAY_SIZE(kFloats), 596 kFloats}, 597 {{F64, d17, d28, d8}, 598 "F64 d17 d28 d8", 599 "Floats_F64_d17_d28_d8", 600 ARRAY_SIZE(kFloats), 601 kFloats}, 602 {{F64, d0, d3, d24}, 603 "F64 d0 d3 d24", 604 "Floats_F64_d0_d3_d24", 605 ARRAY_SIZE(kFloats), 606 kFloats}, 607 {{F64, d30, d16, d21}, 608 "F64 d30 d16 d21", 609 "Floats_F64_d30_d16_d21", 610 ARRAY_SIZE(kFloats), 611 kFloats}, 612 {{F64, d18, d24, d3}, 613 "F64 d18 d24 d3", 614 "Floats_F64_d18_d24_d3", 615 ARRAY_SIZE(kFloats), 616 kFloats}, 617 {{F64, d6, d2, d15}, 618 "F64 d6 d2 d15", 619 "Floats_F64_d6_d2_d15", 620 ARRAY_SIZE(kFloats), 621 kFloats}, 622 {{F64, d7, d0, d27}, 623 "F64 d7 d0 d27", 624 "Floats_F64_d7_d0_d27", 625 ARRAY_SIZE(kFloats), 626 kFloats}, 627 {{F64, d0, d9, d27}, 628 "F64 d0 d9 d27", 629 "Floats_F64_d0_d9_d27", 630 ARRAY_SIZE(kFloats), 631 kFloats}, 632 {{F64, d7, d11, d27}, 633 "F64 d7 d11 d27", 634 "Floats_F64_d7_d11_d27", 635 ARRAY_SIZE(kFloats), 636 kFloats}, 637 {{F64, d17, d25, d11}, 638 "F64 d17 d25 d11", 639 "Floats_F64_d17_d25_d11", 640 ARRAY_SIZE(kFloats), 641 kFloats}, 642 {{F64, d31, d9, d22}, 643 "F64 d31 d9 d22", 644 "Floats_F64_d31_d9_d22", 645 ARRAY_SIZE(kFloats), 646 kFloats}, 647 {{F64, d24, d0, d5}, 648 "F64 d24 d0 d5", 649 "Floats_F64_d24_d0_d5", 650 ARRAY_SIZE(kFloats), 651 kFloats}, 652 {{F64, d5, d31, d4}, 653 "F64 d5 d31 d4", 654 "Floats_F64_d5_d31_d4", 655 ARRAY_SIZE(kFloats), 656 kFloats}, 657 {{F64, d16, d24, d2}, 658 "F64 d16 d24 d2", 659 "Floats_F64_d16_d24_d2", 660 ARRAY_SIZE(kFloats), 661 kFloats}, 662 {{F64, d7, d30, d4}, 663 "F64 d7 d30 d4", 664 "Floats_F64_d7_d30_d4", 665 ARRAY_SIZE(kFloats), 666 kFloats}, 667 {{F64, d31, d4, d28}, 668 "F64 d31 d4 d28", 669 "Floats_F64_d31_d4_d28", 670 ARRAY_SIZE(kFloats), 671 kFloats}, 672 {{F64, d10, d31, d13}, 673 "F64 d10 d31 d13", 674 "Floats_F64_d10_d31_d13", 675 ARRAY_SIZE(kFloats), 676 kFloats}, 677 {{F64, d28, d14, d1}, 678 "F64 d28 d14 d1", 679 "Floats_F64_d28_d14_d1", 680 ARRAY_SIZE(kFloats), 681 kFloats}, 682 {{F64, d4, d16, d0}, 683 "F64 d4 d16 d0", 684 "Floats_F64_d4_d16_d0", 685 ARRAY_SIZE(kFloats), 686 kFloats}, 687 {{F64, d19, d26, d15}, 688 "F64 d19 d26 d15", 689 "Floats_F64_d19_d26_d15", 690 ARRAY_SIZE(kFloats), 691 kFloats}, 692 {{F64, d23, d2, d26}, 693 "F64 d23 d2 d26", 694 "Floats_F64_d23_d2_d26", 695 ARRAY_SIZE(kFloats), 696 kFloats}, 697 {{F64, d25, d26, d10}, 698 "F64 d25 d26 d10", 699 "Floats_F64_d25_d26_d10", 700 ARRAY_SIZE(kFloats), 701 kFloats}, 702 {{F64, d0, d19, d0}, 703 "F64 d0 d19 d0", 704 "Floats_F64_d0_d19_d0", 705 ARRAY_SIZE(kFloats), 706 kFloats}, 707 {{F64, d4, d31, d23}, 708 "F64 d4 d31 d23", 709 "Floats_F64_d4_d31_d23", 710 ARRAY_SIZE(kFloats), 711 kFloats}, 712 {{F64, d30, d1, d23}, 713 "F64 d30 d1 d23", 714 "Floats_F64_d30_d1_d23", 715 ARRAY_SIZE(kFloats), 716 kFloats}, 717 {{F64, d14, d5, d20}, 718 "F64 d14 d5 d20", 719 "Floats_F64_d14_d5_d20", 720 ARRAY_SIZE(kFloats), 721 kFloats}, 722 {{F64, d20, d4, d12}, 723 "F64 d20 d4 d12", 724 "Floats_F64_d20_d4_d12", 725 ARRAY_SIZE(kFloats), 726 kFloats}, 727 {{F64, d2, d5, d10}, 728 "F64 d2 d5 d10", 729 "Floats_F64_d2_d5_d10", 730 ARRAY_SIZE(kFloats), 731 kFloats}, 732 {{F64, d14, d29, d3}, 733 "F64 d14 d29 d3", 734 "Floats_F64_d14_d29_d3", 735 ARRAY_SIZE(kFloats), 736 kFloats}, 737 {{F64, d17, d2, d15}, 738 "F64 d17 d2 d15", 739 "Floats_F64_d17_d2_d15", 740 ARRAY_SIZE(kFloats), 741 kFloats}, 742 {{F64, d9, d30, d29}, 743 "F64 d9 d30 d29", 744 "Floats_F64_d9_d30_d29", 745 ARRAY_SIZE(kFloats), 746 kFloats}, 747 {{F64, d30, d12, d30}, 748 "F64 d30 d12 d30", 749 "Floats_F64_d30_d12_d30", 750 ARRAY_SIZE(kFloats), 751 kFloats}, 752 {{F64, d28, d13, d21}, 753 "F64 d28 d13 d21", 754 "Floats_F64_d28_d13_d21", 755 ARRAY_SIZE(kFloats), 756 kFloats}, 757 {{F64, d15, d17, d26}, 758 "F64 d15 d17 d26", 759 "Floats_F64_d15_d17_d26", 760 ARRAY_SIZE(kFloats), 761 kFloats}, 762 {{F64, d30, d18, d9}, 763 "F64 d30 d18 d9", 764 "Floats_F64_d30_d18_d9", 765 ARRAY_SIZE(kFloats), 766 kFloats}, 767 {{F64, d6, d9, d31}, 768 "F64 d6 d9 d31", 769 "Floats_F64_d6_d9_d31", 770 ARRAY_SIZE(kFloats), 771 kFloats}, 772 {{F64, d11, d23, d22}, 773 "F64 d11 d23 d22", 774 "Floats_F64_d11_d23_d22", 775 ARRAY_SIZE(kFloats), 776 kFloats}, 777 {{F64, d26, d23, d29}, 778 "F64 d26 d23 d29", 779 "Floats_F64_d26_d23_d29", 780 ARRAY_SIZE(kFloats), 781 kFloats}, 782 {{F64, d20, d2, d21}, 783 "F64 d20 d2 d21", 784 "Floats_F64_d20_d2_d21", 785 ARRAY_SIZE(kFloats), 786 kFloats}, 787 {{F64, d1, d25, d1}, 788 "F64 d1 d25 d1", 789 "Floats_F64_d1_d25_d1", 790 ARRAY_SIZE(kFloats), 791 kFloats}, 792 {{F64, d1, d13, d15}, 793 "F64 d1 d13 d15", 794 "Floats_F64_d1_d13_d15", 795 ARRAY_SIZE(kFloats), 796 kFloats}, 797 {{F64, d6, d15, d13}, 798 "F64 d6 d15 d13", 799 "Floats_F64_d6_d15_d13", 800 ARRAY_SIZE(kFloats), 801 kFloats}, 802 {{F64, d4, d3, d7}, 803 "F64 d4 d3 d7", 804 "Floats_F64_d4_d3_d7", 805 ARRAY_SIZE(kFloats), 806 kFloats}, 807 {{F64, d8, d16, d18}, 808 "F64 d8 d16 d18", 809 "Floats_F64_d8_d16_d18", 810 ARRAY_SIZE(kFloats), 811 kFloats}, 812 {{F64, d12, d30, d21}, 813 "F64 d12 d30 d21", 814 "Floats_F64_d12_d30_d21", 815 ARRAY_SIZE(kFloats), 816 kFloats}, 817 {{F64, d0, d1, d15}, 818 "F64 d0 d1 d15", 819 "Floats_F64_d0_d1_d15", 820 ARRAY_SIZE(kFloats), 821 kFloats}, 822 {{F64, d6, d11, d4}, 823 "F64 d6 d11 d4", 824 "Floats_F64_d6_d11_d4", 825 ARRAY_SIZE(kFloats), 826 kFloats}, 827 {{F64, d8, d30, d13}, 828 "F64 d8 d30 d13", 829 "Floats_F64_d8_d30_d13", 830 ARRAY_SIZE(kFloats), 831 kFloats}, 832 {{F64, d12, d22, d12}, 833 "F64 d12 d22 d12", 834 "Floats_F64_d12_d22_d12", 835 ARRAY_SIZE(kFloats), 836 kFloats}, 837 {{F64, d9, d7, d13}, 838 "F64 d9 d7 d13", 839 "Floats_F64_d9_d7_d13", 840 ARRAY_SIZE(kFloats), 841 kFloats}, 842 {{F64, d3, d1, d0}, 843 "F64 d3 d1 d0", 844 "Floats_F64_d3_d1_d0", 845 ARRAY_SIZE(kFloats), 846 kFloats}, 847 {{F64, d28, d22, d20}, 848 "F64 d28 d22 d20", 849 "Floats_F64_d28_d22_d20", 850 ARRAY_SIZE(kFloats), 851 kFloats}, 852 {{F64, d22, d20, d9}, 853 "F64 d22 d20 d9", 854 "Floats_F64_d22_d20_d9", 855 ARRAY_SIZE(kFloats), 856 kFloats}, 857 {{F64, d18, d18, d25}, 858 "F64 d18 d18 d25", 859 "Floats_F64_d18_d18_d25", 860 ARRAY_SIZE(kFloats), 861 kFloats}, 862 {{F64, d19, d3, d8}, 863 "F64 d19 d3 d8", 864 "Floats_F64_d19_d3_d8", 865 ARRAY_SIZE(kFloats), 866 kFloats}, 867 {{F64, d25, d21, d21}, 868 "F64 d25 d21 d21", 869 "FloatsSameRegisters_F64_d25_d21_d21", 870 ARRAY_SIZE(kFloatsSameRegisters), 871 kFloatsSameRegisters}, 872 {{F64, d31, d4, d4}, 873 "F64 d31 d4 d4", 874 "FloatsSameRegisters_F64_d31_d4_d4", 875 ARRAY_SIZE(kFloatsSameRegisters), 876 kFloatsSameRegisters}, 877 {{F64, d14, d30, d30}, 878 "F64 d14 d30 d30", 879 "FloatsSameRegisters_F64_d14_d30_d30", 880 ARRAY_SIZE(kFloatsSameRegisters), 881 kFloatsSameRegisters}, 882 {{F64, d11, d27, d27}, 883 "F64 d11 d27 d27", 884 "FloatsSameRegisters_F64_d11_d27_d27", 885 ARRAY_SIZE(kFloatsSameRegisters), 886 kFloatsSameRegisters}, 887 {{F64, d21, d20, d20}, 888 "F64 d21 d20 d20", 889 "FloatsSameRegisters_F64_d21_d20_d20", 890 ARRAY_SIZE(kFloatsSameRegisters), 891 kFloatsSameRegisters}, 892 {{F64, d26, d14, d14}, 893 "F64 d26 d14 d14", 894 "FloatsSameRegisters_F64_d26_d14_d14", 895 ARRAY_SIZE(kFloatsSameRegisters), 896 kFloatsSameRegisters}, 897 {{F64, d10, d1, d1}, 898 "F64 d10 d1 d1", 899 "FloatsSameRegisters_F64_d10_d1_d1", 900 ARRAY_SIZE(kFloatsSameRegisters), 901 kFloatsSameRegisters}, 902 {{F64, d9, d24, d24}, 903 "F64 d9 d24 d24", 904 "FloatsSameRegisters_F64_d9_d24_d24", 905 ARRAY_SIZE(kFloatsSameRegisters), 906 kFloatsSameRegisters}, 907 {{F64, d17, d20, d20}, 908 "F64 d17 d20 d20", 909 "FloatsSameRegisters_F64_d17_d20_d20", 910 ARRAY_SIZE(kFloatsSameRegisters), 911 kFloatsSameRegisters}, 912 {{F64, d15, d13, d13}, 913 "F64 d15 d13 d13", 914 "FloatsSameRegisters_F64_d15_d13_d13", 915 ARRAY_SIZE(kFloatsSameRegisters), 916 kFloatsSameRegisters}, 917 {{F64, d18, d14, d14}, 918 "F64 d18 d14 d14", 919 "FloatsSameRegisters_F64_d18_d14_d14", 920 ARRAY_SIZE(kFloatsSameRegisters), 921 kFloatsSameRegisters}, 922 {{F64, d20, d10, d10}, 923 "F64 d20 d10 d10", 924 "FloatsSameRegisters_F64_d20_d10_d10", 925 ARRAY_SIZE(kFloatsSameRegisters), 926 kFloatsSameRegisters}, 927 {{F64, d23, d27, d27}, 928 "F64 d23 d27 d27", 929 "FloatsSameRegisters_F64_d23_d27_d27", 930 ARRAY_SIZE(kFloatsSameRegisters), 931 kFloatsSameRegisters}, 932 {{F64, d25, d26, d26}, 933 "F64 d25 d26 d26", 934 "FloatsSameRegisters_F64_d25_d26_d26", 935 ARRAY_SIZE(kFloatsSameRegisters), 936 kFloatsSameRegisters}, 937 {{F64, d24, d5, d5}, 938 "F64 d24 d5 d5", 939 "FloatsSameRegisters_F64_d24_d5_d5", 940 ARRAY_SIZE(kFloatsSameRegisters), 941 kFloatsSameRegisters}, 942 {{F64, d15, d10, d10}, 943 "F64 d15 d10 d10", 944 "FloatsSameRegisters_F64_d15_d10_d10", 945 ARRAY_SIZE(kFloatsSameRegisters), 946 kFloatsSameRegisters}, 947 {{F64, d0, d26, d26}, 948 "F64 d0 d26 d26", 949 "FloatsSameRegisters_F64_d0_d26_d26", 950 ARRAY_SIZE(kFloatsSameRegisters), 951 kFloatsSameRegisters}, 952 {{F64, d22, d23, d23}, 953 "F64 d22 d23 d23", 954 "FloatsSameRegisters_F64_d22_d23_d23", 955 ARRAY_SIZE(kFloatsSameRegisters), 956 kFloatsSameRegisters}, 957 {{F64, d18, d29, d29}, 958 "F64 d18 d29 d29", 959 "FloatsSameRegisters_F64_d18_d29_d29", 960 ARRAY_SIZE(kFloatsSameRegisters), 961 kFloatsSameRegisters}, 962 {{F64, d27, d25, d25}, 963 "F64 d27 d25 d25", 964 "FloatsSameRegisters_F64_d27_d25_d25", 965 ARRAY_SIZE(kFloatsSameRegisters), 966 kFloatsSameRegisters}, 967 {{F64, d15, d15, d15}, 968 "F64 d15 d15 d15", 969 "FloatsSameRegisters_F64_d15_d15_d15", 970 ARRAY_SIZE(kFloatsSameRegisters), 971 kFloatsSameRegisters}, 972 {{F64, d17, d5, d5}, 973 "F64 d17 d5 d5", 974 "FloatsSameRegisters_F64_d17_d5_d5", 975 ARRAY_SIZE(kFloatsSameRegisters), 976 kFloatsSameRegisters}, 977 {{F64, d1, d22, d22}, 978 "F64 d1 d22 d22", 979 "FloatsSameRegisters_F64_d1_d22_d22", 980 ARRAY_SIZE(kFloatsSameRegisters), 981 kFloatsSameRegisters}, 982 {{F64, d20, d29, d29}, 983 "F64 d20 d29 d29", 984 "FloatsSameRegisters_F64_d20_d29_d29", 985 ARRAY_SIZE(kFloatsSameRegisters), 986 kFloatsSameRegisters}, 987 {{F64, d7, d26, d26}, 988 "F64 d7 d26 d26", 989 "FloatsSameRegisters_F64_d7_d26_d26", 990 ARRAY_SIZE(kFloatsSameRegisters), 991 kFloatsSameRegisters}, 992 {{F64, d5, d19, d19}, 993 "F64 d5 d19 d19", 994 "FloatsSameRegisters_F64_d5_d19_d19", 995 ARRAY_SIZE(kFloatsSameRegisters), 996 kFloatsSameRegisters}, 997 {{F64, d19, d13, d13}, 998 "F64 d19 d13 d13", 999 "FloatsSameRegisters_F64_d19_d13_d13", 1000 ARRAY_SIZE(kFloatsSameRegisters), 1001 kFloatsSameRegisters}, 1002 {{F64, d23, d13, d13}, 1003 "F64 d23 d13 d13", 1004 "FloatsSameRegisters_F64_d23_d13_d13", 1005 ARRAY_SIZE(kFloatsSameRegisters), 1006 kFloatsSameRegisters}, 1007 {{F64, d0, d20, d20}, 1008 "F64 d0 d20 d20", 1009 "FloatsSameRegisters_F64_d0_d20_d20", 1010 ARRAY_SIZE(kFloatsSameRegisters), 1011 kFloatsSameRegisters}, 1012 {{F64, d19, d26, d26}, 1013 "F64 d19 d26 d26", 1014 "FloatsSameRegisters_F64_d19_d26_d26", 1015 ARRAY_SIZE(kFloatsSameRegisters), 1016 kFloatsSameRegisters}, 1017 {{F64, d7, d15, d15}, 1018 "F64 d7 d15 d15", 1019 "FloatsSameRegisters_F64_d7_d15_d15", 1020 ARRAY_SIZE(kFloatsSameRegisters), 1021 kFloatsSameRegisters}, 1022 {{F64, d1, d6, d6}, 1023 "F64 d1 d6 d6", 1024 "FloatsSameRegisters_F64_d1_d6_d6", 1025 ARRAY_SIZE(kFloatsSameRegisters), 1026 kFloatsSameRegisters}, 1027 {{F64, d3, d25, d25}, 1028 "F64 d3 d25 d25", 1029 "FloatsSameRegisters_F64_d3_d25_d25", 1030 ARRAY_SIZE(kFloatsSameRegisters), 1031 kFloatsSameRegisters}, 1032 {{F64, d11, d11, d11}, 1033 "F64 d11 d11 d11", 1034 "FloatsSameRegisters_F64_d11_d11_d11", 1035 ARRAY_SIZE(kFloatsSameRegisters), 1036 kFloatsSameRegisters}, 1037 {{F64, d10, d28, d28}, 1038 "F64 d10 d28 d28", 1039 "FloatsSameRegisters_F64_d10_d28_d28", 1040 ARRAY_SIZE(kFloatsSameRegisters), 1041 kFloatsSameRegisters}, 1042 {{F64, d20, d13, d13}, 1043 "F64 d20 d13 d13", 1044 "FloatsSameRegisters_F64_d20_d13_d13", 1045 ARRAY_SIZE(kFloatsSameRegisters), 1046 kFloatsSameRegisters}, 1047 {{F64, d1, d24, d24}, 1048 "F64 d1 d24 d24", 1049 "FloatsSameRegisters_F64_d1_d24_d24", 1050 ARRAY_SIZE(kFloatsSameRegisters), 1051 kFloatsSameRegisters}, 1052 {{F64, d27, d6, d6}, 1053 "F64 d27 d6 d6", 1054 "FloatsSameRegisters_F64_d27_d6_d6", 1055 ARRAY_SIZE(kFloatsSameRegisters), 1056 kFloatsSameRegisters}, 1057 {{F64, d30, d29, d29}, 1058 "F64 d30 d29 d29", 1059 "FloatsSameRegisters_F64_d30_d29_d29", 1060 ARRAY_SIZE(kFloatsSameRegisters), 1061 kFloatsSameRegisters}, 1062 {{F64, d31, d14, d14}, 1063 "F64 d31 d14 d14", 1064 "FloatsSameRegisters_F64_d31_d14_d14", 1065 ARRAY_SIZE(kFloatsSameRegisters), 1066 kFloatsSameRegisters}, 1067 {{F64, d25, d13, d13}, 1068 "F64 d25 d13 d13", 1069 "FloatsSameRegisters_F64_d25_d13_d13", 1070 ARRAY_SIZE(kFloatsSameRegisters), 1071 kFloatsSameRegisters}, 1072 {{F64, d21, d16, d16}, 1073 "F64 d21 d16 d16", 1074 "FloatsSameRegisters_F64_d21_d16_d16", 1075 ARRAY_SIZE(kFloatsSameRegisters), 1076 kFloatsSameRegisters}, 1077 {{F64, d12, d26, d26}, 1078 "F64 d12 d26 d26", 1079 "FloatsSameRegisters_F64_d12_d26_d26", 1080 ARRAY_SIZE(kFloatsSameRegisters), 1081 kFloatsSameRegisters}, 1082 {{F64, d2, d10, d10}, 1083 "F64 d2 d10 d10", 1084 "FloatsSameRegisters_F64_d2_d10_d10", 1085 ARRAY_SIZE(kFloatsSameRegisters), 1086 kFloatsSameRegisters}, 1087 {{F64, d1, d5, d5}, 1088 "F64 d1 d5 d5", 1089 "FloatsSameRegisters_F64_d1_d5_d5", 1090 ARRAY_SIZE(kFloatsSameRegisters), 1091 kFloatsSameRegisters}, 1092 {{F64, d26, d10, d10}, 1093 "F64 d26 d10 d10", 1094 "FloatsSameRegisters_F64_d26_d10_d10", 1095 ARRAY_SIZE(kFloatsSameRegisters), 1096 kFloatsSameRegisters}, 1097 {{F64, d21, d22, d22}, 1098 "F64 d21 d22 d22", 1099 "FloatsSameRegisters_F64_d21_d22_d22", 1100 ARRAY_SIZE(kFloatsSameRegisters), 1101 kFloatsSameRegisters}, 1102 {{F64, d2, d15, d15}, 1103 "F64 d2 d15 d15", 1104 "FloatsSameRegisters_F64_d2_d15_d15", 1105 ARRAY_SIZE(kFloatsSameRegisters), 1106 kFloatsSameRegisters}, 1107 {{F64, d30, d27, d27}, 1108 "F64 d30 d27 d27", 1109 "FloatsSameRegisters_F64_d30_d27_d27", 1110 ARRAY_SIZE(kFloatsSameRegisters), 1111 kFloatsSameRegisters}, 1112 {{F64, d17, d4, d4}, 1113 "F64 d17 d4 d4", 1114 "FloatsSameRegisters_F64_d17_d4_d4", 1115 ARRAY_SIZE(kFloatsSameRegisters), 1116 kFloatsSameRegisters}, 1117 {{F64, d0, d8, d8}, 1118 "F64 d0 d8 d8", 1119 "FloatsSameRegisters_F64_d0_d8_d8", 1120 ARRAY_SIZE(kFloatsSameRegisters), 1121 kFloatsSameRegisters}, 1122 {{F64, d27, d28, d28}, 1123 "F64 d27 d28 d28", 1124 "FloatsSameRegisters_F64_d27_d28_d28", 1125 ARRAY_SIZE(kFloatsSameRegisters), 1126 kFloatsSameRegisters}, 1127 {{F64, d10, d10, d10}, 1128 "F64 d10 d10 d10", 1129 "FloatsSameRegisters_F64_d10_d10_d10", 1130 ARRAY_SIZE(kFloatsSameRegisters), 1131 kFloatsSameRegisters}, 1132 {{F64, d10, d17, d17}, 1133 "F64 d10 d17 d17", 1134 "FloatsSameRegisters_F64_d10_d17_d17", 1135 ARRAY_SIZE(kFloatsSameRegisters), 1136 kFloatsSameRegisters}, 1137 {{F64, d18, d16, d16}, 1138 "F64 d18 d16 d16", 1139 "FloatsSameRegisters_F64_d18_d16_d16", 1140 ARRAY_SIZE(kFloatsSameRegisters), 1141 kFloatsSameRegisters}, 1142 {{F64, d3, d20, d20}, 1143 "F64 d3 d20 d20", 1144 "FloatsSameRegisters_F64_d3_d20_d20", 1145 ARRAY_SIZE(kFloatsSameRegisters), 1146 kFloatsSameRegisters}, 1147 {{F64, d0, d28, d28}, 1148 "F64 d0 d28 d28", 1149 "FloatsSameRegisters_F64_d0_d28_d28", 1150 ARRAY_SIZE(kFloatsSameRegisters), 1151 kFloatsSameRegisters}, 1152 {{F64, d2, d27, d27}, 1153 "F64 d2 d27 d27", 1154 "FloatsSameRegisters_F64_d2_d27_d27", 1155 ARRAY_SIZE(kFloatsSameRegisters), 1156 kFloatsSameRegisters}, 1157 {{F64, d12, d20, d20}, 1158 "F64 d12 d20 d20", 1159 "FloatsSameRegisters_F64_d12_d20_d20", 1160 ARRAY_SIZE(kFloatsSameRegisters), 1161 kFloatsSameRegisters}, 1162 {{F64, d9, d22, d22}, 1163 "F64 d9 d22 d22", 1164 "FloatsSameRegisters_F64_d9_d22_d22", 1165 ARRAY_SIZE(kFloatsSameRegisters), 1166 kFloatsSameRegisters}, 1167 {{F64, d10, d4, d4}, 1168 "F64 d10 d4 d4", 1169 "FloatsSameRegisters_F64_d10_d4_d4", 1170 ARRAY_SIZE(kFloatsSameRegisters), 1171 kFloatsSameRegisters}, 1172 {{F64, d8, d10, d10}, 1173 "F64 d8 d10 d10", 1174 "FloatsSameRegisters_F64_d8_d10_d10", 1175 ARRAY_SIZE(kFloatsSameRegisters), 1176 kFloatsSameRegisters}, 1177 {{F64, d26, d5, d5}, 1178 "F64 d26 d5 d5", 1179 "FloatsSameRegisters_F64_d26_d5_d5", 1180 ARRAY_SIZE(kFloatsSameRegisters), 1181 kFloatsSameRegisters}, 1182 {{F64, d7, d20, d20}, 1183 "F64 d7 d20 d20", 1184 "FloatsSameRegisters_F64_d7_d20_d20", 1185 ARRAY_SIZE(kFloatsSameRegisters), 1186 kFloatsSameRegisters}, 1187 {{F64, d21, d24, d24}, 1188 "F64 d21 d24 d24", 1189 "FloatsSameRegisters_F64_d21_d24_d24", 1190 ARRAY_SIZE(kFloatsSameRegisters), 1191 kFloatsSameRegisters}, 1192 {{F64, d29, d9, d9}, 1193 "F64 d29 d9 d9", 1194 "FloatsSameRegisters_F64_d29_d9_d9", 1195 ARRAY_SIZE(kFloatsSameRegisters), 1196 kFloatsSameRegisters}, 1197 {{F64, d20, d14, d14}, 1198 "F64 d20 d14 d14", 1199 "FloatsSameRegisters_F64_d20_d14_d14", 1200 ARRAY_SIZE(kFloatsSameRegisters), 1201 kFloatsSameRegisters}, 1202 {{F64, d18, d30, d30}, 1203 "F64 d18 d30 d30", 1204 "FloatsSameRegisters_F64_d18_d30_d30", 1205 ARRAY_SIZE(kFloatsSameRegisters), 1206 kFloatsSameRegisters}, 1207 {{F64, d15, d14, d14}, 1208 "F64 d15 d14 d14", 1209 "FloatsSameRegisters_F64_d15_d14_d14", 1210 ARRAY_SIZE(kFloatsSameRegisters), 1211 kFloatsSameRegisters}, 1212 {{F64, d31, d21, d21}, 1213 "F64 d31 d21 d21", 1214 "FloatsSameRegisters_F64_d31_d21_d21", 1215 ARRAY_SIZE(kFloatsSameRegisters), 1216 kFloatsSameRegisters}, 1217 {{F64, d20, d22, d22}, 1218 "F64 d20 d22 d22", 1219 "FloatsSameRegisters_F64_d20_d22_d22", 1220 ARRAY_SIZE(kFloatsSameRegisters), 1221 kFloatsSameRegisters}, 1222 {{F64, d13, d5, d5}, 1223 "F64 d13 d5 d5", 1224 "FloatsSameRegisters_F64_d13_d5_d5", 1225 ARRAY_SIZE(kFloatsSameRegisters), 1226 kFloatsSameRegisters}, 1227 {{F64, d28, d14, d14}, 1228 "F64 d28 d14 d14", 1229 "FloatsSameRegisters_F64_d28_d14_d14", 1230 ARRAY_SIZE(kFloatsSameRegisters), 1231 kFloatsSameRegisters}, 1232 {{F64, d21, d25, d25}, 1233 "F64 d21 d25 d25", 1234 "FloatsSameRegisters_F64_d21_d25_d25", 1235 ARRAY_SIZE(kFloatsSameRegisters), 1236 kFloatsSameRegisters}, 1237 {{F64, d23, d29, d29}, 1238 "F64 d23 d29 d29", 1239 "FloatsSameRegisters_F64_d23_d29_d29", 1240 ARRAY_SIZE(kFloatsSameRegisters), 1241 kFloatsSameRegisters}, 1242 {{F64, d19, d17, d17}, 1243 "F64 d19 d17 d17", 1244 "FloatsSameRegisters_F64_d19_d17_d17", 1245 ARRAY_SIZE(kFloatsSameRegisters), 1246 kFloatsSameRegisters}, 1247 {{F64, d30, d21, d21}, 1248 "F64 d30 d21 d21", 1249 "FloatsSameRegisters_F64_d30_d21_d21", 1250 ARRAY_SIZE(kFloatsSameRegisters), 1251 kFloatsSameRegisters}, 1252 {{F64, d6, d9, d9}, 1253 "F64 d6 d9 d9", 1254 "FloatsSameRegisters_F64_d6_d9_d9", 1255 ARRAY_SIZE(kFloatsSameRegisters), 1256 kFloatsSameRegisters}, 1257 {{F64, d22, d27, d27}, 1258 "F64 d22 d27 d27", 1259 "FloatsSameRegisters_F64_d22_d27_d27", 1260 ARRAY_SIZE(kFloatsSameRegisters), 1261 kFloatsSameRegisters}, 1262 {{F64, d9, d25, d25}, 1263 "F64 d9 d25 d25", 1264 "FloatsSameRegisters_F64_d9_d25_d25", 1265 ARRAY_SIZE(kFloatsSameRegisters), 1266 kFloatsSameRegisters}, 1267 {{F64, d12, d22, d22}, 1268 "F64 d12 d22 d22", 1269 "FloatsSameRegisters_F64_d12_d22_d22", 1270 ARRAY_SIZE(kFloatsSameRegisters), 1271 kFloatsSameRegisters}, 1272 {{F64, d12, d9, d9}, 1273 "F64 d12 d9 d9", 1274 "FloatsSameRegisters_F64_d12_d9_d9", 1275 ARRAY_SIZE(kFloatsSameRegisters), 1276 kFloatsSameRegisters}, 1277 {{F64, d0, d27, d27}, 1278 "F64 d0 d27 d27", 1279 "FloatsSameRegisters_F64_d0_d27_d27", 1280 ARRAY_SIZE(kFloatsSameRegisters), 1281 kFloatsSameRegisters}, 1282 {{F64, d2, d12, d12}, 1283 "F64 d2 d12 d12", 1284 "FloatsSameRegisters_F64_d2_d12_d12", 1285 ARRAY_SIZE(kFloatsSameRegisters), 1286 kFloatsSameRegisters}, 1287 {{F64, d27, d29, d29}, 1288 "F64 d27 d29 d29", 1289 "FloatsSameRegisters_F64_d27_d29_d29", 1290 ARRAY_SIZE(kFloatsSameRegisters), 1291 kFloatsSameRegisters}, 1292 {{F64, d14, d4, d4}, 1293 "F64 d14 d4 d4", 1294 "FloatsSameRegisters_F64_d14_d4_d4", 1295 ARRAY_SIZE(kFloatsSameRegisters), 1296 kFloatsSameRegisters}, 1297 {{F64, d17, d25, d25}, 1298 "F64 d17 d25 d25", 1299 "FloatsSameRegisters_F64_d17_d25_d25", 1300 ARRAY_SIZE(kFloatsSameRegisters), 1301 kFloatsSameRegisters}, 1302 {{F64, d19, d11, d11}, 1303 "F64 d19 d11 d11", 1304 "FloatsSameRegisters_F64_d19_d11_d11", 1305 ARRAY_SIZE(kFloatsSameRegisters), 1306 kFloatsSameRegisters}, 1307 {{F64, d2, d6, d6}, 1308 "F64 d2 d6 d6", 1309 "FloatsSameRegisters_F64_d2_d6_d6", 1310 ARRAY_SIZE(kFloatsSameRegisters), 1311 kFloatsSameRegisters}, 1312 {{F64, d26, d24, d24}, 1313 "F64 d26 d24 d24", 1314 "FloatsSameRegisters_F64_d26_d24_d24", 1315 ARRAY_SIZE(kFloatsSameRegisters), 1316 kFloatsSameRegisters}, 1317 {{F64, d17, d16, d16}, 1318 "F64 d17 d16 d16", 1319 "FloatsSameRegisters_F64_d17_d16_d16", 1320 ARRAY_SIZE(kFloatsSameRegisters), 1321 kFloatsSameRegisters}, 1322 {{F64, d14, d26, d26}, 1323 "F64 d14 d26 d26", 1324 "FloatsSameRegisters_F64_d14_d26_d26", 1325 ARRAY_SIZE(kFloatsSameRegisters), 1326 kFloatsSameRegisters}, 1327 {{F64, d18, d20, d20}, 1328 "F64 d18 d20 d20", 1329 "FloatsSameRegisters_F64_d18_d20_d20", 1330 ARRAY_SIZE(kFloatsSameRegisters), 1331 kFloatsSameRegisters}, 1332 {{F64, d24, d14, d14}, 1333 "F64 d24 d14 d14", 1334 "FloatsSameRegisters_F64_d24_d14_d14", 1335 ARRAY_SIZE(kFloatsSameRegisters), 1336 kFloatsSameRegisters}, 1337 {{F64, d8, d14, d14}, 1338 "F64 d8 d14 d14", 1339 "FloatsSameRegisters_F64_d8_d14_d14", 1340 ARRAY_SIZE(kFloatsSameRegisters), 1341 kFloatsSameRegisters}, 1342 {{F64, d13, d9, d9}, 1343 "F64 d13 d9 d9", 1344 "FloatsSameRegisters_F64_d13_d9_d9", 1345 ARRAY_SIZE(kFloatsSameRegisters), 1346 kFloatsSameRegisters}, 1347 {{F64, d18, d31, d31}, 1348 "F64 d18 d31 d31", 1349 "FloatsSameRegisters_F64_d18_d31_d31", 1350 ARRAY_SIZE(kFloatsSameRegisters), 1351 kFloatsSameRegisters}, 1352 {{F64, d7, d22, d22}, 1353 "F64 d7 d22 d22", 1354 "FloatsSameRegisters_F64_d7_d22_d22", 1355 ARRAY_SIZE(kFloatsSameRegisters), 1356 kFloatsSameRegisters}, 1357 {{F64, d29, d10, d10}, 1358 "F64 d29 d10 d10", 1359 "FloatsSameRegisters_F64_d29_d10_d10", 1360 ARRAY_SIZE(kFloatsSameRegisters), 1361 kFloatsSameRegisters}, 1362 {{F64, d5, d29, d29}, 1363 "F64 d5 d29 d29", 1364 "FloatsSameRegisters_F64_d5_d29_d29", 1365 ARRAY_SIZE(kFloatsSameRegisters), 1366 kFloatsSameRegisters}}; 1367 1368// We record all inputs to the instructions as outputs. This way, we also check 1369// that what shouldn't change didn't change. 1370struct TestResult { 1371 size_t output_size; 1372 const Inputs* outputs; 1373}; 1374 1375// These headers each contain an array of `TestResult` with the reference output 1376// values. The reference arrays are names `kReference{mnemonic}`. 1377#include "aarch32/traces/simulator-cond-dt-drt-drd-drn-drm-float-f64-vadd-a32.h" 1378#include "aarch32/traces/simulator-cond-dt-drt-drd-drn-drm-float-f64-vsub-a32.h" 1379 1380 1381// The maximum number of errors to report in detail for each test. 1382const unsigned kErrorReportLimit = 8; 1383 1384typedef void (MacroAssembler::*Fn)(DataType dt, 1385 DRegister rd, 1386 DRegister rn, 1387 DRegister rm); 1388 1389void TestHelper(Fn instruction, 1390 const char* mnemonic, 1391 const TestResult reference[]) { 1392 SETUP(); 1393 masm.UseA32(); 1394 START(); 1395 1396 // Data to compare to `reference`. 1397 TestResult* results[ARRAY_SIZE(kTests)]; 1398 1399 // Test cases for memory bound instructions may allocate a buffer and save its 1400 // address in this array. 1401 byte* scratch_memory_buffers[ARRAY_SIZE(kTests)]; 1402 1403 // Generate a loop for each element in `kTests`. Each loop tests one specific 1404 // instruction. 1405 for (unsigned i = 0; i < ARRAY_SIZE(kTests); i++) { 1406 // Allocate results on the heap for this test. 1407 results[i] = new TestResult; 1408 results[i]->outputs = new Inputs[kTests[i].input_size]; 1409 results[i]->output_size = kTests[i].input_size; 1410 1411 size_t input_stride = sizeof(kTests[i].inputs[0]) * kTests[i].input_size; 1412 VIXL_ASSERT(IsUint32(input_stride)); 1413 1414 scratch_memory_buffers[i] = NULL; 1415 1416 Label loop; 1417 UseScratchRegisterScope scratch_registers(&masm); 1418 // Include all registers from r0 ro r12. 1419 scratch_registers.Include(RegisterList(0x1fff)); 1420 1421 // Values to pass to the macro-assembler. 1422 DataType dt = kTests[i].operands.dt; 1423 DRegister rd = kTests[i].operands.rd; 1424 DRegister rn = kTests[i].operands.rn; 1425 DRegister rm = kTests[i].operands.rm; 1426 1427 // Allocate reserved registers for our own use. 1428 Register input_ptr = scratch_registers.Acquire(); 1429 Register input_end = scratch_registers.Acquire(); 1430 Register result_ptr = scratch_registers.Acquire(); 1431 1432 // Initialize `input_ptr` to the first element and `input_end` the address 1433 // after the array. 1434 __ Mov(input_ptr, Operand::From(kTests[i].inputs)); 1435 __ Add(input_end, input_ptr, static_cast<uint32_t>(input_stride)); 1436 __ Mov(result_ptr, Operand::From(results[i]->outputs)); 1437 __ Bind(&loop); 1438 1439 { 1440 UseScratchRegisterScope temp_registers(&masm); 1441 Register fpsr_bits = temp_registers.Acquire(); 1442 __ Ldr(fpsr_bits, MemOperand(input_ptr, offsetof(Inputs, fpscr))); 1443 __ Vmsr(FPSCR, fpsr_bits); 1444 } 1445 __ Vldr(rd, MemOperand(input_ptr, offsetof(Inputs, rd))); 1446 __ Vldr(rn, MemOperand(input_ptr, offsetof(Inputs, rn))); 1447 __ Vldr(rm, MemOperand(input_ptr, offsetof(Inputs, rm))); 1448 1449 (masm.*instruction)(dt, rd, rn, rm); 1450 1451 { 1452 UseScratchRegisterScope temp_registers(&masm); 1453 Register fpsr_bits = temp_registers.Acquire(); 1454 __ Vmrs(RegisterOrAPSR_nzcv(fpsr_bits.GetCode()), FPSCR); 1455 __ Str(fpsr_bits, MemOperand(result_ptr, offsetof(Inputs, fpscr))); 1456 } 1457 __ Vstr(rd, MemOperand(result_ptr, offsetof(Inputs, rd))); 1458 __ Vstr(rn, MemOperand(result_ptr, offsetof(Inputs, rn))); 1459 __ Vstr(rm, MemOperand(result_ptr, offsetof(Inputs, rm))); 1460 1461 // Advance the result pointer. 1462 __ Add(result_ptr, result_ptr, Operand::From(sizeof(kTests[i].inputs[0]))); 1463 // Loop back until `input_ptr` is lower than `input_base`. 1464 __ Add(input_ptr, input_ptr, Operand::From(sizeof(kTests[i].inputs[0]))); 1465 __ Cmp(input_ptr, input_end); 1466 __ B(ne, &loop); 1467 } 1468 1469 END(); 1470 1471 RUN(); 1472 1473 if (Test::generate_test_trace()) { 1474 // Print the results. 1475 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 1476 printf("const Inputs kOutputs_%s_%s[] = {\n", 1477 mnemonic, 1478 kTests[i].identifier); 1479 for (size_t j = 0; j < results[i]->output_size; j++) { 1480 printf(" { "); 1481 printf("0x%08" PRIx32, results[i]->outputs[j].fpscr); 1482 printf(", "); 1483 printf("0x%016" PRIx64, results[i]->outputs[j].rd); 1484 printf(", "); 1485 printf("0x%016" PRIx64, results[i]->outputs[j].rn); 1486 printf(", "); 1487 printf("0x%016" PRIx64, results[i]->outputs[j].rm); 1488 printf(" },\n"); 1489 } 1490 printf("};\n"); 1491 } 1492 printf("const TestResult kReference%s[] = {\n", mnemonic); 1493 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 1494 printf(" {\n"); 1495 printf(" ARRAY_SIZE(kOutputs_%s_%s),\n", 1496 mnemonic, 1497 kTests[i].identifier); 1498 printf(" kOutputs_%s_%s,\n", mnemonic, kTests[i].identifier); 1499 printf(" },\n"); 1500 } 1501 printf("};\n"); 1502 } else if (kCheckSimulatorTestResults) { 1503 // Check the results. 1504 unsigned total_error_count = 0; 1505 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 1506 bool instruction_has_errors = false; 1507 for (size_t j = 0; j < kTests[i].input_size; j++) { 1508 uint32_t fpscr = results[i]->outputs[j].fpscr; 1509 uint64_t rd = results[i]->outputs[j].rd; 1510 uint64_t rn = results[i]->outputs[j].rn; 1511 uint64_t rm = results[i]->outputs[j].rm; 1512 uint32_t fpscr_input = kTests[i].inputs[j].fpscr; 1513 uint64_t rd_input = kTests[i].inputs[j].rd; 1514 uint64_t rn_input = kTests[i].inputs[j].rn; 1515 uint64_t rm_input = kTests[i].inputs[j].rm; 1516 uint32_t fpscr_ref = reference[i].outputs[j].fpscr; 1517 uint64_t rd_ref = reference[i].outputs[j].rd; 1518 uint64_t rn_ref = reference[i].outputs[j].rn; 1519 uint64_t rm_ref = reference[i].outputs[j].rm; 1520 1521 if (((fpscr != fpscr_ref) || (rd != rd_ref) || (rn != rn_ref) || 1522 (rm != rm_ref)) && 1523 (++total_error_count <= kErrorReportLimit)) { 1524 // Print the instruction once even if it triggered multiple failures. 1525 if (!instruction_has_errors) { 1526 printf("Error(s) when testing \"%s %s\":\n", 1527 mnemonic, 1528 kTests[i].operands_description); 1529 instruction_has_errors = true; 1530 } 1531 // Print subsequent errors. 1532 printf(" Input: "); 1533 printf("0x%08" PRIx32, fpscr_input); 1534 printf(", "); 1535 printf("0x%016" PRIx64 "(%g)", rd_input, RawbitsToDouble(rd_input)); 1536 printf(", "); 1537 printf("0x%016" PRIx64 "(%g)", rn_input, RawbitsToDouble(rn_input)); 1538 printf(", "); 1539 printf("0x%016" PRIx64 "(%g)", rm_input, RawbitsToDouble(rm_input)); 1540 printf("\n"); 1541 printf(" Expected: "); 1542 printf("0x%08" PRIx32, fpscr_ref); 1543 printf(", "); 1544 printf("0x%016" PRIx64 "(%g)", rd_ref, RawbitsToDouble(rd_ref)); 1545 printf(", "); 1546 printf("0x%016" PRIx64 "(%g)", rn_ref, RawbitsToDouble(rn_ref)); 1547 printf(", "); 1548 printf("0x%016" PRIx64 "(%g)", rm_ref, RawbitsToDouble(rm_ref)); 1549 printf("\n"); 1550 printf(" Found: "); 1551 printf("0x%08" PRIx32, fpscr); 1552 printf(", "); 1553 printf("0x%016" PRIx64 "(%g)", rd, RawbitsToDouble(rd)); 1554 printf(", "); 1555 printf("0x%016" PRIx64 "(%g)", rn, RawbitsToDouble(rn)); 1556 printf(", "); 1557 printf("0x%016" PRIx64 "(%g)", rm, RawbitsToDouble(rm)); 1558 printf("\n\n"); 1559 } 1560 } 1561 } 1562 1563 if (total_error_count > kErrorReportLimit) { 1564 printf("%u other errors follow.\n", 1565 total_error_count - kErrorReportLimit); 1566 } 1567 VIXL_CHECK(total_error_count == 0); 1568 } else { 1569 VIXL_WARNING("Assembled the code, but did not run anything.\n"); 1570 } 1571 1572 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 1573 delete[] results[i]->outputs; 1574 delete results[i]; 1575 delete[] scratch_memory_buffers[i]; 1576 } 1577} 1578 1579// Instantiate tests for each instruction in the list. 1580// TODO: Remove this limitation by having a sandboxing mechanism. 1581#if defined(VIXL_HOST_POINTER_32) 1582#define TEST(mnemonic) \ 1583 void Test_##mnemonic() { \ 1584 TestHelper(&MacroAssembler::mnemonic, #mnemonic, kReference##mnemonic); \ 1585 } \ 1586 Test test_##mnemonic( \ 1587 "AARCH32_SIMULATOR_COND_DT_DRT_DRD_DRN_DRM_FLOAT_F64_" #mnemonic "_A32", \ 1588 &Test_##mnemonic); 1589#else 1590#define TEST(mnemonic) \ 1591 void Test_##mnemonic() { \ 1592 VIXL_WARNING("This test can only run on a 32-bit host.\n"); \ 1593 USE(TestHelper); \ 1594 } \ 1595 Test test_##mnemonic( \ 1596 "AARCH32_SIMULATOR_COND_DT_DRT_DRD_DRN_DRM_FLOAT_F64_" #mnemonic "_A32", \ 1597 &Test_##mnemonic); 1598#endif 1599 1600FOREACH_INSTRUCTION(TEST) 1601#undef TEST 1602 1603} // namespace 1604#endif 1605 1606} // namespace aarch32 1607} // namespace vixl 1608