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/macro-assembler-aarch32.h" 44 #include "aarch32/disasm-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 #define TEARDOWN() 64 65 #else // ifdef VIXL_INCLUDE_SIMULATOR_AARCH32. 66 67 #define SETUP() \ 68 MacroAssembler masm(BUF_SIZE); \ 69 UseScratchRegisterScope harness_scratch(&masm); \ 70 harness_scratch.ExcludeAll(); 71 72 #define START() \ 73 masm.GetBuffer()->Reset(); \ 74 __ Push(r4); \ 75 __ Push(r5); \ 76 __ Push(r6); \ 77 __ Push(r7); \ 78 __ Push(r8); \ 79 __ Push(r9); \ 80 __ Push(r10); \ 81 __ Push(r11); \ 82 __ Push(lr); \ 83 harness_scratch.Include(ip); 84 85 #define END() \ 86 harness_scratch.Exclude(ip); \ 87 __ Pop(lr); \ 88 __ Pop(r11); \ 89 __ Pop(r10); \ 90 __ Pop(r9); \ 91 __ Pop(r8); \ 92 __ Pop(r7); \ 93 __ Pop(r6); \ 94 __ Pop(r5); \ 95 __ Pop(r4); \ 96 __ Bx(lr); \ 97 __ FinalizeCode(); 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 #define TEARDOWN() harness_scratch.Close(); 110 111 #endif // ifdef VIXL_INCLUDE_SIMULATOR_AARCH32 112 113 namespace vixl { 114 namespace aarch32 { 115 116 // List of instruction encodings: 117 #define FOREACH_INSTRUCTION(M) \ 118 M(Add) \ 119 M(Adds) \ 120 M(Rsb) \ 121 M(Rsbs) \ 122 M(Sub) \ 123 M(Subs) 124 125 126 // The following definitions are defined again in each generated test, therefore 127 // we need to place them in an anomymous namespace. It expresses that they are 128 // local to this file only, and the compiler is not allowed to share these types 129 // across test files during template instantiation. Specifically, `Operands` and 130 // `Inputs` have various layouts across generated tests so they absolutely 131 // cannot be shared. 132 133 #ifdef VIXL_INCLUDE_TARGET_T32 134 namespace { 135 136 // Values to be passed to the assembler to produce the instruction under test. 137 struct Operands { 138 Condition cond; 139 Register rd; 140 Register rn; 141 int32_t immediate; 142 }; 143 144 // Input data to feed to the instruction. 145 struct Inputs { 146 uint32_t apsr; 147 uint32_t rd; 148 uint32_t rn; 149 }; 150 151 // This structure contains all input data needed to test one specific encoding. 152 // It used to generate a loop over an instruction. 153 struct TestLoopData { 154 // The `operands` fields represents the values to pass to the assembler to 155 // produce the instruction. 156 Operands operands; 157 // Description of the operands, used for error reporting. 158 const char* operands_description; 159 // Unique identifier, used for generating traces. 160 const char* identifier; 161 // Array of values to be fed to the instruction. 162 size_t input_size; 163 const Inputs* inputs; 164 }; 165 166 static const Inputs kRdIsRn[] = {{ZFlag, 0x00007fff, 0x00007fff}, 167 {CFlag, 0xffffff83, 0xffffff83}, 168 {NCFlag, 0x00000000, 0x00000000}, 169 {NCVFlag, 0x00000000, 0x00000000}, 170 {NZFlag, 0x00000000, 0x00000000}, 171 {VFlag, 0x00000002, 0x00000002}, 172 {NCFlag, 0xfffffffe, 0xfffffffe}, 173 {NCVFlag, 0x00007ffd, 0x00007ffd}, 174 {NZCVFlag, 0xffffffff, 0xffffffff}, 175 {ZVFlag, 0xffffffff, 0xffffffff}, 176 {CFlag, 0x00000002, 0x00000002}, 177 {ZFlag, 0x80000001, 0x80000001}, 178 {ZCFlag, 0x00007ffe, 0x00007ffe}, 179 {ZVFlag, 0xffff8000, 0xffff8000}, 180 {CFlag, 0x0000007e, 0x0000007e}, 181 {ZFlag, 0xcccccccc, 0xcccccccc}, 182 {NVFlag, 0xffff8000, 0xffff8000}, 183 {CFlag, 0x00000001, 0x00000001}, 184 {NFlag, 0x00000001, 0x00000001}, 185 {NZFlag, 0xffffffe0, 0xffffffe0}, 186 {CVFlag, 0xfffffffd, 0xfffffffd}, 187 {ZVFlag, 0x00007ffe, 0x00007ffe}, 188 {ZCVFlag, 0x55555555, 0x55555555}, 189 {NCFlag, 0x00000020, 0x00000020}, 190 {ZCFlag, 0xffffff81, 0xffffff81}, 191 {ZCFlag, 0xcccccccc, 0xcccccccc}, 192 {ZCFlag, 0x00000020, 0x00000020}, 193 {NCVFlag, 0xffff8000, 0xffff8000}, 194 {NZVFlag, 0xffff8001, 0xffff8001}, 195 {ZVFlag, 0xffffff81, 0xffffff81}, 196 {NZVFlag, 0xffffff81, 0xffffff81}, 197 {NZVFlag, 0x00000000, 0x00000000}, 198 {NVFlag, 0x00000001, 0x00000001}, 199 {NCVFlag, 0x33333333, 0x33333333}, 200 {NZCVFlag, 0xffff8001, 0xffff8001}, 201 {NZCFlag, 0xffffffff, 0xffffffff}, 202 {NCVFlag, 0x80000000, 0x80000000}, 203 {ZCFlag, 0x00000001, 0x00000001}, 204 {CVFlag, 0x00000020, 0x00000020}, 205 {NCFlag, 0xffff8003, 0xffff8003}, 206 {CVFlag, 0x00000002, 0x00000002}, 207 {NZCFlag, 0x80000000, 0x80000000}, 208 {VFlag, 0xffffff83, 0xffffff83}, 209 {NZFlag, 0x33333333, 0x33333333}, 210 {NCVFlag, 0x00007ffe, 0x00007ffe}, 211 {NFlag, 0xffffff81, 0xffffff81}, 212 {NZVFlag, 0x00000020, 0x00000020}, 213 {CVFlag, 0x00007fff, 0x00007fff}, 214 {NZCFlag, 0xffff8003, 0xffff8003}, 215 {ZCFlag, 0xfffffffd, 0xfffffffd}, 216 {NZFlag, 0xcccccccc, 0xcccccccc}, 217 {ZCFlag, 0xffffffff, 0xffffffff}, 218 {ZVFlag, 0xffffffe0, 0xffffffe0}, 219 {ZCFlag, 0x55555555, 0x55555555}, 220 {NVFlag, 0x00000020, 0x00000020}, 221 {NFlag, 0xffff8000, 0xffff8000}, 222 {ZFlag, 0x00000000, 0x00000000}, 223 {VFlag, 0xffffffe0, 0xffffffe0}, 224 {CFlag, 0xffff8001, 0xffff8001}, 225 {NZCVFlag, 0xfffffffd, 0xfffffffd}, 226 {NCVFlag, 0x0000007d, 0x0000007d}, 227 {NCVFlag, 0x0000007f, 0x0000007f}, 228 {NZFlag, 0xffff8003, 0xffff8003}, 229 {ZCFlag, 0xffffff82, 0xffffff82}, 230 {ZFlag, 0xffff8001, 0xffff8001}, 231 {NZFlag, 0xffff8002, 0xffff8002}, 232 {NZFlag, 0x00000020, 0x00000020}, 233 {NCFlag, 0x33333333, 0x33333333}, 234 {ZCVFlag, 0x80000000, 0x80000000}, 235 {NZCFlag, 0xffffffe0, 0xffffffe0}, 236 {NZFlag, 0x00007fff, 0x00007fff}, 237 {NZVFlag, 0x00000002, 0x00000002}, 238 {NFlag, 0x55555555, 0x55555555}, 239 {NVFlag, 0xffffffff, 0xffffffff}, 240 {NCFlag, 0x00007fff, 0x00007fff}, 241 {NZCVFlag, 0xffffff81, 0xffffff81}, 242 {ZCVFlag, 0x00007fff, 0x00007fff}, 243 {NZFlag, 0x0000007d, 0x0000007d}, 244 {VFlag, 0x00007ffe, 0x00007ffe}, 245 {CVFlag, 0xffffff83, 0xffffff83}, 246 {NZFlag, 0x80000000, 0x80000000}, 247 {ZCFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 248 {NCFlag, 0x0000007f, 0x0000007f}, 249 {CFlag, 0x00000020, 0x00000020}, 250 {NZCFlag, 0x00000001, 0x00000001}, 251 {NZCFlag, 0xcccccccc, 0xcccccccc}, 252 {NZCFlag, 0xffffff80, 0xffffff80}, 253 {NCVFlag, 0xffff8003, 0xffff8003}, 254 {NFlag, 0x0000007d, 0x0000007d}, 255 {NZVFlag, 0x55555555, 0x55555555}, 256 {NZCVFlag, 0xfffffffe, 0xfffffffe}, 257 {NCFlag, 0xffff8000, 0xffff8000}, 258 {CFlag, 0x80000001, 0x80000001}, 259 {NVFlag, 0xffffffe0, 0xffffffe0}, 260 {CFlag, 0xffffff82, 0xffffff82}, 261 {NZCVFlag, 0x00007ffd, 0x00007ffd}, 262 {CFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 263 {NZCFlag, 0xffffff81, 0xffffff81}, 264 {ZFlag, 0x00007ffd, 0x00007ffd}, 265 {NZVFlag, 0xffffffe0, 0xffffffe0}, 266 {NZVFlag, 0x00007ffe, 0x00007ffe}, 267 {NZFlag, 0x7ffffffd, 0x7ffffffd}, 268 {NZCFlag, 0xfffffffe, 0xfffffffe}, 269 {NZCVFlag, 0x7ffffffd, 0x7ffffffd}, 270 {ZVFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 271 {CFlag, 0x00000000, 0x00000000}, 272 {ZCVFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 273 {NZFlag, 0x00007ffd, 0x00007ffd}, 274 {VFlag, 0xffff8000, 0xffff8000}, 275 {CVFlag, 0xcccccccc, 0xcccccccc}, 276 {NZCVFlag, 0xffff8003, 0xffff8003}, 277 {NVFlag, 0x00007ffe, 0x00007ffe}, 278 {ZVFlag, 0xfffffffd, 0xfffffffd}, 279 {NZCFlag, 0x0000007e, 0x0000007e}, 280 {VFlag, 0x00000000, 0x00000000}, 281 {NZFlag, 0x00000002, 0x00000002}, 282 {ZCFlag, 0x7fffffff, 0x7fffffff}, 283 {ZFlag, 0x0000007e, 0x0000007e}, 284 {NZCFlag, 0x7fffffff, 0x7fffffff}, 285 {ZVFlag, 0xffff8002, 0xffff8002}, 286 {ZFlag, 0x00000020, 0x00000020}, 287 {NZFlag, 0xffffff81, 0xffffff81}, 288 {ZCVFlag, 0x00000000, 0x00000000}, 289 {CFlag, 0xffffff81, 0xffffff81}, 290 {NVFlag, 0x0000007e, 0x0000007e}, 291 {NZFlag, 0x55555555, 0x55555555}, 292 {CFlag, 0x0000007d, 0x0000007d}, 293 {NCFlag, 0x7fffffff, 0x7fffffff}, 294 {NCFlag, 0xffff8001, 0xffff8001}, 295 {CFlag, 0xffffffe0, 0xffffffe0}, 296 {ZVFlag, 0x7ffffffe, 0x7ffffffe}, 297 {VFlag, 0x7ffffffd, 0x7ffffffd}, 298 {CFlag, 0xffffffff, 0xffffffff}, 299 {ZCFlag, 0xffff8000, 0xffff8000}, 300 {NZVFlag, 0xffff8003, 0xffff8003}, 301 {NCFlag, 0x0000007d, 0x0000007d}, 302 {NZVFlag, 0x0000007f, 0x0000007f}, 303 {CFlag, 0xcccccccc, 0xcccccccc}, 304 {CVFlag, 0x00000001, 0x00000001}, 305 {NZCFlag, 0xffff8001, 0xffff8001}, 306 {NCVFlag, 0x00000020, 0x00000020}, 307 {NZVFlag, 0xffffff82, 0xffffff82}, 308 {NCFlag, 0x00007ffd, 0x00007ffd}, 309 {ZVFlag, 0x0000007e, 0x0000007e}, 310 {NZFlag, 0x80000001, 0x80000001}, 311 {NVFlag, 0x7ffffffe, 0x7ffffffe}, 312 {NZCVFlag, 0x00000000, 0x00000000}, 313 {CVFlag, 0x55555555, 0x55555555}, 314 {ZVFlag, 0x00000020, 0x00000020}, 315 {VFlag, 0x00000020, 0x00000020}, 316 {NFlag, 0xcccccccc, 0xcccccccc}, 317 {NVFlag, 0x0000007d, 0x0000007d}, 318 {CVFlag, 0x0000007f, 0x0000007f}, 319 {NZCFlag, 0x00000002, 0x00000002}, 320 {NZCFlag, 0x00007fff, 0x00007fff}, 321 {NZVFlag, 0x0000007d, 0x0000007d}, 322 {NZVFlag, 0xfffffffd, 0xfffffffd}, 323 {NFlag, 0x00000002, 0x00000002}, 324 {NZCVFlag, 0x0000007d, 0x0000007d}, 325 {NVFlag, 0xffffff82, 0xffffff82}, 326 {VFlag, 0x00007fff, 0x00007fff}, 327 {NZCVFlag, 0x00000001, 0x00000001}, 328 {ZFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 329 {CVFlag, 0xffff8002, 0xffff8002}, 330 {NFlag, 0x7fffffff, 0x7fffffff}, 331 {NCVFlag, 0xffffff80, 0xffffff80}, 332 {ZFlag, 0x33333333, 0x33333333}, 333 {NZFlag, 0x00000001, 0x00000001}, 334 {NCVFlag, 0x7ffffffe, 0x7ffffffe}, 335 {VFlag, 0x00000001, 0x00000001}, 336 {ZCFlag, 0x0000007f, 0x0000007f}, 337 {ZVFlag, 0x80000001, 0x80000001}, 338 {ZVFlag, 0xffff8003, 0xffff8003}, 339 {NCVFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 340 {NZCVFlag, 0xffffffe0, 0xffffffe0}, 341 {VFlag, 0x33333333, 0x33333333}, 342 {NCFlag, 0xffffff80, 0xffffff80}, 343 {ZFlag, 0x00007ffe, 0x00007ffe}, 344 {NVFlag, 0x00000000, 0x00000000}, 345 {NZCFlag, 0x00007ffd, 0x00007ffd}, 346 {NZFlag, 0xfffffffd, 0xfffffffd}, 347 {VFlag, 0xffffffff, 0xffffffff}, 348 {NZCFlag, 0xffffff83, 0xffffff83}, 349 {NZVFlag, 0xffff8002, 0xffff8002}, 350 {NZCVFlag, 0x33333333, 0x33333333}, 351 {ZCVFlag, 0xfffffffd, 0xfffffffd}, 352 {ZCFlag, 0x80000001, 0x80000001}, 353 {NCFlag, 0x00007ffe, 0x00007ffe}, 354 {NFlag, 0xfffffffd, 0xfffffffd}, 355 {NZCVFlag, 0x7fffffff, 0x7fffffff}, 356 {VFlag, 0xffff8001, 0xffff8001}, 357 {NZVFlag, 0xffff8000, 0xffff8000}, 358 {ZCVFlag, 0xcccccccc, 0xcccccccc}, 359 {VFlag, 0x7ffffffe, 0x7ffffffe}, 360 {ZFlag, 0xffff8002, 0xffff8002}, 361 {ZCFlag, 0x0000007d, 0x0000007d}, 362 {NZCVFlag, 0xffffff83, 0xffffff83}, 363 {ZVFlag, 0x00000001, 0x00000001}, 364 {NZCVFlag, 0xffff8002, 0xffff8002}, 365 {ZCFlag, 0xffffff83, 0xffffff83}, 366 {CFlag, 0xffff8003, 0xffff8003}, 367 {NCVFlag, 0xffffffff, 0xffffffff}, 368 {CFlag, 0xfffffffe, 0xfffffffe}, 369 {NZFlag, 0xffffff80, 0xffffff80}, 370 {CVFlag, 0x00007ffd, 0x00007ffd}, 371 {ZCVFlag, 0x0000007d, 0x0000007d}, 372 {ZVFlag, 0xcccccccc, 0xcccccccc}, 373 {NVFlag, 0x00007ffd, 0x00007ffd}, 374 {NZFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 375 {ZFlag, 0x0000007f, 0x0000007f}, 376 {CVFlag, 0xffff8003, 0xffff8003}, 377 {ZFlag, 0xffffffe0, 0xffffffe0}, 378 {NZVFlag, 0xcccccccc, 0xcccccccc}, 379 {NFlag, 0x00007ffe, 0x00007ffe}, 380 {NFlag, 0xffff8003, 0xffff8003}, 381 {NZVFlag, 0xffffffff, 0xffffffff}, 382 {CFlag, 0x00007fff, 0x00007fff}, 383 {NCVFlag, 0x7fffffff, 0x7fffffff}, 384 {CFlag, 0x33333333, 0x33333333}, 385 {ZCFlag, 0x80000000, 0x80000000}, 386 {ZCFlag, 0x0000007e, 0x0000007e}, 387 {NVFlag, 0x7fffffff, 0x7fffffff}, 388 {NZFlag, 0x7ffffffe, 0x7ffffffe}, 389 {CFlag, 0xffff8002, 0xffff8002}, 390 {NCFlag, 0x80000000, 0x80000000}, 391 {VFlag, 0x7fffffff, 0x7fffffff}, 392 {NZFlag, 0xffffffff, 0xffffffff}, 393 {NFlag, 0x7ffffffd, 0x7ffffffd}, 394 {ZFlag, 0x00000002, 0x00000002}, 395 {ZCVFlag, 0xffff8003, 0xffff8003}, 396 {CFlag, 0x7fffffff, 0x7fffffff}, 397 {CFlag, 0x0000007f, 0x0000007f}, 398 {VFlag, 0x80000001, 0x80000001}, 399 {ZCFlag, 0x00007fff, 0x00007fff}, 400 {CFlag, 0xfffffffd, 0xfffffffd}, 401 {NZFlag, 0x7fffffff, 0x7fffffff}, 402 {CVFlag, 0xffff8001, 0xffff8001}, 403 {NZVFlag, 0x00007fff, 0x00007fff}, 404 {NZVFlag, 0x7ffffffe, 0x7ffffffe}, 405 {ZCVFlag, 0x0000007e, 0x0000007e}, 406 {NZVFlag, 0x00000001, 0x00000001}, 407 {ZFlag, 0xffffffff, 0xffffffff}, 408 {NZFlag, 0xfffffffe, 0xfffffffe}, 409 {NZCVFlag, 0x0000007f, 0x0000007f}, 410 {NZCVFlag, 0x80000000, 0x80000000}, 411 {VFlag, 0x55555555, 0x55555555}, 412 {NVFlag, 0xffff8001, 0xffff8001}, 413 {NFlag, 0xffffff83, 0xffffff83}, 414 {NZVFlag, 0x7ffffffd, 0x7ffffffd}, 415 {ZVFlag, 0x00000000, 0x00000000}, 416 {NCVFlag, 0xfffffffd, 0xfffffffd}, 417 {CFlag, 0x00007ffe, 0x00007ffe}, 418 {NVFlag, 0xffffff83, 0xffffff83}, 419 {NZFlag, 0x0000007e, 0x0000007e}, 420 {VFlag, 0x80000000, 0x80000000}, 421 {NZCFlag, 0xffff8000, 0xffff8000}, 422 {ZCFlag, 0xffff8001, 0xffff8001}, 423 {NVFlag, 0x00007fff, 0x00007fff}, 424 {ZCVFlag, 0xffffff81, 0xffffff81}, 425 {NZVFlag, 0x0000007e, 0x0000007e}, 426 {CVFlag, 0xffff8000, 0xffff8000}, 427 {VFlag, 0xffffff82, 0xffffff82}, 428 {VFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 429 {NZCVFlag, 0xcccccccc, 0xcccccccc}, 430 {CVFlag, 0x33333333, 0x33333333}, 431 {NCFlag, 0xffffffff, 0xffffffff}, 432 {VFlag, 0xffffff80, 0xffffff80}, 433 {NVFlag, 0xffff8002, 0xffff8002}, 434 {ZCFlag, 0x00000000, 0x00000000}, 435 {ZCVFlag, 0x80000001, 0x80000001}, 436 {NZCVFlag, 0x80000001, 0x80000001}, 437 {NCFlag, 0x55555555, 0x55555555}, 438 {CVFlag, 0x7ffffffe, 0x7ffffffe}, 439 {ZVFlag, 0x7ffffffd, 0x7ffffffd}, 440 {ZCVFlag, 0xffff8000, 0xffff8000}, 441 {ZCFlag, 0xffff8002, 0xffff8002}, 442 {NFlag, 0xfffffffe, 0xfffffffe}, 443 {ZCVFlag, 0x0000007f, 0x0000007f}, 444 {NCVFlag, 0xfffffffe, 0xfffffffe}, 445 {ZCVFlag, 0x7fffffff, 0x7fffffff}, 446 {CVFlag, 0x0000007e, 0x0000007e}, 447 {NZCVFlag, 0x7ffffffe, 0x7ffffffe}, 448 {CFlag, 0xffffff80, 0xffffff80}, 449 {VFlag, 0x00007ffd, 0x00007ffd}, 450 {CVFlag, 0xffffffe0, 0xffffffe0}, 451 {CFlag, 0x7ffffffe, 0x7ffffffe}, 452 {CFlag, 0x80000000, 0x80000000}, 453 {CVFlag, 0xfffffffe, 0xfffffffe}, 454 {NCVFlag, 0xffff8002, 0xffff8002}, 455 {ZCVFlag, 0x33333333, 0x33333333}, 456 {NZCFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 457 {NVFlag, 0x55555555, 0x55555555}, 458 {NVFlag, 0x80000000, 0x80000000}, 459 {NZCVFlag, 0x00007ffe, 0x00007ffe}, 460 {ZFlag, 0xffffff83, 0xffffff83}, 461 {NCFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 462 {NZVFlag, 0xfffffffe, 0xfffffffe}, 463 {CVFlag, 0xaaaaaaaa, 0xaaaaaaaa}, 464 {NZCFlag, 0xffff8002, 0xffff8002}, 465 {VFlag, 0x0000007d, 0x0000007d}}; 466 467 static const Inputs kRdIsNotRn[] = {{NZCVFlag, 0xffff8000, 0xffffffff}, 468 {CVFlag, 0xcccccccc, 0xffffff80}, 469 {NCFlag, 0xfffffffe, 0xfffffffd}, 470 {NCFlag, 0xcccccccc, 0xcccccccc}, 471 {ZFlag, 0x80000001, 0xffffffff}, 472 {NCFlag, 0xffffff82, 0x0000007d}, 473 {NCVFlag, 0x0000007d, 0xffff8001}, 474 {NVFlag, 0x00007fff, 0x7fffffff}, 475 {NVFlag, 0x80000001, 0xffffff82}, 476 {ZCVFlag, 0xffffffff, 0x0000007e}, 477 {ZCVFlag, 0xffffff80, 0x0000007d}, 478 {ZCVFlag, 0x00000020, 0xaaaaaaaa}, 479 {CVFlag, 0x00007fff, 0x00000020}, 480 {NVFlag, 0xffff8000, 0xffffff82}, 481 {NZFlag, 0xffffff82, 0x7ffffffe}, 482 {NZVFlag, 0xffff8003, 0x33333333}, 483 {ZCVFlag, 0x00007ffe, 0x7ffffffe}, 484 {NFlag, 0x0000007f, 0xffffffff}, 485 {NZCFlag, 0x33333333, 0x80000000}, 486 {ZCFlag, 0x80000001, 0xffffffff}, 487 {VFlag, 0x00007ffd, 0x00000001}, 488 {ZVFlag, 0xffffffff, 0x0000007e}, 489 {NZFlag, 0x00000001, 0xcccccccc}, 490 {NZVFlag, 0x00000020, 0xffff8001}, 491 {NCVFlag, 0x7ffffffe, 0xffffff80}, 492 {ZCFlag, 0x33333333, 0x00007fff}, 493 {CFlag, 0xffffff82, 0x0000007e}, 494 {ZCFlag, 0x55555555, 0xffff8003}, 495 {NFlag, 0x0000007f, 0x00000001}, 496 {ZCVFlag, 0x00000020, 0xfffffffd}, 497 {ZVFlag, 0x0000007e, 0xffff8003}, 498 {ZCVFlag, 0x00000020, 0x80000001}, 499 {ZCFlag, 0xfffffffe, 0x55555555}, 500 {NFlag, 0xfffffffd, 0xfffffffe}, 501 {VFlag, 0xffffff82, 0x7ffffffe}, 502 {CVFlag, 0xffffff80, 0x0000007f}, 503 {NVFlag, 0x00000020, 0xffff8001}, 504 {NCFlag, 0x0000007d, 0x80000000}, 505 {CVFlag, 0x00000020, 0xffffff83}, 506 {NZCVFlag, 0x0000007f, 0x00000000}, 507 {ZVFlag, 0xffffff82, 0x7ffffffd}, 508 {ZVFlag, 0xffff8000, 0x80000001}, 509 {NFlag, 0xcccccccc, 0x0000007e}, 510 {NFlag, 0x55555555, 0xffffff80}, 511 {NCFlag, 0x80000000, 0x00007ffd}, 512 {ZVFlag, 0x00007ffd, 0x00007ffe}, 513 {ZCVFlag, 0x00000000, 0x7ffffffe}, 514 {ZFlag, 0xffff8001, 0xffffffff}, 515 {NCFlag, 0xfffffffe, 0x55555555}, 516 {VFlag, 0x7ffffffd, 0x80000001}, 517 {VFlag, 0x80000000, 0xffffffff}, 518 {CFlag, 0xffffff82, 0xffffff80}, 519 {NZCFlag, 0xffff8003, 0xfffffffd}, 520 {CFlag, 0x00000020, 0x00007fff}, 521 {NZVFlag, 0xffff8002, 0xfffffffe}, 522 {NVFlag, 0xffffff80, 0x0000007e}, 523 {NVFlag, 0xcccccccc, 0x0000007d}, 524 {CFlag, 0x0000007f, 0x00000001}, 525 {ZVFlag, 0xffff8002, 0xffffff81}, 526 {NZVFlag, 0x80000000, 0x00007ffe}, 527 {NZCVFlag, 0x80000000, 0x7ffffffe}, 528 {ZVFlag, 0x7ffffffe, 0x80000000}, 529 {ZFlag, 0xffff8000, 0xffffff80}, 530 {VFlag, 0x00007ffd, 0x00007ffd}, 531 {ZCFlag, 0x0000007d, 0x0000007e}, 532 {NCFlag, 0x00000000, 0x7ffffffe}, 533 {NVFlag, 0x00000020, 0xaaaaaaaa}, 534 {NVFlag, 0xffffff83, 0x0000007e}, 535 {NZFlag, 0xffff8002, 0x7ffffffd}, 536 {CVFlag, 0xcccccccc, 0x00000001}, 537 {NZFlag, 0x33333333, 0x0000007e}, 538 {NZCFlag, 0x00000002, 0x7ffffffd}, 539 {NZFlag, 0x00007ffd, 0xffffff80}, 540 {ZVFlag, 0x00007ffd, 0xfffffffe}, 541 {NZCVFlag, 0xffff8000, 0x80000000}, 542 {NZFlag, 0xffff8002, 0xffffffff}, 543 {CFlag, 0x00000002, 0xffff8000}, 544 {NZCFlag, 0x0000007d, 0xffffff80}, 545 {ZVFlag, 0x0000007d, 0xffff8003}, 546 {VFlag, 0x55555555, 0xffff8000}, 547 {CFlag, 0x00007fff, 0x00000001}, 548 {VFlag, 0x80000001, 0x33333333}, 549 {ZCFlag, 0xaaaaaaaa, 0xffffff82}, 550 {VFlag, 0x00000002, 0x00007ffd}, 551 {ZVFlag, 0x7ffffffe, 0xffff8001}, 552 {ZCFlag, 0x7fffffff, 0x00000000}, 553 {CVFlag, 0x55555555, 0x0000007e}, 554 {VFlag, 0x55555555, 0x0000007e}, 555 {NZCVFlag, 0x80000000, 0x7ffffffd}, 556 {ZFlag, 0x0000007d, 0x00000000}, 557 {NZVFlag, 0xffffff80, 0x00000002}, 558 {NVFlag, 0xfffffffd, 0x00000001}, 559 {ZVFlag, 0x7ffffffd, 0xfffffffd}, 560 {VFlag, 0xffff8002, 0x55555555}, 561 {ZCVFlag, 0x00000001, 0xffff8002}, 562 {NVFlag, 0xffff8002, 0x00000020}, 563 {ZFlag, 0x33333333, 0xffff8002}, 564 {ZCVFlag, 0x55555555, 0xffffff82}, 565 {CVFlag, 0x7ffffffe, 0xffffffe0}, 566 {NVFlag, 0xcccccccc, 0x00007ffd}, 567 {NZFlag, 0x00000001, 0x0000007f}, 568 {ZFlag, 0xfffffffe, 0x00007fff}, 569 {NCVFlag, 0x80000001, 0xffffff83}, 570 {NCVFlag, 0xaaaaaaaa, 0xffff8002}, 571 {ZVFlag, 0x00007fff, 0xffff8000}, 572 {ZFlag, 0xffff8001, 0xfffffffd}, 573 {CFlag, 0x55555555, 0x80000000}, 574 {ZCVFlag, 0xcccccccc, 0xfffffffe}, 575 {NZCVFlag, 0xffff8003, 0x7fffffff}, 576 {NZCVFlag, 0x00007ffe, 0xffffff81}, 577 {NZCFlag, 0xfffffffd, 0xaaaaaaaa}, 578 {NVFlag, 0x00000002, 0x00000020}, 579 {ZCVFlag, 0xffff8003, 0xfffffffd}, 580 {NFlag, 0xffff8001, 0x00007ffe}, 581 {ZCFlag, 0xaaaaaaaa, 0x00000002}, 582 {NCVFlag, 0xffff8000, 0xfffffffe}, 583 {CFlag, 0x00000020, 0x00000000}, 584 {NZVFlag, 0x00007ffd, 0xffffff81}, 585 {NVFlag, 0x00007fff, 0x00000020}, 586 {ZFlag, 0x0000007e, 0x80000001}, 587 {CVFlag, 0x0000007d, 0xaaaaaaaa}, 588 {NZVFlag, 0x7fffffff, 0x55555555}, 589 {VFlag, 0xffffffff, 0x00007ffd}, 590 {NFlag, 0x80000000, 0xffffffe0}, 591 {ZVFlag, 0xffffff82, 0xfffffffe}, 592 {CVFlag, 0x0000007d, 0x00007fff}, 593 {CFlag, 0x7ffffffe, 0x55555555}, 594 {ZFlag, 0xffffff82, 0x7fffffff}, 595 {NZCFlag, 0xfffffffd, 0xffffff83}, 596 {CVFlag, 0x80000001, 0x80000000}, 597 {ZVFlag, 0x00000001, 0xfffffffe}, 598 {CVFlag, 0x00000001, 0x33333333}, 599 {NZFlag, 0x7ffffffd, 0x80000000}, 600 {NZVFlag, 0x00007ffd, 0xaaaaaaaa}, 601 {CVFlag, 0x0000007e, 0xffffff82}, 602 {CVFlag, 0x7ffffffe, 0xffff8002}, 603 {NVFlag, 0xfffffffe, 0xffff8003}, 604 {NFlag, 0x7fffffff, 0x80000001}, 605 {CFlag, 0xffffff82, 0x00000002}, 606 {CVFlag, 0xcccccccc, 0x0000007e}, 607 {NZCVFlag, 0x00000001, 0x7ffffffe}, 608 {NFlag, 0x00000000, 0x55555555}, 609 {NZFlag, 0xffffff81, 0x00000000}, 610 {NZVFlag, 0xffffffe0, 0x0000007e}, 611 {ZCFlag, 0xffff8002, 0xaaaaaaaa}, 612 {NZVFlag, 0x7fffffff, 0x0000007d}, 613 {ZVFlag, 0x0000007e, 0xffff8001}, 614 {NCVFlag, 0xffffff83, 0xaaaaaaaa}, 615 {ZFlag, 0xffffff82, 0xffffff83}, 616 {VFlag, 0x00000001, 0x55555555}, 617 {NFlag, 0x00000020, 0x80000000}, 618 {NZFlag, 0x00000000, 0xfffffffe}, 619 {VFlag, 0xffffff83, 0xaaaaaaaa}, 620 {ZFlag, 0xffff8002, 0xffffff83}, 621 {NZVFlag, 0xcccccccc, 0x7ffffffe}, 622 {ZVFlag, 0x00000000, 0x55555555}, 623 {NCFlag, 0x33333333, 0xffff8003}, 624 {NZCVFlag, 0xfffffffd, 0x00000000}, 625 {NZCVFlag, 0x00000020, 0xffff8000}, 626 {CVFlag, 0xffff8001, 0xffffff83}, 627 {CFlag, 0xffffff83, 0x33333333}, 628 {CVFlag, 0x7ffffffd, 0x00000020}, 629 {NCVFlag, 0xffffffe0, 0x80000000}, 630 {NCVFlag, 0xffffff82, 0xcccccccc}, 631 {NZCVFlag, 0xaaaaaaaa, 0x00007fff}, 632 {VFlag, 0xcccccccc, 0xffff8003}, 633 {ZCVFlag, 0x55555555, 0xffffffe0}, 634 {NZCFlag, 0xffffff83, 0xffff8000}, 635 {ZVFlag, 0xffff8001, 0x0000007d}, 636 {CVFlag, 0xffffff83, 0x00000002}, 637 {NVFlag, 0x7fffffff, 0x0000007d}, 638 {VFlag, 0x55555555, 0x33333333}, 639 {NCVFlag, 0x00000002, 0xffffff80}, 640 {ZFlag, 0xfffffffd, 0x00007fff}, 641 {ZCFlag, 0xffff8003, 0x0000007d}, 642 {NZCFlag, 0xffff8002, 0xffff8000}, 643 {NCVFlag, 0x00000020, 0xffff8002}, 644 {ZVFlag, 0xffff8000, 0x00000020}, 645 {ZCVFlag, 0x0000007f, 0xffffffe0}, 646 {NZCFlag, 0xffffff80, 0x33333333}, 647 {NCVFlag, 0x00007fff, 0xaaaaaaaa}, 648 {ZCVFlag, 0x00000020, 0xffffff82}, 649 {NFlag, 0x00000000, 0x0000007d}, 650 {NCVFlag, 0x00000001, 0x00007ffe}, 651 {ZFlag, 0x80000001, 0x00000002}, 652 {NZVFlag, 0xffff8000, 0x00000020}, 653 {CVFlag, 0xffff8002, 0xcccccccc}, 654 {NVFlag, 0xffffff83, 0x80000000}, 655 {ZCFlag, 0x0000007f, 0xffffff80}, 656 {NZFlag, 0xcccccccc, 0xffffffff}, 657 {NZFlag, 0x00007fff, 0x0000007f}, 658 {NZFlag, 0xfffffffd, 0xffff8001}, 659 {CFlag, 0x0000007d, 0x7ffffffd}, 660 {ZCFlag, 0xffff8000, 0xffff8003}, 661 {ZVFlag, 0xffffffff, 0xffffffe0}, 662 {NZCFlag, 0x00007ffd, 0xcccccccc}, 663 {NCVFlag, 0x0000007d, 0x00000020}, 664 {ZCFlag, 0xaaaaaaaa, 0x80000000}, 665 {ZCVFlag, 0xfffffffd, 0x0000007d}, 666 {ZFlag, 0xffffffe0, 0xfffffffe}, 667 {VFlag, 0xffff8003, 0x80000000}, 668 {NZCFlag, 0x00007fff, 0xffffff82}, 669 {NCVFlag, 0x00000002, 0x33333333}, 670 {NZCVFlag, 0x00000000, 0xffffff82}, 671 {VFlag, 0x80000000, 0x80000000}, 672 {ZVFlag, 0x80000001, 0x33333333}, 673 {ZFlag, 0x7ffffffe, 0x00007fff}, 674 {NZCVFlag, 0x7fffffff, 0x00007fff}, 675 {ZCFlag, 0xffffff83, 0xaaaaaaaa}, 676 {NZVFlag, 0xffff8002, 0xffffffe0}, 677 {VFlag, 0xfffffffd, 0xffffff81}, 678 {NZFlag, 0x7fffffff, 0x7ffffffd}, 679 {NZCVFlag, 0x0000007f, 0xcccccccc}, 680 {NZCFlag, 0xffff8001, 0x00000020}, 681 {ZFlag, 0x00000020, 0xffff8002}, 682 {ZVFlag, 0x55555555, 0x00007ffd}, 683 {NZVFlag, 0xcccccccc, 0x33333333}, 684 {CFlag, 0x80000000, 0x80000000}, 685 {ZCVFlag, 0xcccccccc, 0x00007ffd}, 686 {ZFlag, 0xffff8002, 0xffffff80}, 687 {CVFlag, 0x7ffffffd, 0xffffff80}, 688 {NZCVFlag, 0x00000001, 0x00000001}, 689 {NFlag, 0xfffffffe, 0xffffffe0}, 690 {ZVFlag, 0x0000007e, 0x0000007f}, 691 {NCVFlag, 0xffff8002, 0xffff8002}, 692 {ZCVFlag, 0xffffff82, 0x80000001}, 693 {CVFlag, 0x0000007d, 0x0000007d}, 694 {NZVFlag, 0xcccccccc, 0xffffff83}, 695 {VFlag, 0xffffff82, 0xfffffffd}, 696 {CFlag, 0x0000007d, 0x0000007f}, 697 {NFlag, 0x0000007d, 0x00000001}, 698 {NVFlag, 0x00007ffd, 0xfffffffe}, 699 {NZVFlag, 0x33333333, 0xffffff80}, 700 {NVFlag, 0x0000007e, 0x00007ffe}, 701 {ZFlag, 0xffff8001, 0x0000007e}, 702 {VFlag, 0x80000000, 0x00000002}, 703 {NVFlag, 0x00000020, 0x00007ffe}, 704 {CFlag, 0x00007ffe, 0x0000007f}, 705 {ZCFlag, 0xffff8002, 0x00000020}, 706 {NCVFlag, 0x00000001, 0xffff8000}, 707 {NZCVFlag, 0x0000007e, 0xffff8001}, 708 {ZCFlag, 0x0000007f, 0xffffff81}, 709 {ZVFlag, 0xfffffffd, 0x00007ffd}, 710 {NCFlag, 0x0000007d, 0xcccccccc}, 711 {NZFlag, 0xfffffffd, 0xfffffffe}, 712 {ZCFlag, 0xffff8003, 0x80000000}, 713 {CFlag, 0x0000007d, 0xffff8002}, 714 {ZVFlag, 0x0000007f, 0x00007ffe}, 715 {NCVFlag, 0xffff8002, 0x00000001}, 716 {ZCFlag, 0x80000001, 0x0000007e}, 717 {NCFlag, 0x00000000, 0xaaaaaaaa}, 718 {ZCVFlag, 0x33333333, 0x80000001}, 719 {CFlag, 0x80000000, 0x0000007d}, 720 {NCVFlag, 0x80000001, 0x80000000}, 721 {ZCVFlag, 0x7ffffffe, 0xffffff82}, 722 {ZCFlag, 0xfffffffd, 0xffff8000}, 723 {ZFlag, 0x80000000, 0x55555555}, 724 {ZVFlag, 0x0000007d, 0xffff8000}, 725 {ZCFlag, 0x80000001, 0xffff8001}, 726 {NVFlag, 0xffff8002, 0x00007ffe}, 727 {ZCFlag, 0x00000000, 0xffff8000}, 728 {CFlag, 0xffffff81, 0xffffffff}, 729 {CFlag, 0xffffffff, 0x80000001}, 730 {CFlag, 0x80000001, 0x7ffffffd}, 731 {ZFlag, 0x80000001, 0x00007fff}, 732 {ZVFlag, 0xffff8002, 0xffff8001}, 733 {NZFlag, 0x80000000, 0x00007ffd}, 734 {NZCFlag, 0x33333333, 0xcccccccc}, 735 {ZCFlag, 0xffffffff, 0x33333333}, 736 {VFlag, 0x80000001, 0x55555555}, 737 {CFlag, 0xffffff82, 0x00000001}, 738 {ZVFlag, 0xffff8003, 0xffff8001}, 739 {NCVFlag, 0xffff8003, 0xffffffe0}, 740 {ZCVFlag, 0xffffffe0, 0x7ffffffd}, 741 {NFlag, 0xffff8003, 0x7ffffffe}, 742 {VFlag, 0xffffffff, 0x00000001}, 743 {CVFlag, 0xcccccccc, 0xfffffffe}, 744 {NZVFlag, 0xffff8003, 0x0000007f}, 745 {NZVFlag, 0x0000007d, 0x00000002}, 746 {NVFlag, 0x0000007d, 0x00000000}, 747 {NVFlag, 0x00000002, 0xffff8002}, 748 {ZCVFlag, 0xffff8001, 0xfffffffd}, 749 {CVFlag, 0x00007fff, 0x0000007d}, 750 {NCFlag, 0x33333333, 0x00000002}, 751 {NCVFlag, 0xcccccccc, 0xaaaaaaaa}, 752 {CVFlag, 0x80000000, 0x00007ffd}, 753 {NZFlag, 0xffffff81, 0x55555555}, 754 {CFlag, 0xffff8003, 0x33333333}, 755 {NZCVFlag, 0xffffffe0, 0xffffff82}, 756 {NVFlag, 0x80000001, 0xfffffffd}, 757 {CFlag, 0xffff8000, 0x33333333}, 758 {NCVFlag, 0xffff8003, 0x0000007f}, 759 {CFlag, 0x00000000, 0x0000007d}, 760 {NVFlag, 0x0000007e, 0xcccccccc}, 761 {NZFlag, 0x7ffffffe, 0xffffffe0}, 762 {ZVFlag, 0xffffffe0, 0xffffff82}, 763 {ZCVFlag, 0x80000001, 0x55555555}, 764 {NZFlag, 0xcccccccc, 0xffff8001}, 765 {NFlag, 0x55555555, 0x00000020}, 766 {ZVFlag, 0x00007ffd, 0xffffff83}}; 767 768 static const Inputs kImmediate[] = {{CFlag, 0xabababab, 0xffffff82}, 769 {CVFlag, 0xabababab, 0x0000007f}, 770 {NFlag, 0xabababab, 0x80000001}, 771 {NZFlag, 0xabababab, 0xfffffffd}, 772 {VFlag, 0xabababab, 0x7ffffffd}, 773 {CFlag, 0xabababab, 0x7ffffffe}, 774 {ZFlag, 0xabababab, 0xaaaaaaaa}, 775 {NZVFlag, 0xabababab, 0x0000007e}, 776 {NZVFlag, 0xabababab, 0x80000001}, 777 {CFlag, 0xabababab, 0xffffff81}, 778 {NZVFlag, 0xabababab, 0xfffffffd}, 779 {NZFlag, 0xabababab, 0x00007fff}, 780 {VFlag, 0xabababab, 0x00000001}, 781 {CVFlag, 0xabababab, 0xffffffff}, 782 {NZCVFlag, 0xabababab, 0xffffffff}, 783 {CFlag, 0xabababab, 0x00000000}, 784 {NZFlag, 0xabababab, 0xffffff83}, 785 {NCFlag, 0xabababab, 0x0000007e}, 786 {NZCVFlag, 0xabababab, 0x7fffffff}, 787 {ZCVFlag, 0xabababab, 0x00000002}, 788 {CFlag, 0xabababab, 0x80000000}, 789 {NZCFlag, 0xabababab, 0x7ffffffd}, 790 {ZFlag, 0xabababab, 0xffff8000}, 791 {CFlag, 0xabababab, 0x7ffffffd}, 792 {NVFlag, 0xabababab, 0x55555555}, 793 {NZCFlag, 0xabababab, 0xfffffffd}, 794 {CVFlag, 0xabababab, 0xaaaaaaaa}, 795 {NZCVFlag, 0xabababab, 0xffff8003}, 796 {NZFlag, 0xabababab, 0xffffffe0}, 797 {NZCFlag, 0xabababab, 0x00007ffd}, 798 {ZCVFlag, 0xabababab, 0xffffff80}, 799 {NZFlag, 0xabababab, 0x7ffffffd}, 800 {ZCFlag, 0xabababab, 0x7fffffff}, 801 {ZVFlag, 0xabababab, 0xffffff81}, 802 {VFlag, 0xabababab, 0x7fffffff}, 803 {NCVFlag, 0xabababab, 0xcccccccc}, 804 {ZVFlag, 0xabababab, 0x00007fff}, 805 {NZFlag, 0xabababab, 0x00000002}, 806 {NVFlag, 0xabababab, 0x00000002}, 807 {ZVFlag, 0xabababab, 0xffff8002}, 808 {NZVFlag, 0xabababab, 0x00000020}, 809 {ZCVFlag, 0xabababab, 0xaaaaaaaa}, 810 {ZCFlag, 0xabababab, 0x00000000}, 811 {NZCVFlag, 0xabababab, 0xaaaaaaaa}, 812 {NZFlag, 0xabababab, 0xfffffffe}, 813 {NZCFlag, 0xabababab, 0xffffffe0}, 814 {NFlag, 0xabababab, 0xaaaaaaaa}, 815 {ZVFlag, 0xabababab, 0xffffff80}, 816 {VFlag, 0xabababab, 0x0000007f}, 817 {ZVFlag, 0xabababab, 0x33333333}, 818 {NZFlag, 0xabababab, 0x00007ffd}, 819 {NCFlag, 0xabababab, 0x00000002}, 820 {NVFlag, 0xabababab, 0x00007ffd}, 821 {ZFlag, 0xabababab, 0x00000001}, 822 {CVFlag, 0xabababab, 0x7fffffff}, 823 {CFlag, 0xabababab, 0xaaaaaaaa}, 824 {NZCVFlag, 0xabababab, 0x80000001}, 825 {CVFlag, 0xabababab, 0x00000002}, 826 {ZVFlag, 0xabababab, 0x0000007e}, 827 {VFlag, 0xabababab, 0xffffffff}, 828 {NCFlag, 0xabababab, 0x00000001}, 829 {NZCFlag, 0xabababab, 0xcccccccc}, 830 {CVFlag, 0xabababab, 0x80000001}, 831 {NVFlag, 0xabababab, 0xffffff82}, 832 {NZCVFlag, 0xabababab, 0x0000007e}, 833 {CFlag, 0xabababab, 0xffffffe0}, 834 {ZCFlag, 0xabababab, 0xffff8002}, 835 {NZVFlag, 0xabababab, 0x7fffffff}, 836 {NZVFlag, 0xabababab, 0x33333333}, 837 {NZCFlag, 0xabababab, 0x0000007d}, 838 {NFlag, 0xabababab, 0x7ffffffe}, 839 {ZCVFlag, 0xabababab, 0xcccccccc}, 840 {ZCFlag, 0xabababab, 0xfffffffe}, 841 {NVFlag, 0xabababab, 0x00007ffe}, 842 {NZFlag, 0xabababab, 0x00007ffe}, 843 {NCVFlag, 0xabababab, 0xffffff82}, 844 {NZVFlag, 0xabababab, 0x00000002}, 845 {ZVFlag, 0xabababab, 0x7fffffff}, 846 {NZCFlag, 0xabababab, 0xffff8001}, 847 {VFlag, 0xabababab, 0xffffff83}, 848 {ZCVFlag, 0xabababab, 0x0000007e}, 849 {NZCFlag, 0xabababab, 0xffffff83}, 850 {NCFlag, 0xabababab, 0x00007fff}, 851 {NCVFlag, 0xabababab, 0x7ffffffe}, 852 {CFlag, 0xabababab, 0x00000020}, 853 {NFlag, 0xabababab, 0x00007ffd}, 854 {NZFlag, 0xabababab, 0x7fffffff}, 855 {NZCFlag, 0xabababab, 0xffff8002}, 856 {ZVFlag, 0xabababab, 0x0000007f}, 857 {NZVFlag, 0xabababab, 0xffffff83}, 858 {NZVFlag, 0xabababab, 0xffffffff}, 859 {ZFlag, 0xabababab, 0x80000000}, 860 {ZVFlag, 0xabababab, 0xffffff82}, 861 {ZVFlag, 0xabababab, 0x80000000}, 862 {NZFlag, 0xabababab, 0xaaaaaaaa}, 863 {CFlag, 0xabababab, 0xfffffffe}, 864 {NZCVFlag, 0xabababab, 0x00000000}, 865 {VFlag, 0xabababab, 0x80000001}, 866 {ZCVFlag, 0xabababab, 0xfffffffd}, 867 {NFlag, 0xabababab, 0xffffffff}, 868 {VFlag, 0xabababab, 0xcccccccc}, 869 {NFlag, 0xabababab, 0xffff8003}, 870 {NZVFlag, 0xabababab, 0xfffffffe}, 871 {CVFlag, 0xabababab, 0xffff8001}, 872 {NZVFlag, 0xabababab, 0x00007fff}, 873 {VFlag, 0xabababab, 0x33333333}, 874 {ZCVFlag, 0xabababab, 0x00007ffd}, 875 {NCFlag, 0xabababab, 0xfffffffe}, 876 {ZVFlag, 0xabababab, 0xffffff83}, 877 {NFlag, 0xabababab, 0x00007fff}, 878 {NVFlag, 0xabababab, 0x80000000}, 879 {NCVFlag, 0xabababab, 0xffffff80}, 880 {ZFlag, 0xabababab, 0x7fffffff}, 881 {NFlag, 0xabababab, 0x00000020}, 882 {NFlag, 0xabababab, 0x7ffffffd}, 883 {NFlag, 0xabababab, 0x0000007f}, 884 {NZCVFlag, 0xabababab, 0x00000020}, 885 {NCVFlag, 0xabababab, 0xfffffffe}, 886 {ZVFlag, 0xabababab, 0xcccccccc}, 887 {NCFlag, 0xabababab, 0xffffffe0}, 888 {CVFlag, 0xabababab, 0xffffff82}, 889 {NCFlag, 0xabababab, 0x00000000}, 890 {VFlag, 0xabababab, 0xffff8000}, 891 {VFlag, 0xabababab, 0xffff8003}, 892 {NCFlag, 0xabababab, 0xffffffff}, 893 {NZCFlag, 0xabababab, 0x55555555}, 894 {ZVFlag, 0xabababab, 0xfffffffe}, 895 {NZFlag, 0xabababab, 0x7ffffffe}, 896 {ZCVFlag, 0xabababab, 0x7ffffffe}, 897 {ZVFlag, 0xabababab, 0xffffffe0}, 898 {NZCFlag, 0xabababab, 0x0000007e}, 899 {CFlag, 0xabababab, 0x7fffffff}, 900 {NZVFlag, 0xabababab, 0x55555555}, 901 {NZCVFlag, 0xabababab, 0xcccccccc}, 902 {ZCVFlag, 0xabababab, 0x80000000}, 903 {NFlag, 0xabababab, 0x55555555}, 904 {ZCVFlag, 0xabababab, 0xffffffe0}, 905 {NCFlag, 0xabababab, 0xffff8000}, 906 {NCFlag, 0xabababab, 0xffff8001}, 907 {NVFlag, 0xabababab, 0x7ffffffe}, 908 {ZVFlag, 0xabababab, 0x00007ffe}, 909 {NVFlag, 0xabababab, 0x00000020}, 910 {NFlag, 0xabababab, 0x7fffffff}, 911 {NZFlag, 0xabababab, 0x33333333}, 912 {ZCFlag, 0xabababab, 0xffff8001}, 913 {ZFlag, 0xabababab, 0xffffffe0}, 914 {VFlag, 0xabababab, 0xffffffe0}, 915 {VFlag, 0xabababab, 0xffffff80}, 916 {NCVFlag, 0xabababab, 0x80000000}, 917 {ZCFlag, 0xabababab, 0x55555555}, 918 {CFlag, 0xabababab, 0xffff8001}, 919 {CFlag, 0xabababab, 0xffff8002}, 920 {ZVFlag, 0xabababab, 0xffff8000}, 921 {CFlag, 0xabababab, 0x80000001}, 922 {NZCVFlag, 0xabababab, 0x0000007d}, 923 {NZCVFlag, 0xabababab, 0xfffffffd}, 924 {CVFlag, 0xabababab, 0xffffff81}, 925 {NVFlag, 0xabababab, 0xffff8002}, 926 {ZCFlag, 0xabababab, 0x7ffffffe}, 927 {ZCVFlag, 0xabababab, 0xffffff82}, 928 {ZCVFlag, 0xabababab, 0x33333333}, 929 {NCFlag, 0xabababab, 0x33333333}, 930 {NZCVFlag, 0xabababab, 0x00000002}, 931 {NFlag, 0xabababab, 0x00000001}, 932 {NVFlag, 0xabababab, 0xffff8003}, 933 {NZCVFlag, 0xabababab, 0x00000001}, 934 {CFlag, 0xabababab, 0xffff8003}, 935 {NVFlag, 0xabababab, 0x0000007e}, 936 {CVFlag, 0xabababab, 0x80000000}, 937 {ZFlag, 0xabababab, 0xffffffff}, 938 {NFlag, 0xabababab, 0xfffffffd}, 939 {NVFlag, 0xabababab, 0x00007fff}, 940 {NZCVFlag, 0xabababab, 0x7ffffffd}, 941 {NZVFlag, 0xabababab, 0x00000000}, 942 {NZCFlag, 0xabababab, 0xfffffffe}, 943 {ZVFlag, 0xabababab, 0x7ffffffe}, 944 {CFlag, 0xabababab, 0xffffffff}, 945 {ZCFlag, 0xabababab, 0xffffff82}, 946 {ZCFlag, 0xabababab, 0xffffff83}, 947 {ZCFlag, 0xabababab, 0x00000002}, 948 {NZFlag, 0xabababab, 0x0000007e}, 949 {NZCVFlag, 0xabababab, 0xffffffe0}, 950 {NZFlag, 0xabababab, 0x00000001}, 951 {ZVFlag, 0xabababab, 0x55555555}, 952 {ZCVFlag, 0xabababab, 0x00007fff}, 953 {NFlag, 0xabababab, 0x33333333}, 954 {ZFlag, 0xabababab, 0x00000000}, 955 {NVFlag, 0xabababab, 0x7fffffff}, 956 {ZVFlag, 0xabababab, 0xfffffffd}, 957 {ZFlag, 0xabababab, 0x00000020}, 958 {NCVFlag, 0xabababab, 0xfffffffd}, 959 {NZCFlag, 0xabababab, 0x80000000}, 960 {NVFlag, 0xabababab, 0x80000001}, 961 {ZFlag, 0xabababab, 0xffff8002}, 962 {NZCVFlag, 0xabababab, 0xffff8001}, 963 {NFlag, 0xabababab, 0xfffffffe}, 964 {ZVFlag, 0xabababab, 0x0000007d}, 965 {NCFlag, 0xabababab, 0x00007ffd}, 966 {NFlag, 0xabababab, 0xffff8001}, 967 {NZCFlag, 0xabababab, 0xaaaaaaaa}, 968 {NZCFlag, 0xabababab, 0x00000020}, 969 {ZCVFlag, 0xabababab, 0x7fffffff}, 970 {ZCVFlag, 0xabababab, 0x00000001}, 971 {NVFlag, 0xabababab, 0xcccccccc}, 972 {NFlag, 0xabababab, 0x80000000}, 973 {NFlag, 0xabababab, 0xffffffe0}, 974 {ZCFlag, 0xabababab, 0xffffffff}, 975 {CVFlag, 0xabababab, 0x00000000}, 976 {ZCFlag, 0xabababab, 0xffff8000}, 977 {ZCFlag, 0xabababab, 0x00007ffd}, 978 {NCFlag, 0xabababab, 0x0000007f}, 979 {ZVFlag, 0xabababab, 0x00000020}, 980 {VFlag, 0xabababab, 0xffff8002}, 981 {ZFlag, 0xabababab, 0xffffff81}, 982 {CVFlag, 0xabababab, 0xffff8003}, 983 {NFlag, 0xabababab, 0xffffff80}, 984 {NVFlag, 0xabababab, 0xaaaaaaaa}, 985 {CFlag, 0xabababab, 0x00000001}, 986 {ZCVFlag, 0xabababab, 0xffff8003}, 987 {NCFlag, 0xabababab, 0xfffffffd}, 988 {CVFlag, 0xabababab, 0xffffff83}, 989 {ZCFlag, 0xabababab, 0xfffffffd}, 990 {CVFlag, 0xabababab, 0x0000007d}, 991 {ZCVFlag, 0xabababab, 0xffffff83}, 992 {NCFlag, 0xabababab, 0xffffff81}, 993 {NFlag, 0xabababab, 0xffff8000}, 994 {NZFlag, 0xabababab, 0x80000001}, 995 {NCFlag, 0xabababab, 0x55555555}, 996 {NCVFlag, 0xabababab, 0xaaaaaaaa}, 997 {NZCFlag, 0xabababab, 0xffffffff}, 998 {ZFlag, 0xabababab, 0x33333333}, 999 {NCFlag, 0xabababab, 0xffffff82}, 1000 {NZFlag, 0xabababab, 0xffff8001}, 1001 {VFlag, 0xabababab, 0x7ffffffe}, 1002 {NZCVFlag, 0xabababab, 0x7ffffffe}, 1003 {ZFlag, 0xabababab, 0x80000001}, 1004 {NVFlag, 0xabababab, 0xffffff80}, 1005 {NFlag, 0xabababab, 0x0000007e}, 1006 {NCVFlag, 0xabababab, 0x00007ffd}, 1007 {CFlag, 0xabababab, 0x0000007e}, 1008 {NZVFlag, 0xabababab, 0xcccccccc}, 1009 {NZVFlag, 0xabababab, 0x0000007f}, 1010 {ZFlag, 0xabababab, 0xffffff83}, 1011 {VFlag, 0xabababab, 0xaaaaaaaa}, 1012 {ZVFlag, 0xabababab, 0x7ffffffd}, 1013 {ZVFlag, 0xabababab, 0xffffffff}, 1014 {NZCVFlag, 0xabababab, 0x0000007f}, 1015 {NCVFlag, 0xabababab, 0x0000007e}, 1016 {NZVFlag, 0xabababab, 0xffffff82}, 1017 {CFlag, 0xabababab, 0xffffff80}, 1018 {NZCVFlag, 0xabababab, 0x80000000}, 1019 {NZVFlag, 0xabababab, 0x7ffffffe}, 1020 {NZFlag, 0xabababab, 0xffffff80}, 1021 {NZFlag, 0xabababab, 0xffff8000}, 1022 {NCFlag, 0xabababab, 0xaaaaaaaa}, 1023 {NFlag, 0xabababab, 0x00000000}, 1024 {NZFlag, 0xabababab, 0xcccccccc}, 1025 {ZCFlag, 0xabababab, 0xffffffe0}, 1026 {CVFlag, 0xabababab, 0xcccccccc}, 1027 {VFlag, 0xabababab, 0xfffffffd}, 1028 {CVFlag, 0xabababab, 0x7ffffffd}, 1029 {ZCFlag, 0xabababab, 0x00000020}, 1030 {CVFlag, 0xabababab, 0x00007ffe}, 1031 {ZCFlag, 0xabababab, 0xffffff80}, 1032 {NVFlag, 0xabababab, 0xfffffffd}, 1033 {NZCFlag, 0xabababab, 0x00000001}, 1034 {CVFlag, 0xabababab, 0x00000001}, 1035 {NVFlag, 0xabababab, 0xffffff83}, 1036 {ZCVFlag, 0xabababab, 0x7ffffffd}, 1037 {NZVFlag, 0xabababab, 0xffff8000}, 1038 {CVFlag, 0xabababab, 0xffffffe0}, 1039 {NCFlag, 0xabababab, 0x0000007d}, 1040 {VFlag, 0xabababab, 0x00007ffd}, 1041 {NZCFlag, 0xabababab, 0xffffff81}, 1042 {NCVFlag, 0xabababab, 0x00007fff}, 1043 {NVFlag, 0xabababab, 0x0000007f}, 1044 {CFlag, 0xabababab, 0xcccccccc}, 1045 {ZFlag, 0xabababab, 0xcccccccc}, 1046 {ZCFlag, 0xabababab, 0x80000000}, 1047 {VFlag, 0xabababab, 0x0000007d}, 1048 {NFlag, 0xabababab, 0xcccccccc}, 1049 {NCFlag, 0xabababab, 0x7fffffff}, 1050 {VFlag, 0xabababab, 0xffffff81}, 1051 {NCVFlag, 0xabababab, 0xffffffff}, 1052 {NZFlag, 0xabababab, 0xffff8002}, 1053 {NZVFlag, 0xabababab, 0x80000000}, 1054 {ZCVFlag, 0xabababab, 0x0000007f}, 1055 {ZFlag, 0xabababab, 0x0000007f}, 1056 {VFlag, 0xabababab, 0xffff8001}, 1057 {NVFlag, 0xabababab, 0x00000000}, 1058 {ZFlag, 0xabababab, 0x00007ffd}, 1059 {NCVFlag, 0xabababab, 0x80000001}, 1060 {NCVFlag, 0xabababab, 0xffff8002}, 1061 {NCFlag, 0xabababab, 0x7ffffffe}, 1062 {ZCFlag, 0xabababab, 0x7ffffffd}, 1063 {NZCFlag, 0xabababab, 0x80000001}, 1064 {ZCFlag, 0xabababab, 0x0000007f}, 1065 {VFlag, 0xabababab, 0x80000000}, 1066 {NCFlag, 0xabababab, 0x80000001}, 1067 {NVFlag, 0xabababab, 0xffffff81}}; 1068 1069 1070 // A loop will be generated for each element of this array. 1071 const TestLoopData kTests[] = {{{ne, r2, r2, 45}, 1072 "ne r2 r2 45", 1073 "RdIsRn_ne_r2_r2_45", 1074 ARRAY_SIZE(kRdIsRn), 1075 kRdIsRn}, 1076 {{cs, r6, r6, 59}, 1077 "cs r6 r6 59", 1078 "RdIsRn_cs_r6_r6_59", 1079 ARRAY_SIZE(kRdIsRn), 1080 kRdIsRn}, 1081 {{mi, r6, r6, 211}, 1082 "mi r6 r6 211", 1083 "RdIsRn_mi_r6_r6_211", 1084 ARRAY_SIZE(kRdIsRn), 1085 kRdIsRn}, 1086 {{lt, r5, r5, 36}, 1087 "lt r5 r5 36", 1088 "RdIsRn_lt_r5_r5_36", 1089 ARRAY_SIZE(kRdIsRn), 1090 kRdIsRn}, 1091 {{cc, r7, r7, 7}, 1092 "cc r7 r7 7", 1093 "RdIsRn_cc_r7_r7_7", 1094 ARRAY_SIZE(kRdIsRn), 1095 kRdIsRn}, 1096 {{cs, r7, r7, 215}, 1097 "cs r7 r7 215", 1098 "RdIsRn_cs_r7_r7_215", 1099 ARRAY_SIZE(kRdIsRn), 1100 kRdIsRn}, 1101 {{pl, r6, r6, 54}, 1102 "pl r6 r6 54", 1103 "RdIsRn_pl_r6_r6_54", 1104 ARRAY_SIZE(kRdIsRn), 1105 kRdIsRn}, 1106 {{lt, r6, r6, 221}, 1107 "lt r6 r6 221", 1108 "RdIsRn_lt_r6_r6_221", 1109 ARRAY_SIZE(kRdIsRn), 1110 kRdIsRn}, 1111 {{ne, r2, r2, 40}, 1112 "ne r2 r2 40", 1113 "RdIsRn_ne_r2_r2_40", 1114 ARRAY_SIZE(kRdIsRn), 1115 kRdIsRn}, 1116 {{hi, r5, r5, 158}, 1117 "hi r5 r5 158", 1118 "RdIsRn_hi_r5_r5_158", 1119 ARRAY_SIZE(kRdIsRn), 1120 kRdIsRn}, 1121 {{cs, r0, r0, 18}, 1122 "cs r0 r0 18", 1123 "RdIsRn_cs_r0_r0_18", 1124 ARRAY_SIZE(kRdIsRn), 1125 kRdIsRn}, 1126 {{ne, r3, r3, 205}, 1127 "ne r3 r3 205", 1128 "RdIsRn_ne_r3_r3_205", 1129 ARRAY_SIZE(kRdIsRn), 1130 kRdIsRn}, 1131 {{vc, r0, r0, 97}, 1132 "vc r0 r0 97", 1133 "RdIsRn_vc_r0_r0_97", 1134 ARRAY_SIZE(kRdIsRn), 1135 kRdIsRn}, 1136 {{hi, r2, r2, 197}, 1137 "hi r2 r2 197", 1138 "RdIsRn_hi_r2_r2_197", 1139 ARRAY_SIZE(kRdIsRn), 1140 kRdIsRn}, 1141 {{cs, r0, r0, 248}, 1142 "cs r0 r0 248", 1143 "RdIsRn_cs_r0_r0_248", 1144 ARRAY_SIZE(kRdIsRn), 1145 kRdIsRn}, 1146 {{ne, r4, r4, 108}, 1147 "ne r4 r4 108", 1148 "RdIsRn_ne_r4_r4_108", 1149 ARRAY_SIZE(kRdIsRn), 1150 kRdIsRn}, 1151 {{vs, r3, r3, 73}, 1152 "vs r3 r3 73", 1153 "RdIsRn_vs_r3_r3_73", 1154 ARRAY_SIZE(kRdIsRn), 1155 kRdIsRn}, 1156 {{ne, r7, r7, 230}, 1157 "ne r7 r7 230", 1158 "RdIsRn_ne_r7_r7_230", 1159 ARRAY_SIZE(kRdIsRn), 1160 kRdIsRn}, 1161 {{eq, r0, r0, 100}, 1162 "eq r0 r0 100", 1163 "RdIsRn_eq_r0_r0_100", 1164 ARRAY_SIZE(kRdIsRn), 1165 kRdIsRn}, 1166 {{mi, r5, r5, 211}, 1167 "mi r5 r5 211", 1168 "RdIsRn_mi_r5_r5_211", 1169 ARRAY_SIZE(kRdIsRn), 1170 kRdIsRn}, 1171 {{ge, r2, r3, 225}, 1172 "ge r2 r3 225", 1173 "RdIsNotRn_ge_r2_r3_225", 1174 ARRAY_SIZE(kRdIsNotRn), 1175 kRdIsNotRn}, 1176 {{vs, r3, r1, 64}, 1177 "vs r3 r1 64", 1178 "RdIsNotRn_vs_r3_r1_64", 1179 ARRAY_SIZE(kRdIsNotRn), 1180 kRdIsNotRn}, 1181 {{vs, r0, r1, 93}, 1182 "vs r0 r1 93", 1183 "RdIsNotRn_vs_r0_r1_93", 1184 ARRAY_SIZE(kRdIsNotRn), 1185 kRdIsNotRn}, 1186 {{ne, r5, r1, 247}, 1187 "ne r5 r1 247", 1188 "RdIsNotRn_ne_r5_r1_247", 1189 ARRAY_SIZE(kRdIsNotRn), 1190 kRdIsNotRn}, 1191 {{vs, r1, r7, 9}, 1192 "vs r1 r7 9", 1193 "RdIsNotRn_vs_r1_r7_9", 1194 ARRAY_SIZE(kRdIsNotRn), 1195 kRdIsNotRn}, 1196 {{le, r0, r2, 201}, 1197 "le r0 r2 201", 1198 "RdIsNotRn_le_r0_r2_201", 1199 ARRAY_SIZE(kRdIsNotRn), 1200 kRdIsNotRn}, 1201 {{vs, r6, r0, 176}, 1202 "vs r6 r0 176", 1203 "RdIsNotRn_vs_r6_r0_176", 1204 ARRAY_SIZE(kRdIsNotRn), 1205 kRdIsNotRn}, 1206 {{vc, r0, r1, 248}, 1207 "vc r0 r1 248", 1208 "RdIsNotRn_vc_r0_r1_248", 1209 ARRAY_SIZE(kRdIsNotRn), 1210 kRdIsNotRn}, 1211 {{al, r7, r6, 64}, 1212 "al r7 r6 64", 1213 "RdIsNotRn_al_r7_r6_64", 1214 ARRAY_SIZE(kRdIsNotRn), 1215 kRdIsNotRn}, 1216 {{al, r5, r7, 175}, 1217 "al r5 r7 175", 1218 "RdIsNotRn_al_r5_r7_175", 1219 ARRAY_SIZE(kRdIsNotRn), 1220 kRdIsNotRn}, 1221 {{al, r0, r4, 182}, 1222 "al r0 r4 182", 1223 "RdIsNotRn_al_r0_r4_182", 1224 ARRAY_SIZE(kRdIsNotRn), 1225 kRdIsNotRn}, 1226 {{ls, r7, r5, 58}, 1227 "ls r7 r5 58", 1228 "RdIsNotRn_ls_r7_r5_58", 1229 ARRAY_SIZE(kRdIsNotRn), 1230 kRdIsNotRn}, 1231 {{vc, r0, r7, 205}, 1232 "vc r0 r7 205", 1233 "RdIsNotRn_vc_r0_r7_205", 1234 ARRAY_SIZE(kRdIsNotRn), 1235 kRdIsNotRn}, 1236 {{pl, r1, r3, 135}, 1237 "pl r1 r3 135", 1238 "RdIsNotRn_pl_r1_r3_135", 1239 ARRAY_SIZE(kRdIsNotRn), 1240 kRdIsNotRn}, 1241 {{gt, r4, r3, 253}, 1242 "gt r4 r3 253", 1243 "RdIsNotRn_gt_r4_r3_253", 1244 ARRAY_SIZE(kRdIsNotRn), 1245 kRdIsNotRn}, 1246 {{al, r1, r7, 32}, 1247 "al r1 r7 32", 1248 "RdIsNotRn_al_r1_r7_32", 1249 ARRAY_SIZE(kRdIsNotRn), 1250 kRdIsNotRn}, 1251 {{eq, r1, r7, 139}, 1252 "eq r1 r7 139", 1253 "RdIsNotRn_eq_r1_r7_139", 1254 ARRAY_SIZE(kRdIsNotRn), 1255 kRdIsNotRn}, 1256 {{lt, r0, r5, 248}, 1257 "lt r0 r5 248", 1258 "RdIsNotRn_lt_r0_r5_248", 1259 ARRAY_SIZE(kRdIsNotRn), 1260 kRdIsNotRn}, 1261 {{hi, r0, r6, 89}, 1262 "hi r0 r6 89", 1263 "RdIsNotRn_hi_r0_r6_89", 1264 ARRAY_SIZE(kRdIsNotRn), 1265 kRdIsNotRn}, 1266 {{cc, r3, r5, 210}, 1267 "cc r3 r5 210", 1268 "RdIsNotRn_cc_r3_r5_210", 1269 ARRAY_SIZE(kRdIsNotRn), 1270 kRdIsNotRn}, 1271 {{cs, r0, r0, 187}, 1272 "cs r0 r0 187", 1273 "Immediate_cs_r0_r0_187", 1274 ARRAY_SIZE(kImmediate), 1275 kImmediate}, 1276 {{hi, r0, r0, 236}, 1277 "hi r0 r0 236", 1278 "Immediate_hi_r0_r0_236", 1279 ARRAY_SIZE(kImmediate), 1280 kImmediate}, 1281 {{eq, r0, r0, 133}, 1282 "eq r0 r0 133", 1283 "Immediate_eq_r0_r0_133", 1284 ARRAY_SIZE(kImmediate), 1285 kImmediate}, 1286 {{mi, r0, r0, 193}, 1287 "mi r0 r0 193", 1288 "Immediate_mi_r0_r0_193", 1289 ARRAY_SIZE(kImmediate), 1290 kImmediate}, 1291 {{cc, r0, r0, 73}, 1292 "cc r0 r0 73", 1293 "Immediate_cc_r0_r0_73", 1294 ARRAY_SIZE(kImmediate), 1295 kImmediate}, 1296 {{cs, r0, r0, 93}, 1297 "cs r0 r0 93", 1298 "Immediate_cs_r0_r0_93", 1299 ARRAY_SIZE(kImmediate), 1300 kImmediate}, 1301 {{ne, r0, r0, 130}, 1302 "ne r0 r0 130", 1303 "Immediate_ne_r0_r0_130", 1304 ARRAY_SIZE(kImmediate), 1305 kImmediate}, 1306 {{ge, r0, r0, 209}, 1307 "ge r0 r0 209", 1308 "Immediate_ge_r0_r0_209", 1309 ARRAY_SIZE(kImmediate), 1310 kImmediate}, 1311 {{lt, r0, r0, 42}, 1312 "lt r0 r0 42", 1313 "Immediate_lt_r0_r0_42", 1314 ARRAY_SIZE(kImmediate), 1315 kImmediate}, 1316 {{cs, r0, r0, 177}, 1317 "cs r0 r0 177", 1318 "Immediate_cs_r0_r0_177", 1319 ARRAY_SIZE(kImmediate), 1320 kImmediate}, 1321 {{lt, r0, r0, 139}, 1322 "lt r0 r0 139", 1323 "Immediate_lt_r0_r0_139", 1324 ARRAY_SIZE(kImmediate), 1325 kImmediate}, 1326 {{mi, r0, r0, 43}, 1327 "mi r0 r0 43", 1328 "Immediate_mi_r0_r0_43", 1329 ARRAY_SIZE(kImmediate), 1330 kImmediate}, 1331 {{cs, r0, r0, 247}, 1332 "cs r0 r0 247", 1333 "Immediate_cs_r0_r0_247", 1334 ARRAY_SIZE(kImmediate), 1335 kImmediate}, 1336 {{ls, r0, r0, 170}, 1337 "ls r0 r0 170", 1338 "Immediate_ls_r0_r0_170", 1339 ARRAY_SIZE(kImmediate), 1340 kImmediate}, 1341 {{cs, r0, r0, 185}, 1342 "cs r0 r0 185", 1343 "Immediate_cs_r0_r0_185", 1344 ARRAY_SIZE(kImmediate), 1345 kImmediate}, 1346 {{ne, r0, r0, 246}, 1347 "ne r0 r0 246", 1348 "Immediate_ne_r0_r0_246", 1349 ARRAY_SIZE(kImmediate), 1350 kImmediate}, 1351 {{mi, r0, r0, 179}, 1352 "mi r0 r0 179", 1353 "Immediate_mi_r0_r0_179", 1354 ARRAY_SIZE(kImmediate), 1355 kImmediate}, 1356 {{pl, r0, r0, 7}, 1357 "pl r0 r0 7", 1358 "Immediate_pl_r0_r0_7", 1359 ARRAY_SIZE(kImmediate), 1360 kImmediate}, 1361 {{mi, r0, r0, 177}, 1362 "mi r0 r0 177", 1363 "Immediate_mi_r0_r0_177", 1364 ARRAY_SIZE(kImmediate), 1365 kImmediate}, 1366 {{gt, r0, r0, 175}, 1367 "gt r0 r0 175", 1368 "Immediate_gt_r0_r0_175", 1369 ARRAY_SIZE(kImmediate), 1370 kImmediate}}; 1371 1372 // We record all inputs to the instructions as outputs. This way, we also check 1373 // that what shouldn't change didn't change. 1374 struct TestResult { 1375 size_t output_size; 1376 const Inputs* outputs; 1377 }; 1378 1379 // These headers each contain an array of `TestResult` with the reference output 1380 // values. The reference arrays are names `kReference{mnemonic}`. 1381 #include "aarch32/traces/simulator-cond-rdlow-rnlow-operand-immediate-t32-add.h" 1382 #include "aarch32/traces/simulator-cond-rdlow-rnlow-operand-immediate-t32-adds.h" 1383 #include "aarch32/traces/simulator-cond-rdlow-rnlow-operand-immediate-t32-rsb.h" 1384 #include "aarch32/traces/simulator-cond-rdlow-rnlow-operand-immediate-t32-rsbs.h" 1385 #include "aarch32/traces/simulator-cond-rdlow-rnlow-operand-immediate-t32-sub.h" 1386 #include "aarch32/traces/simulator-cond-rdlow-rnlow-operand-immediate-t32-subs.h" 1387 1388 1389 // The maximum number of errors to report in detail for each test. 1390 const unsigned kErrorReportLimit = 8; 1391 1392 typedef void (MacroAssembler::*Fn)(Condition cond, 1393 Register rd, 1394 Register rn, 1395 const Operand& op); 1396 1397 void TestHelper(Fn instruction, 1398 const char* mnemonic, 1399 const TestResult reference[]) { 1400 SETUP(); 1401 masm.UseT32(); 1402 START(); 1403 1404 // Data to compare to `reference`. 1405 TestResult* results[ARRAY_SIZE(kTests)]; 1406 1407 // Test cases for memory bound instructions may allocate a buffer and save its 1408 // address in this array. 1409 byte* scratch_memory_buffers[ARRAY_SIZE(kTests)]; 1410 1411 // Generate a loop for each element in `kTests`. Each loop tests one specific 1412 // instruction. 1413 for (unsigned i = 0; i < ARRAY_SIZE(kTests); i++) { 1414 // Allocate results on the heap for this test. 1415 results[i] = new TestResult; 1416 results[i]->outputs = new Inputs[kTests[i].input_size]; 1417 results[i]->output_size = kTests[i].input_size; 1418 1419 size_t input_stride = sizeof(kTests[i].inputs[0]) * kTests[i].input_size; 1420 VIXL_ASSERT(IsUint32(input_stride)); 1421 1422 scratch_memory_buffers[i] = NULL; 1423 1424 Label loop; 1425 UseScratchRegisterScope scratch_registers(&masm); 1426 // Include all registers from r0 ro r12. 1427 scratch_registers.Include(RegisterList(0x1fff)); 1428 1429 // Values to pass to the macro-assembler. 1430 Condition cond = kTests[i].operands.cond; 1431 Register rd = kTests[i].operands.rd; 1432 Register rn = kTests[i].operands.rn; 1433 int32_t immediate = kTests[i].operands.immediate; 1434 Operand op(immediate); 1435 scratch_registers.Exclude(rd); 1436 scratch_registers.Exclude(rn); 1437 1438 // Allocate reserved registers for our own use. 1439 Register input_ptr = scratch_registers.Acquire(); 1440 Register input_end = scratch_registers.Acquire(); 1441 Register result_ptr = scratch_registers.Acquire(); 1442 1443 // Initialize `input_ptr` to the first element and `input_end` the address 1444 // after the array. 1445 __ Mov(input_ptr, Operand::From(kTests[i].inputs)); 1446 __ Add(input_end, input_ptr, static_cast<uint32_t>(input_stride)); 1447 __ Mov(result_ptr, Operand::From(results[i]->outputs)); 1448 __ Bind(&loop); 1449 1450 { 1451 UseScratchRegisterScope temp_registers(&masm); 1452 Register nzcv_bits = temp_registers.Acquire(); 1453 Register saved_q_bit = temp_registers.Acquire(); 1454 // Save the `Q` bit flag. 1455 __ Mrs(saved_q_bit, APSR); 1456 __ And(saved_q_bit, saved_q_bit, QFlag); 1457 // Set the `NZCV` and `Q` flags together. 1458 __ Ldr(nzcv_bits, MemOperand(input_ptr, offsetof(Inputs, apsr))); 1459 __ Orr(nzcv_bits, nzcv_bits, saved_q_bit); 1460 __ Msr(APSR_nzcvq, nzcv_bits); 1461 } 1462 __ Ldr(rd, MemOperand(input_ptr, offsetof(Inputs, rd))); 1463 __ Ldr(rn, MemOperand(input_ptr, offsetof(Inputs, rn))); 1464 1465 (masm.*instruction)(cond, rd, rn, op); 1466 1467 { 1468 UseScratchRegisterScope temp_registers(&masm); 1469 Register nzcv_bits = temp_registers.Acquire(); 1470 __ Mrs(nzcv_bits, APSR); 1471 // Only record the NZCV bits. 1472 __ And(nzcv_bits, nzcv_bits, NZCVFlag); 1473 __ Str(nzcv_bits, MemOperand(result_ptr, offsetof(Inputs, apsr))); 1474 } 1475 __ Str(rd, MemOperand(result_ptr, offsetof(Inputs, rd))); 1476 __ Str(rn, MemOperand(result_ptr, offsetof(Inputs, rn))); 1477 1478 // Advance the result pointer. 1479 __ Add(result_ptr, result_ptr, Operand::From(sizeof(kTests[i].inputs[0]))); 1480 // Loop back until `input_ptr` is lower than `input_base`. 1481 __ Add(input_ptr, input_ptr, Operand::From(sizeof(kTests[i].inputs[0]))); 1482 __ Cmp(input_ptr, input_end); 1483 __ B(ne, &loop); 1484 } 1485 1486 END(); 1487 1488 RUN(); 1489 1490 if (Test::generate_test_trace()) { 1491 // Print the results. 1492 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 1493 printf("const Inputs kOutputs_%s_%s[] = {\n", 1494 mnemonic, 1495 kTests[i].identifier); 1496 for (size_t j = 0; j < results[i]->output_size; j++) { 1497 printf(" { "); 1498 printf("0x%08" PRIx32, results[i]->outputs[j].apsr); 1499 printf(", "); 1500 printf("0x%08" PRIx32, results[i]->outputs[j].rd); 1501 printf(", "); 1502 printf("0x%08" PRIx32, results[i]->outputs[j].rn); 1503 printf(" },\n"); 1504 } 1505 printf("};\n"); 1506 } 1507 printf("const TestResult kReference%s[] = {\n", mnemonic); 1508 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 1509 printf(" {\n"); 1510 printf(" ARRAY_SIZE(kOutputs_%s_%s),\n", 1511 mnemonic, 1512 kTests[i].identifier); 1513 printf(" kOutputs_%s_%s,\n", mnemonic, kTests[i].identifier); 1514 printf(" },\n"); 1515 } 1516 printf("};\n"); 1517 } else if (kCheckSimulatorTestResults) { 1518 // Check the results. 1519 unsigned total_error_count = 0; 1520 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 1521 bool instruction_has_errors = false; 1522 for (size_t j = 0; j < kTests[i].input_size; j++) { 1523 uint32_t apsr = results[i]->outputs[j].apsr; 1524 uint32_t rd = results[i]->outputs[j].rd; 1525 uint32_t rn = results[i]->outputs[j].rn; 1526 uint32_t apsr_input = kTests[i].inputs[j].apsr; 1527 uint32_t rd_input = kTests[i].inputs[j].rd; 1528 uint32_t rn_input = kTests[i].inputs[j].rn; 1529 uint32_t apsr_ref = reference[i].outputs[j].apsr; 1530 uint32_t rd_ref = reference[i].outputs[j].rd; 1531 uint32_t rn_ref = reference[i].outputs[j].rn; 1532 1533 if (((apsr != apsr_ref) || (rd != rd_ref) || (rn != rn_ref)) && 1534 (++total_error_count <= kErrorReportLimit)) { 1535 // Print the instruction once even if it triggered multiple failures. 1536 if (!instruction_has_errors) { 1537 printf("Error(s) when testing \"%s %s\":\n", 1538 mnemonic, 1539 kTests[i].operands_description); 1540 instruction_has_errors = true; 1541 } 1542 // Print subsequent errors. 1543 printf(" Input: "); 1544 printf("0x%08" PRIx32, apsr_input); 1545 printf(", "); 1546 printf("0x%08" PRIx32, rd_input); 1547 printf(", "); 1548 printf("0x%08" PRIx32, rn_input); 1549 printf("\n"); 1550 printf(" Expected: "); 1551 printf("0x%08" PRIx32, apsr_ref); 1552 printf(", "); 1553 printf("0x%08" PRIx32, rd_ref); 1554 printf(", "); 1555 printf("0x%08" PRIx32, rn_ref); 1556 printf("\n"); 1557 printf(" Found: "); 1558 printf("0x%08" PRIx32, apsr); 1559 printf(", "); 1560 printf("0x%08" PRIx32, rd); 1561 printf(", "); 1562 printf("0x%08" PRIx32, rn); 1563 printf("\n\n"); 1564 } 1565 } 1566 } 1567 1568 if (total_error_count > kErrorReportLimit) { 1569 printf("%u other errors follow.\n", 1570 total_error_count - kErrorReportLimit); 1571 } 1572 VIXL_CHECK(total_error_count == 0); 1573 } else { 1574 VIXL_WARNING("Assembled the code, but did not run anything.\n"); 1575 } 1576 1577 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) { 1578 delete[] results[i]->outputs; 1579 delete results[i]; 1580 delete[] scratch_memory_buffers[i]; 1581 } 1582 1583 TEARDOWN(); 1584 } 1585 1586 // Instantiate tests for each instruction in the list. 1587 // TODO: Remove this limitation by having a sandboxing mechanism. 1588 #if defined(VIXL_HOST_POINTER_32) 1589 #define TEST(mnemonic) \ 1590 void Test_##mnemonic() { \ 1591 TestHelper(&MacroAssembler::mnemonic, #mnemonic, kReference##mnemonic); \ 1592 } \ 1593 Test test_##mnemonic( \ 1594 "AARCH32_SIMULATOR_COND_RDLOW_RNLOW_OPERAND_IMMEDIATE_T32_" #mnemonic, \ 1595 &Test_##mnemonic); 1596 #else 1597 #define TEST(mnemonic) \ 1598 void Test_##mnemonic() { \ 1599 VIXL_WARNING("This test can only run on a 32-bit host.\n"); \ 1600 USE(TestHelper); \ 1601 } \ 1602 Test test_##mnemonic( \ 1603 "AARCH32_SIMULATOR_COND_RDLOW_RNLOW_OPERAND_IMMEDIATE_T32_" #mnemonic, \ 1604 &Test_##mnemonic); 1605 #endif 1606 1607 FOREACH_INSTRUCTION(TEST) 1608 #undef TEST 1609 1610 } // namespace 1611 #endif 1612 1613 } // namespace aarch32 1614 } // namespace vixl 1615