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
111 namespace vixl {
112 namespace aarch32 {
113
114 // List of instruction encodings:
115 #define FOREACH_INSTRUCTION(M) \
116 M(Cmp) \
117 M(Mov) \
118 M(Movs)
119
120
121 // The following definitions are defined again in each generated test, therefore
122 // we need to place them in an anomymous namespace. It expresses that they are
123 // local to this file only, and the compiler is not allowed to share these types
124 // across test files during template instantiation. Specifically, `Operands` and
125 // `Inputs` have various layouts across generated tests so they absolutely
126 // cannot be shared.
127
128 #ifdef VIXL_INCLUDE_TARGET_T32
129 namespace {
130
131 // Values to be passed to the assembler to produce the instruction under test.
132 struct Operands {
133 Condition cond;
134 Register rd;
135 int32_t immediate;
136 };
137
138 // Input data to feed to the instruction.
139 struct Inputs {
140 uint32_t apsr;
141 uint32_t rd;
142 };
143
144 // This structure contains all input data needed to test one specific encoding.
145 // It used to generate a loop over an instruction.
146 struct TestLoopData {
147 // The `operands` fields represents the values to pass to the assembler to
148 // produce the instruction.
149 Operands operands;
150 // Description of the operands, used for error reporting.
151 const char* operands_description;
152 // Unique identifier, used for generating traces.
153 const char* identifier;
154 // Array of values to be fed to the instruction.
155 size_t input_size;
156 const Inputs* inputs;
157 };
158
159 static const Inputs kCondition[] = {{NFlag, 0xabababab},
160 {ZFlag, 0xabababab},
161 {CFlag, 0xabababab},
162 {VFlag, 0xabababab},
163 {NZFlag, 0xabababab},
164 {NCFlag, 0xabababab},
165 {NVFlag, 0xabababab},
166 {ZCFlag, 0xabababab},
167 {ZVFlag, 0xabababab},
168 {CVFlag, 0xabababab},
169 {NZCFlag, 0xabababab},
170 {NZVFlag, 0xabababab},
171 {NCVFlag, 0xabababab},
172 {ZCVFlag, 0xabababab},
173 {NZCVFlag, 0xabababab}};
174
175 static const Inputs kModifiedImmediate[] =
176 {{NoFlag, 0x00000000}, {NoFlag, 0x00000001}, {NoFlag, 0x00000002},
177 {NoFlag, 0x00000020}, {NoFlag, 0x0000007d}, {NoFlag, 0x0000007e},
178 {NoFlag, 0x0000007f}, {NoFlag, 0x00007ffd}, {NoFlag, 0x00007ffe},
179 {NoFlag, 0x00007fff}, {NoFlag, 0x33333333}, {NoFlag, 0x55555555},
180 {NoFlag, 0x7ffffffd}, {NoFlag, 0x7ffffffe}, {NoFlag, 0x7fffffff},
181 {NoFlag, 0x80000000}, {NoFlag, 0x80000001}, {NoFlag, 0xaaaaaaaa},
182 {NoFlag, 0xcccccccc}, {NoFlag, 0xffff8000}, {NoFlag, 0xffff8001},
183 {NoFlag, 0xffff8002}, {NoFlag, 0xffff8003}, {NoFlag, 0xffffff80},
184 {NoFlag, 0xffffff81}, {NoFlag, 0xffffff82}, {NoFlag, 0xffffff83},
185 {NoFlag, 0xffffffe0}, {NoFlag, 0xfffffffd}, {NoFlag, 0xfffffffe},
186 {NoFlag, 0xffffffff}};
187
188
189 // A loop will be generated for each element of this array.
190 const TestLoopData kTests[] = {{{eq, r0, 0},
191 "eq r0 0",
192 "Condition_eq_r0_0",
193 ARRAY_SIZE(kCondition),
194 kCondition},
195 {{ne, r0, 0},
196 "ne r0 0",
197 "Condition_ne_r0_0",
198 ARRAY_SIZE(kCondition),
199 kCondition},
200 {{cs, r0, 0},
201 "cs r0 0",
202 "Condition_cs_r0_0",
203 ARRAY_SIZE(kCondition),
204 kCondition},
205 {{cc, r0, 0},
206 "cc r0 0",
207 "Condition_cc_r0_0",
208 ARRAY_SIZE(kCondition),
209 kCondition},
210 {{mi, r0, 0},
211 "mi r0 0",
212 "Condition_mi_r0_0",
213 ARRAY_SIZE(kCondition),
214 kCondition},
215 {{pl, r0, 0},
216 "pl r0 0",
217 "Condition_pl_r0_0",
218 ARRAY_SIZE(kCondition),
219 kCondition},
220 {{vs, r0, 0},
221 "vs r0 0",
222 "Condition_vs_r0_0",
223 ARRAY_SIZE(kCondition),
224 kCondition},
225 {{vc, r0, 0},
226 "vc r0 0",
227 "Condition_vc_r0_0",
228 ARRAY_SIZE(kCondition),
229 kCondition},
230 {{hi, r0, 0},
231 "hi r0 0",
232 "Condition_hi_r0_0",
233 ARRAY_SIZE(kCondition),
234 kCondition},
235 {{ls, r0, 0},
236 "ls r0 0",
237 "Condition_ls_r0_0",
238 ARRAY_SIZE(kCondition),
239 kCondition},
240 {{ge, r0, 0},
241 "ge r0 0",
242 "Condition_ge_r0_0",
243 ARRAY_SIZE(kCondition),
244 kCondition},
245 {{lt, r0, 0},
246 "lt r0 0",
247 "Condition_lt_r0_0",
248 ARRAY_SIZE(kCondition),
249 kCondition},
250 {{gt, r0, 0},
251 "gt r0 0",
252 "Condition_gt_r0_0",
253 ARRAY_SIZE(kCondition),
254 kCondition},
255 {{le, r0, 0},
256 "le r0 0",
257 "Condition_le_r0_0",
258 ARRAY_SIZE(kCondition),
259 kCondition},
260 {{al, r0, 0},
261 "al r0 0",
262 "Condition_al_r0_0",
263 ARRAY_SIZE(kCondition),
264 kCondition},
265 {{al, r0, 0},
266 "al r0 0",
267 "ModifiedImmediate_al_r0_0",
268 ARRAY_SIZE(kModifiedImmediate),
269 kModifiedImmediate},
270 {{al, r0, 1},
271 "al r0 1",
272 "ModifiedImmediate_al_r0_1",
273 ARRAY_SIZE(kModifiedImmediate),
274 kModifiedImmediate},
275 {{al, r0, 2},
276 "al r0 2",
277 "ModifiedImmediate_al_r0_2",
278 ARRAY_SIZE(kModifiedImmediate),
279 kModifiedImmediate},
280 {{al, r0, 3},
281 "al r0 3",
282 "ModifiedImmediate_al_r0_3",
283 ARRAY_SIZE(kModifiedImmediate),
284 kModifiedImmediate},
285 {{al, r0, 4},
286 "al r0 4",
287 "ModifiedImmediate_al_r0_4",
288 ARRAY_SIZE(kModifiedImmediate),
289 kModifiedImmediate},
290 {{al, r0, 5},
291 "al r0 5",
292 "ModifiedImmediate_al_r0_5",
293 ARRAY_SIZE(kModifiedImmediate),
294 kModifiedImmediate},
295 {{al, r0, 6},
296 "al r0 6",
297 "ModifiedImmediate_al_r0_6",
298 ARRAY_SIZE(kModifiedImmediate),
299 kModifiedImmediate},
300 {{al, r0, 7},
301 "al r0 7",
302 "ModifiedImmediate_al_r0_7",
303 ARRAY_SIZE(kModifiedImmediate),
304 kModifiedImmediate},
305 {{al, r0, 8},
306 "al r0 8",
307 "ModifiedImmediate_al_r0_8",
308 ARRAY_SIZE(kModifiedImmediate),
309 kModifiedImmediate},
310 {{al, r0, 9},
311 "al r0 9",
312 "ModifiedImmediate_al_r0_9",
313 ARRAY_SIZE(kModifiedImmediate),
314 kModifiedImmediate},
315 {{al, r0, 10},
316 "al r0 10",
317 "ModifiedImmediate_al_r0_10",
318 ARRAY_SIZE(kModifiedImmediate),
319 kModifiedImmediate},
320 {{al, r0, 11},
321 "al r0 11",
322 "ModifiedImmediate_al_r0_11",
323 ARRAY_SIZE(kModifiedImmediate),
324 kModifiedImmediate},
325 {{al, r0, 12},
326 "al r0 12",
327 "ModifiedImmediate_al_r0_12",
328 ARRAY_SIZE(kModifiedImmediate),
329 kModifiedImmediate},
330 {{al, r0, 13},
331 "al r0 13",
332 "ModifiedImmediate_al_r0_13",
333 ARRAY_SIZE(kModifiedImmediate),
334 kModifiedImmediate},
335 {{al, r0, 14},
336 "al r0 14",
337 "ModifiedImmediate_al_r0_14",
338 ARRAY_SIZE(kModifiedImmediate),
339 kModifiedImmediate},
340 {{al, r0, 15},
341 "al r0 15",
342 "ModifiedImmediate_al_r0_15",
343 ARRAY_SIZE(kModifiedImmediate),
344 kModifiedImmediate},
345 {{al, r0, 16},
346 "al r0 16",
347 "ModifiedImmediate_al_r0_16",
348 ARRAY_SIZE(kModifiedImmediate),
349 kModifiedImmediate},
350 {{al, r0, 17},
351 "al r0 17",
352 "ModifiedImmediate_al_r0_17",
353 ARRAY_SIZE(kModifiedImmediate),
354 kModifiedImmediate},
355 {{al, r0, 18},
356 "al r0 18",
357 "ModifiedImmediate_al_r0_18",
358 ARRAY_SIZE(kModifiedImmediate),
359 kModifiedImmediate},
360 {{al, r0, 19},
361 "al r0 19",
362 "ModifiedImmediate_al_r0_19",
363 ARRAY_SIZE(kModifiedImmediate),
364 kModifiedImmediate},
365 {{al, r0, 20},
366 "al r0 20",
367 "ModifiedImmediate_al_r0_20",
368 ARRAY_SIZE(kModifiedImmediate),
369 kModifiedImmediate},
370 {{al, r0, 21},
371 "al r0 21",
372 "ModifiedImmediate_al_r0_21",
373 ARRAY_SIZE(kModifiedImmediate),
374 kModifiedImmediate},
375 {{al, r0, 22},
376 "al r0 22",
377 "ModifiedImmediate_al_r0_22",
378 ARRAY_SIZE(kModifiedImmediate),
379 kModifiedImmediate},
380 {{al, r0, 23},
381 "al r0 23",
382 "ModifiedImmediate_al_r0_23",
383 ARRAY_SIZE(kModifiedImmediate),
384 kModifiedImmediate},
385 {{al, r0, 24},
386 "al r0 24",
387 "ModifiedImmediate_al_r0_24",
388 ARRAY_SIZE(kModifiedImmediate),
389 kModifiedImmediate},
390 {{al, r0, 25},
391 "al r0 25",
392 "ModifiedImmediate_al_r0_25",
393 ARRAY_SIZE(kModifiedImmediate),
394 kModifiedImmediate},
395 {{al, r0, 26},
396 "al r0 26",
397 "ModifiedImmediate_al_r0_26",
398 ARRAY_SIZE(kModifiedImmediate),
399 kModifiedImmediate},
400 {{al, r0, 27},
401 "al r0 27",
402 "ModifiedImmediate_al_r0_27",
403 ARRAY_SIZE(kModifiedImmediate),
404 kModifiedImmediate},
405 {{al, r0, 28},
406 "al r0 28",
407 "ModifiedImmediate_al_r0_28",
408 ARRAY_SIZE(kModifiedImmediate),
409 kModifiedImmediate},
410 {{al, r0, 29},
411 "al r0 29",
412 "ModifiedImmediate_al_r0_29",
413 ARRAY_SIZE(kModifiedImmediate),
414 kModifiedImmediate},
415 {{al, r0, 30},
416 "al r0 30",
417 "ModifiedImmediate_al_r0_30",
418 ARRAY_SIZE(kModifiedImmediate),
419 kModifiedImmediate},
420 {{al, r0, 31},
421 "al r0 31",
422 "ModifiedImmediate_al_r0_31",
423 ARRAY_SIZE(kModifiedImmediate),
424 kModifiedImmediate},
425 {{al, r0, 32},
426 "al r0 32",
427 "ModifiedImmediate_al_r0_32",
428 ARRAY_SIZE(kModifiedImmediate),
429 kModifiedImmediate},
430 {{al, r0, 33},
431 "al r0 33",
432 "ModifiedImmediate_al_r0_33",
433 ARRAY_SIZE(kModifiedImmediate),
434 kModifiedImmediate},
435 {{al, r0, 34},
436 "al r0 34",
437 "ModifiedImmediate_al_r0_34",
438 ARRAY_SIZE(kModifiedImmediate),
439 kModifiedImmediate},
440 {{al, r0, 35},
441 "al r0 35",
442 "ModifiedImmediate_al_r0_35",
443 ARRAY_SIZE(kModifiedImmediate),
444 kModifiedImmediate},
445 {{al, r0, 36},
446 "al r0 36",
447 "ModifiedImmediate_al_r0_36",
448 ARRAY_SIZE(kModifiedImmediate),
449 kModifiedImmediate},
450 {{al, r0, 37},
451 "al r0 37",
452 "ModifiedImmediate_al_r0_37",
453 ARRAY_SIZE(kModifiedImmediate),
454 kModifiedImmediate},
455 {{al, r0, 38},
456 "al r0 38",
457 "ModifiedImmediate_al_r0_38",
458 ARRAY_SIZE(kModifiedImmediate),
459 kModifiedImmediate},
460 {{al, r0, 39},
461 "al r0 39",
462 "ModifiedImmediate_al_r0_39",
463 ARRAY_SIZE(kModifiedImmediate),
464 kModifiedImmediate},
465 {{al, r0, 40},
466 "al r0 40",
467 "ModifiedImmediate_al_r0_40",
468 ARRAY_SIZE(kModifiedImmediate),
469 kModifiedImmediate},
470 {{al, r0, 41},
471 "al r0 41",
472 "ModifiedImmediate_al_r0_41",
473 ARRAY_SIZE(kModifiedImmediate),
474 kModifiedImmediate},
475 {{al, r0, 42},
476 "al r0 42",
477 "ModifiedImmediate_al_r0_42",
478 ARRAY_SIZE(kModifiedImmediate),
479 kModifiedImmediate},
480 {{al, r0, 43},
481 "al r0 43",
482 "ModifiedImmediate_al_r0_43",
483 ARRAY_SIZE(kModifiedImmediate),
484 kModifiedImmediate},
485 {{al, r0, 44},
486 "al r0 44",
487 "ModifiedImmediate_al_r0_44",
488 ARRAY_SIZE(kModifiedImmediate),
489 kModifiedImmediate},
490 {{al, r0, 45},
491 "al r0 45",
492 "ModifiedImmediate_al_r0_45",
493 ARRAY_SIZE(kModifiedImmediate),
494 kModifiedImmediate},
495 {{al, r0, 46},
496 "al r0 46",
497 "ModifiedImmediate_al_r0_46",
498 ARRAY_SIZE(kModifiedImmediate),
499 kModifiedImmediate},
500 {{al, r0, 47},
501 "al r0 47",
502 "ModifiedImmediate_al_r0_47",
503 ARRAY_SIZE(kModifiedImmediate),
504 kModifiedImmediate},
505 {{al, r0, 48},
506 "al r0 48",
507 "ModifiedImmediate_al_r0_48",
508 ARRAY_SIZE(kModifiedImmediate),
509 kModifiedImmediate},
510 {{al, r0, 49},
511 "al r0 49",
512 "ModifiedImmediate_al_r0_49",
513 ARRAY_SIZE(kModifiedImmediate),
514 kModifiedImmediate},
515 {{al, r0, 50},
516 "al r0 50",
517 "ModifiedImmediate_al_r0_50",
518 ARRAY_SIZE(kModifiedImmediate),
519 kModifiedImmediate},
520 {{al, r0, 51},
521 "al r0 51",
522 "ModifiedImmediate_al_r0_51",
523 ARRAY_SIZE(kModifiedImmediate),
524 kModifiedImmediate},
525 {{al, r0, 52},
526 "al r0 52",
527 "ModifiedImmediate_al_r0_52",
528 ARRAY_SIZE(kModifiedImmediate),
529 kModifiedImmediate},
530 {{al, r0, 53},
531 "al r0 53",
532 "ModifiedImmediate_al_r0_53",
533 ARRAY_SIZE(kModifiedImmediate),
534 kModifiedImmediate},
535 {{al, r0, 54},
536 "al r0 54",
537 "ModifiedImmediate_al_r0_54",
538 ARRAY_SIZE(kModifiedImmediate),
539 kModifiedImmediate},
540 {{al, r0, 55},
541 "al r0 55",
542 "ModifiedImmediate_al_r0_55",
543 ARRAY_SIZE(kModifiedImmediate),
544 kModifiedImmediate},
545 {{al, r0, 56},
546 "al r0 56",
547 "ModifiedImmediate_al_r0_56",
548 ARRAY_SIZE(kModifiedImmediate),
549 kModifiedImmediate},
550 {{al, r0, 57},
551 "al r0 57",
552 "ModifiedImmediate_al_r0_57",
553 ARRAY_SIZE(kModifiedImmediate),
554 kModifiedImmediate},
555 {{al, r0, 58},
556 "al r0 58",
557 "ModifiedImmediate_al_r0_58",
558 ARRAY_SIZE(kModifiedImmediate),
559 kModifiedImmediate},
560 {{al, r0, 59},
561 "al r0 59",
562 "ModifiedImmediate_al_r0_59",
563 ARRAY_SIZE(kModifiedImmediate),
564 kModifiedImmediate},
565 {{al, r0, 60},
566 "al r0 60",
567 "ModifiedImmediate_al_r0_60",
568 ARRAY_SIZE(kModifiedImmediate),
569 kModifiedImmediate},
570 {{al, r0, 61},
571 "al r0 61",
572 "ModifiedImmediate_al_r0_61",
573 ARRAY_SIZE(kModifiedImmediate),
574 kModifiedImmediate},
575 {{al, r0, 62},
576 "al r0 62",
577 "ModifiedImmediate_al_r0_62",
578 ARRAY_SIZE(kModifiedImmediate),
579 kModifiedImmediate},
580 {{al, r0, 63},
581 "al r0 63",
582 "ModifiedImmediate_al_r0_63",
583 ARRAY_SIZE(kModifiedImmediate),
584 kModifiedImmediate},
585 {{al, r0, 64},
586 "al r0 64",
587 "ModifiedImmediate_al_r0_64",
588 ARRAY_SIZE(kModifiedImmediate),
589 kModifiedImmediate},
590 {{al, r0, 65},
591 "al r0 65",
592 "ModifiedImmediate_al_r0_65",
593 ARRAY_SIZE(kModifiedImmediate),
594 kModifiedImmediate},
595 {{al, r0, 66},
596 "al r0 66",
597 "ModifiedImmediate_al_r0_66",
598 ARRAY_SIZE(kModifiedImmediate),
599 kModifiedImmediate},
600 {{al, r0, 67},
601 "al r0 67",
602 "ModifiedImmediate_al_r0_67",
603 ARRAY_SIZE(kModifiedImmediate),
604 kModifiedImmediate},
605 {{al, r0, 68},
606 "al r0 68",
607 "ModifiedImmediate_al_r0_68",
608 ARRAY_SIZE(kModifiedImmediate),
609 kModifiedImmediate},
610 {{al, r0, 69},
611 "al r0 69",
612 "ModifiedImmediate_al_r0_69",
613 ARRAY_SIZE(kModifiedImmediate),
614 kModifiedImmediate},
615 {{al, r0, 70},
616 "al r0 70",
617 "ModifiedImmediate_al_r0_70",
618 ARRAY_SIZE(kModifiedImmediate),
619 kModifiedImmediate},
620 {{al, r0, 71},
621 "al r0 71",
622 "ModifiedImmediate_al_r0_71",
623 ARRAY_SIZE(kModifiedImmediate),
624 kModifiedImmediate},
625 {{al, r0, 72},
626 "al r0 72",
627 "ModifiedImmediate_al_r0_72",
628 ARRAY_SIZE(kModifiedImmediate),
629 kModifiedImmediate},
630 {{al, r0, 73},
631 "al r0 73",
632 "ModifiedImmediate_al_r0_73",
633 ARRAY_SIZE(kModifiedImmediate),
634 kModifiedImmediate},
635 {{al, r0, 74},
636 "al r0 74",
637 "ModifiedImmediate_al_r0_74",
638 ARRAY_SIZE(kModifiedImmediate),
639 kModifiedImmediate},
640 {{al, r0, 75},
641 "al r0 75",
642 "ModifiedImmediate_al_r0_75",
643 ARRAY_SIZE(kModifiedImmediate),
644 kModifiedImmediate},
645 {{al, r0, 76},
646 "al r0 76",
647 "ModifiedImmediate_al_r0_76",
648 ARRAY_SIZE(kModifiedImmediate),
649 kModifiedImmediate},
650 {{al, r0, 77},
651 "al r0 77",
652 "ModifiedImmediate_al_r0_77",
653 ARRAY_SIZE(kModifiedImmediate),
654 kModifiedImmediate},
655 {{al, r0, 78},
656 "al r0 78",
657 "ModifiedImmediate_al_r0_78",
658 ARRAY_SIZE(kModifiedImmediate),
659 kModifiedImmediate},
660 {{al, r0, 79},
661 "al r0 79",
662 "ModifiedImmediate_al_r0_79",
663 ARRAY_SIZE(kModifiedImmediate),
664 kModifiedImmediate},
665 {{al, r0, 80},
666 "al r0 80",
667 "ModifiedImmediate_al_r0_80",
668 ARRAY_SIZE(kModifiedImmediate),
669 kModifiedImmediate},
670 {{al, r0, 81},
671 "al r0 81",
672 "ModifiedImmediate_al_r0_81",
673 ARRAY_SIZE(kModifiedImmediate),
674 kModifiedImmediate},
675 {{al, r0, 82},
676 "al r0 82",
677 "ModifiedImmediate_al_r0_82",
678 ARRAY_SIZE(kModifiedImmediate),
679 kModifiedImmediate},
680 {{al, r0, 83},
681 "al r0 83",
682 "ModifiedImmediate_al_r0_83",
683 ARRAY_SIZE(kModifiedImmediate),
684 kModifiedImmediate},
685 {{al, r0, 84},
686 "al r0 84",
687 "ModifiedImmediate_al_r0_84",
688 ARRAY_SIZE(kModifiedImmediate),
689 kModifiedImmediate},
690 {{al, r0, 85},
691 "al r0 85",
692 "ModifiedImmediate_al_r0_85",
693 ARRAY_SIZE(kModifiedImmediate),
694 kModifiedImmediate},
695 {{al, r0, 86},
696 "al r0 86",
697 "ModifiedImmediate_al_r0_86",
698 ARRAY_SIZE(kModifiedImmediate),
699 kModifiedImmediate},
700 {{al, r0, 87},
701 "al r0 87",
702 "ModifiedImmediate_al_r0_87",
703 ARRAY_SIZE(kModifiedImmediate),
704 kModifiedImmediate},
705 {{al, r0, 88},
706 "al r0 88",
707 "ModifiedImmediate_al_r0_88",
708 ARRAY_SIZE(kModifiedImmediate),
709 kModifiedImmediate},
710 {{al, r0, 89},
711 "al r0 89",
712 "ModifiedImmediate_al_r0_89",
713 ARRAY_SIZE(kModifiedImmediate),
714 kModifiedImmediate},
715 {{al, r0, 90},
716 "al r0 90",
717 "ModifiedImmediate_al_r0_90",
718 ARRAY_SIZE(kModifiedImmediate),
719 kModifiedImmediate},
720 {{al, r0, 91},
721 "al r0 91",
722 "ModifiedImmediate_al_r0_91",
723 ARRAY_SIZE(kModifiedImmediate),
724 kModifiedImmediate},
725 {{al, r0, 92},
726 "al r0 92",
727 "ModifiedImmediate_al_r0_92",
728 ARRAY_SIZE(kModifiedImmediate),
729 kModifiedImmediate},
730 {{al, r0, 93},
731 "al r0 93",
732 "ModifiedImmediate_al_r0_93",
733 ARRAY_SIZE(kModifiedImmediate),
734 kModifiedImmediate},
735 {{al, r0, 94},
736 "al r0 94",
737 "ModifiedImmediate_al_r0_94",
738 ARRAY_SIZE(kModifiedImmediate),
739 kModifiedImmediate},
740 {{al, r0, 95},
741 "al r0 95",
742 "ModifiedImmediate_al_r0_95",
743 ARRAY_SIZE(kModifiedImmediate),
744 kModifiedImmediate},
745 {{al, r0, 96},
746 "al r0 96",
747 "ModifiedImmediate_al_r0_96",
748 ARRAY_SIZE(kModifiedImmediate),
749 kModifiedImmediate},
750 {{al, r0, 97},
751 "al r0 97",
752 "ModifiedImmediate_al_r0_97",
753 ARRAY_SIZE(kModifiedImmediate),
754 kModifiedImmediate},
755 {{al, r0, 98},
756 "al r0 98",
757 "ModifiedImmediate_al_r0_98",
758 ARRAY_SIZE(kModifiedImmediate),
759 kModifiedImmediate},
760 {{al, r0, 99},
761 "al r0 99",
762 "ModifiedImmediate_al_r0_99",
763 ARRAY_SIZE(kModifiedImmediate),
764 kModifiedImmediate},
765 {{al, r0, 100},
766 "al r0 100",
767 "ModifiedImmediate_al_r0_100",
768 ARRAY_SIZE(kModifiedImmediate),
769 kModifiedImmediate},
770 {{al, r0, 101},
771 "al r0 101",
772 "ModifiedImmediate_al_r0_101",
773 ARRAY_SIZE(kModifiedImmediate),
774 kModifiedImmediate},
775 {{al, r0, 102},
776 "al r0 102",
777 "ModifiedImmediate_al_r0_102",
778 ARRAY_SIZE(kModifiedImmediate),
779 kModifiedImmediate},
780 {{al, r0, 103},
781 "al r0 103",
782 "ModifiedImmediate_al_r0_103",
783 ARRAY_SIZE(kModifiedImmediate),
784 kModifiedImmediate},
785 {{al, r0, 104},
786 "al r0 104",
787 "ModifiedImmediate_al_r0_104",
788 ARRAY_SIZE(kModifiedImmediate),
789 kModifiedImmediate},
790 {{al, r0, 105},
791 "al r0 105",
792 "ModifiedImmediate_al_r0_105",
793 ARRAY_SIZE(kModifiedImmediate),
794 kModifiedImmediate},
795 {{al, r0, 106},
796 "al r0 106",
797 "ModifiedImmediate_al_r0_106",
798 ARRAY_SIZE(kModifiedImmediate),
799 kModifiedImmediate},
800 {{al, r0, 107},
801 "al r0 107",
802 "ModifiedImmediate_al_r0_107",
803 ARRAY_SIZE(kModifiedImmediate),
804 kModifiedImmediate},
805 {{al, r0, 108},
806 "al r0 108",
807 "ModifiedImmediate_al_r0_108",
808 ARRAY_SIZE(kModifiedImmediate),
809 kModifiedImmediate},
810 {{al, r0, 109},
811 "al r0 109",
812 "ModifiedImmediate_al_r0_109",
813 ARRAY_SIZE(kModifiedImmediate),
814 kModifiedImmediate},
815 {{al, r0, 110},
816 "al r0 110",
817 "ModifiedImmediate_al_r0_110",
818 ARRAY_SIZE(kModifiedImmediate),
819 kModifiedImmediate},
820 {{al, r0, 111},
821 "al r0 111",
822 "ModifiedImmediate_al_r0_111",
823 ARRAY_SIZE(kModifiedImmediate),
824 kModifiedImmediate},
825 {{al, r0, 112},
826 "al r0 112",
827 "ModifiedImmediate_al_r0_112",
828 ARRAY_SIZE(kModifiedImmediate),
829 kModifiedImmediate},
830 {{al, r0, 113},
831 "al r0 113",
832 "ModifiedImmediate_al_r0_113",
833 ARRAY_SIZE(kModifiedImmediate),
834 kModifiedImmediate},
835 {{al, r0, 114},
836 "al r0 114",
837 "ModifiedImmediate_al_r0_114",
838 ARRAY_SIZE(kModifiedImmediate),
839 kModifiedImmediate},
840 {{al, r0, 115},
841 "al r0 115",
842 "ModifiedImmediate_al_r0_115",
843 ARRAY_SIZE(kModifiedImmediate),
844 kModifiedImmediate},
845 {{al, r0, 116},
846 "al r0 116",
847 "ModifiedImmediate_al_r0_116",
848 ARRAY_SIZE(kModifiedImmediate),
849 kModifiedImmediate},
850 {{al, r0, 117},
851 "al r0 117",
852 "ModifiedImmediate_al_r0_117",
853 ARRAY_SIZE(kModifiedImmediate),
854 kModifiedImmediate},
855 {{al, r0, 118},
856 "al r0 118",
857 "ModifiedImmediate_al_r0_118",
858 ARRAY_SIZE(kModifiedImmediate),
859 kModifiedImmediate},
860 {{al, r0, 119},
861 "al r0 119",
862 "ModifiedImmediate_al_r0_119",
863 ARRAY_SIZE(kModifiedImmediate),
864 kModifiedImmediate},
865 {{al, r0, 120},
866 "al r0 120",
867 "ModifiedImmediate_al_r0_120",
868 ARRAY_SIZE(kModifiedImmediate),
869 kModifiedImmediate},
870 {{al, r0, 121},
871 "al r0 121",
872 "ModifiedImmediate_al_r0_121",
873 ARRAY_SIZE(kModifiedImmediate),
874 kModifiedImmediate},
875 {{al, r0, 122},
876 "al r0 122",
877 "ModifiedImmediate_al_r0_122",
878 ARRAY_SIZE(kModifiedImmediate),
879 kModifiedImmediate},
880 {{al, r0, 123},
881 "al r0 123",
882 "ModifiedImmediate_al_r0_123",
883 ARRAY_SIZE(kModifiedImmediate),
884 kModifiedImmediate},
885 {{al, r0, 124},
886 "al r0 124",
887 "ModifiedImmediate_al_r0_124",
888 ARRAY_SIZE(kModifiedImmediate),
889 kModifiedImmediate},
890 {{al, r0, 125},
891 "al r0 125",
892 "ModifiedImmediate_al_r0_125",
893 ARRAY_SIZE(kModifiedImmediate),
894 kModifiedImmediate},
895 {{al, r0, 126},
896 "al r0 126",
897 "ModifiedImmediate_al_r0_126",
898 ARRAY_SIZE(kModifiedImmediate),
899 kModifiedImmediate},
900 {{al, r0, 127},
901 "al r0 127",
902 "ModifiedImmediate_al_r0_127",
903 ARRAY_SIZE(kModifiedImmediate),
904 kModifiedImmediate},
905 {{al, r0, 128},
906 "al r0 128",
907 "ModifiedImmediate_al_r0_128",
908 ARRAY_SIZE(kModifiedImmediate),
909 kModifiedImmediate},
910 {{al, r0, 129},
911 "al r0 129",
912 "ModifiedImmediate_al_r0_129",
913 ARRAY_SIZE(kModifiedImmediate),
914 kModifiedImmediate},
915 {{al, r0, 130},
916 "al r0 130",
917 "ModifiedImmediate_al_r0_130",
918 ARRAY_SIZE(kModifiedImmediate),
919 kModifiedImmediate},
920 {{al, r0, 131},
921 "al r0 131",
922 "ModifiedImmediate_al_r0_131",
923 ARRAY_SIZE(kModifiedImmediate),
924 kModifiedImmediate},
925 {{al, r0, 132},
926 "al r0 132",
927 "ModifiedImmediate_al_r0_132",
928 ARRAY_SIZE(kModifiedImmediate),
929 kModifiedImmediate},
930 {{al, r0, 133},
931 "al r0 133",
932 "ModifiedImmediate_al_r0_133",
933 ARRAY_SIZE(kModifiedImmediate),
934 kModifiedImmediate},
935 {{al, r0, 134},
936 "al r0 134",
937 "ModifiedImmediate_al_r0_134",
938 ARRAY_SIZE(kModifiedImmediate),
939 kModifiedImmediate},
940 {{al, r0, 135},
941 "al r0 135",
942 "ModifiedImmediate_al_r0_135",
943 ARRAY_SIZE(kModifiedImmediate),
944 kModifiedImmediate},
945 {{al, r0, 136},
946 "al r0 136",
947 "ModifiedImmediate_al_r0_136",
948 ARRAY_SIZE(kModifiedImmediate),
949 kModifiedImmediate},
950 {{al, r0, 137},
951 "al r0 137",
952 "ModifiedImmediate_al_r0_137",
953 ARRAY_SIZE(kModifiedImmediate),
954 kModifiedImmediate},
955 {{al, r0, 138},
956 "al r0 138",
957 "ModifiedImmediate_al_r0_138",
958 ARRAY_SIZE(kModifiedImmediate),
959 kModifiedImmediate},
960 {{al, r0, 139},
961 "al r0 139",
962 "ModifiedImmediate_al_r0_139",
963 ARRAY_SIZE(kModifiedImmediate),
964 kModifiedImmediate},
965 {{al, r0, 140},
966 "al r0 140",
967 "ModifiedImmediate_al_r0_140",
968 ARRAY_SIZE(kModifiedImmediate),
969 kModifiedImmediate},
970 {{al, r0, 141},
971 "al r0 141",
972 "ModifiedImmediate_al_r0_141",
973 ARRAY_SIZE(kModifiedImmediate),
974 kModifiedImmediate},
975 {{al, r0, 142},
976 "al r0 142",
977 "ModifiedImmediate_al_r0_142",
978 ARRAY_SIZE(kModifiedImmediate),
979 kModifiedImmediate},
980 {{al, r0, 143},
981 "al r0 143",
982 "ModifiedImmediate_al_r0_143",
983 ARRAY_SIZE(kModifiedImmediate),
984 kModifiedImmediate},
985 {{al, r0, 144},
986 "al r0 144",
987 "ModifiedImmediate_al_r0_144",
988 ARRAY_SIZE(kModifiedImmediate),
989 kModifiedImmediate},
990 {{al, r0, 145},
991 "al r0 145",
992 "ModifiedImmediate_al_r0_145",
993 ARRAY_SIZE(kModifiedImmediate),
994 kModifiedImmediate},
995 {{al, r0, 146},
996 "al r0 146",
997 "ModifiedImmediate_al_r0_146",
998 ARRAY_SIZE(kModifiedImmediate),
999 kModifiedImmediate},
1000 {{al, r0, 147},
1001 "al r0 147",
1002 "ModifiedImmediate_al_r0_147",
1003 ARRAY_SIZE(kModifiedImmediate),
1004 kModifiedImmediate},
1005 {{al, r0, 148},
1006 "al r0 148",
1007 "ModifiedImmediate_al_r0_148",
1008 ARRAY_SIZE(kModifiedImmediate),
1009 kModifiedImmediate},
1010 {{al, r0, 149},
1011 "al r0 149",
1012 "ModifiedImmediate_al_r0_149",
1013 ARRAY_SIZE(kModifiedImmediate),
1014 kModifiedImmediate},
1015 {{al, r0, 150},
1016 "al r0 150",
1017 "ModifiedImmediate_al_r0_150",
1018 ARRAY_SIZE(kModifiedImmediate),
1019 kModifiedImmediate},
1020 {{al, r0, 151},
1021 "al r0 151",
1022 "ModifiedImmediate_al_r0_151",
1023 ARRAY_SIZE(kModifiedImmediate),
1024 kModifiedImmediate},
1025 {{al, r0, 152},
1026 "al r0 152",
1027 "ModifiedImmediate_al_r0_152",
1028 ARRAY_SIZE(kModifiedImmediate),
1029 kModifiedImmediate},
1030 {{al, r0, 153},
1031 "al r0 153",
1032 "ModifiedImmediate_al_r0_153",
1033 ARRAY_SIZE(kModifiedImmediate),
1034 kModifiedImmediate},
1035 {{al, r0, 154},
1036 "al r0 154",
1037 "ModifiedImmediate_al_r0_154",
1038 ARRAY_SIZE(kModifiedImmediate),
1039 kModifiedImmediate},
1040 {{al, r0, 155},
1041 "al r0 155",
1042 "ModifiedImmediate_al_r0_155",
1043 ARRAY_SIZE(kModifiedImmediate),
1044 kModifiedImmediate},
1045 {{al, r0, 156},
1046 "al r0 156",
1047 "ModifiedImmediate_al_r0_156",
1048 ARRAY_SIZE(kModifiedImmediate),
1049 kModifiedImmediate},
1050 {{al, r0, 157},
1051 "al r0 157",
1052 "ModifiedImmediate_al_r0_157",
1053 ARRAY_SIZE(kModifiedImmediate),
1054 kModifiedImmediate},
1055 {{al, r0, 158},
1056 "al r0 158",
1057 "ModifiedImmediate_al_r0_158",
1058 ARRAY_SIZE(kModifiedImmediate),
1059 kModifiedImmediate},
1060 {{al, r0, 159},
1061 "al r0 159",
1062 "ModifiedImmediate_al_r0_159",
1063 ARRAY_SIZE(kModifiedImmediate),
1064 kModifiedImmediate},
1065 {{al, r0, 160},
1066 "al r0 160",
1067 "ModifiedImmediate_al_r0_160",
1068 ARRAY_SIZE(kModifiedImmediate),
1069 kModifiedImmediate},
1070 {{al, r0, 161},
1071 "al r0 161",
1072 "ModifiedImmediate_al_r0_161",
1073 ARRAY_SIZE(kModifiedImmediate),
1074 kModifiedImmediate},
1075 {{al, r0, 162},
1076 "al r0 162",
1077 "ModifiedImmediate_al_r0_162",
1078 ARRAY_SIZE(kModifiedImmediate),
1079 kModifiedImmediate},
1080 {{al, r0, 163},
1081 "al r0 163",
1082 "ModifiedImmediate_al_r0_163",
1083 ARRAY_SIZE(kModifiedImmediate),
1084 kModifiedImmediate},
1085 {{al, r0, 164},
1086 "al r0 164",
1087 "ModifiedImmediate_al_r0_164",
1088 ARRAY_SIZE(kModifiedImmediate),
1089 kModifiedImmediate},
1090 {{al, r0, 165},
1091 "al r0 165",
1092 "ModifiedImmediate_al_r0_165",
1093 ARRAY_SIZE(kModifiedImmediate),
1094 kModifiedImmediate},
1095 {{al, r0, 166},
1096 "al r0 166",
1097 "ModifiedImmediate_al_r0_166",
1098 ARRAY_SIZE(kModifiedImmediate),
1099 kModifiedImmediate},
1100 {{al, r0, 167},
1101 "al r0 167",
1102 "ModifiedImmediate_al_r0_167",
1103 ARRAY_SIZE(kModifiedImmediate),
1104 kModifiedImmediate},
1105 {{al, r0, 168},
1106 "al r0 168",
1107 "ModifiedImmediate_al_r0_168",
1108 ARRAY_SIZE(kModifiedImmediate),
1109 kModifiedImmediate},
1110 {{al, r0, 169},
1111 "al r0 169",
1112 "ModifiedImmediate_al_r0_169",
1113 ARRAY_SIZE(kModifiedImmediate),
1114 kModifiedImmediate},
1115 {{al, r0, 170},
1116 "al r0 170",
1117 "ModifiedImmediate_al_r0_170",
1118 ARRAY_SIZE(kModifiedImmediate),
1119 kModifiedImmediate},
1120 {{al, r0, 171},
1121 "al r0 171",
1122 "ModifiedImmediate_al_r0_171",
1123 ARRAY_SIZE(kModifiedImmediate),
1124 kModifiedImmediate},
1125 {{al, r0, 172},
1126 "al r0 172",
1127 "ModifiedImmediate_al_r0_172",
1128 ARRAY_SIZE(kModifiedImmediate),
1129 kModifiedImmediate},
1130 {{al, r0, 173},
1131 "al r0 173",
1132 "ModifiedImmediate_al_r0_173",
1133 ARRAY_SIZE(kModifiedImmediate),
1134 kModifiedImmediate},
1135 {{al, r0, 174},
1136 "al r0 174",
1137 "ModifiedImmediate_al_r0_174",
1138 ARRAY_SIZE(kModifiedImmediate),
1139 kModifiedImmediate},
1140 {{al, r0, 175},
1141 "al r0 175",
1142 "ModifiedImmediate_al_r0_175",
1143 ARRAY_SIZE(kModifiedImmediate),
1144 kModifiedImmediate},
1145 {{al, r0, 176},
1146 "al r0 176",
1147 "ModifiedImmediate_al_r0_176",
1148 ARRAY_SIZE(kModifiedImmediate),
1149 kModifiedImmediate},
1150 {{al, r0, 177},
1151 "al r0 177",
1152 "ModifiedImmediate_al_r0_177",
1153 ARRAY_SIZE(kModifiedImmediate),
1154 kModifiedImmediate},
1155 {{al, r0, 178},
1156 "al r0 178",
1157 "ModifiedImmediate_al_r0_178",
1158 ARRAY_SIZE(kModifiedImmediate),
1159 kModifiedImmediate},
1160 {{al, r0, 179},
1161 "al r0 179",
1162 "ModifiedImmediate_al_r0_179",
1163 ARRAY_SIZE(kModifiedImmediate),
1164 kModifiedImmediate},
1165 {{al, r0, 180},
1166 "al r0 180",
1167 "ModifiedImmediate_al_r0_180",
1168 ARRAY_SIZE(kModifiedImmediate),
1169 kModifiedImmediate},
1170 {{al, r0, 181},
1171 "al r0 181",
1172 "ModifiedImmediate_al_r0_181",
1173 ARRAY_SIZE(kModifiedImmediate),
1174 kModifiedImmediate},
1175 {{al, r0, 182},
1176 "al r0 182",
1177 "ModifiedImmediate_al_r0_182",
1178 ARRAY_SIZE(kModifiedImmediate),
1179 kModifiedImmediate},
1180 {{al, r0, 183},
1181 "al r0 183",
1182 "ModifiedImmediate_al_r0_183",
1183 ARRAY_SIZE(kModifiedImmediate),
1184 kModifiedImmediate},
1185 {{al, r0, 184},
1186 "al r0 184",
1187 "ModifiedImmediate_al_r0_184",
1188 ARRAY_SIZE(kModifiedImmediate),
1189 kModifiedImmediate},
1190 {{al, r0, 185},
1191 "al r0 185",
1192 "ModifiedImmediate_al_r0_185",
1193 ARRAY_SIZE(kModifiedImmediate),
1194 kModifiedImmediate},
1195 {{al, r0, 186},
1196 "al r0 186",
1197 "ModifiedImmediate_al_r0_186",
1198 ARRAY_SIZE(kModifiedImmediate),
1199 kModifiedImmediate},
1200 {{al, r0, 187},
1201 "al r0 187",
1202 "ModifiedImmediate_al_r0_187",
1203 ARRAY_SIZE(kModifiedImmediate),
1204 kModifiedImmediate},
1205 {{al, r0, 188},
1206 "al r0 188",
1207 "ModifiedImmediate_al_r0_188",
1208 ARRAY_SIZE(kModifiedImmediate),
1209 kModifiedImmediate},
1210 {{al, r0, 189},
1211 "al r0 189",
1212 "ModifiedImmediate_al_r0_189",
1213 ARRAY_SIZE(kModifiedImmediate),
1214 kModifiedImmediate},
1215 {{al, r0, 190},
1216 "al r0 190",
1217 "ModifiedImmediate_al_r0_190",
1218 ARRAY_SIZE(kModifiedImmediate),
1219 kModifiedImmediate},
1220 {{al, r0, 191},
1221 "al r0 191",
1222 "ModifiedImmediate_al_r0_191",
1223 ARRAY_SIZE(kModifiedImmediate),
1224 kModifiedImmediate},
1225 {{al, r0, 192},
1226 "al r0 192",
1227 "ModifiedImmediate_al_r0_192",
1228 ARRAY_SIZE(kModifiedImmediate),
1229 kModifiedImmediate},
1230 {{al, r0, 193},
1231 "al r0 193",
1232 "ModifiedImmediate_al_r0_193",
1233 ARRAY_SIZE(kModifiedImmediate),
1234 kModifiedImmediate},
1235 {{al, r0, 194},
1236 "al r0 194",
1237 "ModifiedImmediate_al_r0_194",
1238 ARRAY_SIZE(kModifiedImmediate),
1239 kModifiedImmediate},
1240 {{al, r0, 195},
1241 "al r0 195",
1242 "ModifiedImmediate_al_r0_195",
1243 ARRAY_SIZE(kModifiedImmediate),
1244 kModifiedImmediate},
1245 {{al, r0, 196},
1246 "al r0 196",
1247 "ModifiedImmediate_al_r0_196",
1248 ARRAY_SIZE(kModifiedImmediate),
1249 kModifiedImmediate},
1250 {{al, r0, 197},
1251 "al r0 197",
1252 "ModifiedImmediate_al_r0_197",
1253 ARRAY_SIZE(kModifiedImmediate),
1254 kModifiedImmediate},
1255 {{al, r0, 198},
1256 "al r0 198",
1257 "ModifiedImmediate_al_r0_198",
1258 ARRAY_SIZE(kModifiedImmediate),
1259 kModifiedImmediate},
1260 {{al, r0, 199},
1261 "al r0 199",
1262 "ModifiedImmediate_al_r0_199",
1263 ARRAY_SIZE(kModifiedImmediate),
1264 kModifiedImmediate},
1265 {{al, r0, 200},
1266 "al r0 200",
1267 "ModifiedImmediate_al_r0_200",
1268 ARRAY_SIZE(kModifiedImmediate),
1269 kModifiedImmediate},
1270 {{al, r0, 201},
1271 "al r0 201",
1272 "ModifiedImmediate_al_r0_201",
1273 ARRAY_SIZE(kModifiedImmediate),
1274 kModifiedImmediate},
1275 {{al, r0, 202},
1276 "al r0 202",
1277 "ModifiedImmediate_al_r0_202",
1278 ARRAY_SIZE(kModifiedImmediate),
1279 kModifiedImmediate},
1280 {{al, r0, 203},
1281 "al r0 203",
1282 "ModifiedImmediate_al_r0_203",
1283 ARRAY_SIZE(kModifiedImmediate),
1284 kModifiedImmediate},
1285 {{al, r0, 204},
1286 "al r0 204",
1287 "ModifiedImmediate_al_r0_204",
1288 ARRAY_SIZE(kModifiedImmediate),
1289 kModifiedImmediate},
1290 {{al, r0, 205},
1291 "al r0 205",
1292 "ModifiedImmediate_al_r0_205",
1293 ARRAY_SIZE(kModifiedImmediate),
1294 kModifiedImmediate},
1295 {{al, r0, 206},
1296 "al r0 206",
1297 "ModifiedImmediate_al_r0_206",
1298 ARRAY_SIZE(kModifiedImmediate),
1299 kModifiedImmediate},
1300 {{al, r0, 207},
1301 "al r0 207",
1302 "ModifiedImmediate_al_r0_207",
1303 ARRAY_SIZE(kModifiedImmediate),
1304 kModifiedImmediate},
1305 {{al, r0, 208},
1306 "al r0 208",
1307 "ModifiedImmediate_al_r0_208",
1308 ARRAY_SIZE(kModifiedImmediate),
1309 kModifiedImmediate},
1310 {{al, r0, 209},
1311 "al r0 209",
1312 "ModifiedImmediate_al_r0_209",
1313 ARRAY_SIZE(kModifiedImmediate),
1314 kModifiedImmediate},
1315 {{al, r0, 210},
1316 "al r0 210",
1317 "ModifiedImmediate_al_r0_210",
1318 ARRAY_SIZE(kModifiedImmediate),
1319 kModifiedImmediate},
1320 {{al, r0, 211},
1321 "al r0 211",
1322 "ModifiedImmediate_al_r0_211",
1323 ARRAY_SIZE(kModifiedImmediate),
1324 kModifiedImmediate},
1325 {{al, r0, 212},
1326 "al r0 212",
1327 "ModifiedImmediate_al_r0_212",
1328 ARRAY_SIZE(kModifiedImmediate),
1329 kModifiedImmediate},
1330 {{al, r0, 213},
1331 "al r0 213",
1332 "ModifiedImmediate_al_r0_213",
1333 ARRAY_SIZE(kModifiedImmediate),
1334 kModifiedImmediate},
1335 {{al, r0, 214},
1336 "al r0 214",
1337 "ModifiedImmediate_al_r0_214",
1338 ARRAY_SIZE(kModifiedImmediate),
1339 kModifiedImmediate},
1340 {{al, r0, 215},
1341 "al r0 215",
1342 "ModifiedImmediate_al_r0_215",
1343 ARRAY_SIZE(kModifiedImmediate),
1344 kModifiedImmediate},
1345 {{al, r0, 216},
1346 "al r0 216",
1347 "ModifiedImmediate_al_r0_216",
1348 ARRAY_SIZE(kModifiedImmediate),
1349 kModifiedImmediate},
1350 {{al, r0, 217},
1351 "al r0 217",
1352 "ModifiedImmediate_al_r0_217",
1353 ARRAY_SIZE(kModifiedImmediate),
1354 kModifiedImmediate},
1355 {{al, r0, 218},
1356 "al r0 218",
1357 "ModifiedImmediate_al_r0_218",
1358 ARRAY_SIZE(kModifiedImmediate),
1359 kModifiedImmediate},
1360 {{al, r0, 219},
1361 "al r0 219",
1362 "ModifiedImmediate_al_r0_219",
1363 ARRAY_SIZE(kModifiedImmediate),
1364 kModifiedImmediate},
1365 {{al, r0, 220},
1366 "al r0 220",
1367 "ModifiedImmediate_al_r0_220",
1368 ARRAY_SIZE(kModifiedImmediate),
1369 kModifiedImmediate},
1370 {{al, r0, 221},
1371 "al r0 221",
1372 "ModifiedImmediate_al_r0_221",
1373 ARRAY_SIZE(kModifiedImmediate),
1374 kModifiedImmediate},
1375 {{al, r0, 222},
1376 "al r0 222",
1377 "ModifiedImmediate_al_r0_222",
1378 ARRAY_SIZE(kModifiedImmediate),
1379 kModifiedImmediate},
1380 {{al, r0, 223},
1381 "al r0 223",
1382 "ModifiedImmediate_al_r0_223",
1383 ARRAY_SIZE(kModifiedImmediate),
1384 kModifiedImmediate},
1385 {{al, r0, 224},
1386 "al r0 224",
1387 "ModifiedImmediate_al_r0_224",
1388 ARRAY_SIZE(kModifiedImmediate),
1389 kModifiedImmediate},
1390 {{al, r0, 225},
1391 "al r0 225",
1392 "ModifiedImmediate_al_r0_225",
1393 ARRAY_SIZE(kModifiedImmediate),
1394 kModifiedImmediate},
1395 {{al, r0, 226},
1396 "al r0 226",
1397 "ModifiedImmediate_al_r0_226",
1398 ARRAY_SIZE(kModifiedImmediate),
1399 kModifiedImmediate},
1400 {{al, r0, 227},
1401 "al r0 227",
1402 "ModifiedImmediate_al_r0_227",
1403 ARRAY_SIZE(kModifiedImmediate),
1404 kModifiedImmediate},
1405 {{al, r0, 228},
1406 "al r0 228",
1407 "ModifiedImmediate_al_r0_228",
1408 ARRAY_SIZE(kModifiedImmediate),
1409 kModifiedImmediate},
1410 {{al, r0, 229},
1411 "al r0 229",
1412 "ModifiedImmediate_al_r0_229",
1413 ARRAY_SIZE(kModifiedImmediate),
1414 kModifiedImmediate},
1415 {{al, r0, 230},
1416 "al r0 230",
1417 "ModifiedImmediate_al_r0_230",
1418 ARRAY_SIZE(kModifiedImmediate),
1419 kModifiedImmediate},
1420 {{al, r0, 231},
1421 "al r0 231",
1422 "ModifiedImmediate_al_r0_231",
1423 ARRAY_SIZE(kModifiedImmediate),
1424 kModifiedImmediate},
1425 {{al, r0, 232},
1426 "al r0 232",
1427 "ModifiedImmediate_al_r0_232",
1428 ARRAY_SIZE(kModifiedImmediate),
1429 kModifiedImmediate},
1430 {{al, r0, 233},
1431 "al r0 233",
1432 "ModifiedImmediate_al_r0_233",
1433 ARRAY_SIZE(kModifiedImmediate),
1434 kModifiedImmediate},
1435 {{al, r0, 234},
1436 "al r0 234",
1437 "ModifiedImmediate_al_r0_234",
1438 ARRAY_SIZE(kModifiedImmediate),
1439 kModifiedImmediate},
1440 {{al, r0, 235},
1441 "al r0 235",
1442 "ModifiedImmediate_al_r0_235",
1443 ARRAY_SIZE(kModifiedImmediate),
1444 kModifiedImmediate},
1445 {{al, r0, 236},
1446 "al r0 236",
1447 "ModifiedImmediate_al_r0_236",
1448 ARRAY_SIZE(kModifiedImmediate),
1449 kModifiedImmediate},
1450 {{al, r0, 237},
1451 "al r0 237",
1452 "ModifiedImmediate_al_r0_237",
1453 ARRAY_SIZE(kModifiedImmediate),
1454 kModifiedImmediate},
1455 {{al, r0, 238},
1456 "al r0 238",
1457 "ModifiedImmediate_al_r0_238",
1458 ARRAY_SIZE(kModifiedImmediate),
1459 kModifiedImmediate},
1460 {{al, r0, 239},
1461 "al r0 239",
1462 "ModifiedImmediate_al_r0_239",
1463 ARRAY_SIZE(kModifiedImmediate),
1464 kModifiedImmediate},
1465 {{al, r0, 240},
1466 "al r0 240",
1467 "ModifiedImmediate_al_r0_240",
1468 ARRAY_SIZE(kModifiedImmediate),
1469 kModifiedImmediate},
1470 {{al, r0, 241},
1471 "al r0 241",
1472 "ModifiedImmediate_al_r0_241",
1473 ARRAY_SIZE(kModifiedImmediate),
1474 kModifiedImmediate},
1475 {{al, r0, 242},
1476 "al r0 242",
1477 "ModifiedImmediate_al_r0_242",
1478 ARRAY_SIZE(kModifiedImmediate),
1479 kModifiedImmediate},
1480 {{al, r0, 243},
1481 "al r0 243",
1482 "ModifiedImmediate_al_r0_243",
1483 ARRAY_SIZE(kModifiedImmediate),
1484 kModifiedImmediate},
1485 {{al, r0, 244},
1486 "al r0 244",
1487 "ModifiedImmediate_al_r0_244",
1488 ARRAY_SIZE(kModifiedImmediate),
1489 kModifiedImmediate},
1490 {{al, r0, 245},
1491 "al r0 245",
1492 "ModifiedImmediate_al_r0_245",
1493 ARRAY_SIZE(kModifiedImmediate),
1494 kModifiedImmediate},
1495 {{al, r0, 246},
1496 "al r0 246",
1497 "ModifiedImmediate_al_r0_246",
1498 ARRAY_SIZE(kModifiedImmediate),
1499 kModifiedImmediate},
1500 {{al, r0, 247},
1501 "al r0 247",
1502 "ModifiedImmediate_al_r0_247",
1503 ARRAY_SIZE(kModifiedImmediate),
1504 kModifiedImmediate},
1505 {{al, r0, 248},
1506 "al r0 248",
1507 "ModifiedImmediate_al_r0_248",
1508 ARRAY_SIZE(kModifiedImmediate),
1509 kModifiedImmediate},
1510 {{al, r0, 249},
1511 "al r0 249",
1512 "ModifiedImmediate_al_r0_249",
1513 ARRAY_SIZE(kModifiedImmediate),
1514 kModifiedImmediate},
1515 {{al, r0, 250},
1516 "al r0 250",
1517 "ModifiedImmediate_al_r0_250",
1518 ARRAY_SIZE(kModifiedImmediate),
1519 kModifiedImmediate},
1520 {{al, r0, 251},
1521 "al r0 251",
1522 "ModifiedImmediate_al_r0_251",
1523 ARRAY_SIZE(kModifiedImmediate),
1524 kModifiedImmediate},
1525 {{al, r0, 252},
1526 "al r0 252",
1527 "ModifiedImmediate_al_r0_252",
1528 ARRAY_SIZE(kModifiedImmediate),
1529 kModifiedImmediate},
1530 {{al, r0, 253},
1531 "al r0 253",
1532 "ModifiedImmediate_al_r0_253",
1533 ARRAY_SIZE(kModifiedImmediate),
1534 kModifiedImmediate},
1535 {{al, r0, 254},
1536 "al r0 254",
1537 "ModifiedImmediate_al_r0_254",
1538 ARRAY_SIZE(kModifiedImmediate),
1539 kModifiedImmediate},
1540 {{al, r0, 255},
1541 "al r0 255",
1542 "ModifiedImmediate_al_r0_255",
1543 ARRAY_SIZE(kModifiedImmediate),
1544 kModifiedImmediate}};
1545
1546 // We record all inputs to the instructions as outputs. This way, we also check
1547 // that what shouldn't change didn't change.
1548 struct TestResult {
1549 size_t output_size;
1550 const Inputs* outputs;
1551 };
1552
1553 // These headers each contain an array of `TestResult` with the reference output
1554 // values. The reference arrays are names `kReference{mnemonic}`.
1555 #include "aarch32/traces/simulator-cond-rdlow-operand-imm8-cmp-t32.h"
1556 #include "aarch32/traces/simulator-cond-rdlow-operand-imm8-mov-t32.h"
1557 #include "aarch32/traces/simulator-cond-rdlow-operand-imm8-movs-t32.h"
1558
1559
1560 // The maximum number of errors to report in detail for each test.
1561 const unsigned kErrorReportLimit = 8;
1562
1563 typedef void (MacroAssembler::*Fn)(Condition cond,
1564 Register rd,
1565 const Operand& op);
1566
TestHelper(Fn instruction,const char * mnemonic,const TestResult reference[])1567 void TestHelper(Fn instruction,
1568 const char* mnemonic,
1569 const TestResult reference[]) {
1570 SETUP();
1571 masm.UseT32();
1572 START();
1573
1574 // Data to compare to `reference`.
1575 TestResult* results[ARRAY_SIZE(kTests)];
1576
1577 // Test cases for memory bound instructions may allocate a buffer and save its
1578 // address in this array.
1579 byte* scratch_memory_buffers[ARRAY_SIZE(kTests)];
1580
1581 // Generate a loop for each element in `kTests`. Each loop tests one specific
1582 // instruction.
1583 for (unsigned i = 0; i < ARRAY_SIZE(kTests); i++) {
1584 // Allocate results on the heap for this test.
1585 results[i] = new TestResult;
1586 results[i]->outputs = new Inputs[kTests[i].input_size];
1587 results[i]->output_size = kTests[i].input_size;
1588
1589 size_t input_stride = sizeof(kTests[i].inputs[0]) * kTests[i].input_size;
1590 VIXL_ASSERT(IsUint32(input_stride));
1591
1592 scratch_memory_buffers[i] = NULL;
1593
1594 Label loop;
1595 UseScratchRegisterScope scratch_registers(&masm);
1596 // Include all registers from r0 ro r12.
1597 scratch_registers.Include(RegisterList(0x1fff));
1598
1599 // Values to pass to the macro-assembler.
1600 Condition cond = kTests[i].operands.cond;
1601 Register rd = kTests[i].operands.rd;
1602 int32_t immediate = kTests[i].operands.immediate;
1603 Operand op(immediate);
1604 scratch_registers.Exclude(rd);
1605
1606 // Allocate reserved registers for our own use.
1607 Register input_ptr = scratch_registers.Acquire();
1608 Register input_end = scratch_registers.Acquire();
1609 Register result_ptr = scratch_registers.Acquire();
1610
1611 // Initialize `input_ptr` to the first element and `input_end` the address
1612 // after the array.
1613 __ Mov(input_ptr, Operand::From(kTests[i].inputs));
1614 __ Add(input_end, input_ptr, static_cast<uint32_t>(input_stride));
1615 __ Mov(result_ptr, Operand::From(results[i]->outputs));
1616 __ Bind(&loop);
1617
1618 {
1619 UseScratchRegisterScope temp_registers(&masm);
1620 Register nzcv_bits = temp_registers.Acquire();
1621 Register saved_q_bit = temp_registers.Acquire();
1622 // Save the `Q` bit flag.
1623 __ Mrs(saved_q_bit, APSR);
1624 __ And(saved_q_bit, saved_q_bit, QFlag);
1625 // Set the `NZCV` and `Q` flags together.
1626 __ Ldr(nzcv_bits, MemOperand(input_ptr, offsetof(Inputs, apsr)));
1627 __ Orr(nzcv_bits, nzcv_bits, saved_q_bit);
1628 __ Msr(APSR_nzcvq, nzcv_bits);
1629 }
1630 __ Ldr(rd, MemOperand(input_ptr, offsetof(Inputs, rd)));
1631
1632 (masm.*instruction)(cond, rd, op);
1633
1634 {
1635 UseScratchRegisterScope temp_registers(&masm);
1636 Register nzcv_bits = temp_registers.Acquire();
1637 __ Mrs(nzcv_bits, APSR);
1638 // Only record the NZCV bits.
1639 __ And(nzcv_bits, nzcv_bits, NZCVFlag);
1640 __ Str(nzcv_bits, MemOperand(result_ptr, offsetof(Inputs, apsr)));
1641 }
1642 __ Str(rd, MemOperand(result_ptr, offsetof(Inputs, rd)));
1643
1644 // Advance the result pointer.
1645 __ Add(result_ptr, result_ptr, Operand::From(sizeof(kTests[i].inputs[0])));
1646 // Loop back until `input_ptr` is lower than `input_base`.
1647 __ Add(input_ptr, input_ptr, Operand::From(sizeof(kTests[i].inputs[0])));
1648 __ Cmp(input_ptr, input_end);
1649 __ B(ne, &loop);
1650 }
1651
1652 END();
1653
1654 RUN();
1655
1656 if (Test::generate_test_trace()) {
1657 // Print the results.
1658 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) {
1659 printf("const Inputs kOutputs_%s_%s[] = {\n",
1660 mnemonic,
1661 kTests[i].identifier);
1662 for (size_t j = 0; j < results[i]->output_size; j++) {
1663 printf(" { ");
1664 printf("0x%08" PRIx32, results[i]->outputs[j].apsr);
1665 printf(", ");
1666 printf("0x%08" PRIx32, results[i]->outputs[j].rd);
1667 printf(" },\n");
1668 }
1669 printf("};\n");
1670 }
1671 printf("const TestResult kReference%s[] = {\n", mnemonic);
1672 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) {
1673 printf(" {\n");
1674 printf(" ARRAY_SIZE(kOutputs_%s_%s),\n",
1675 mnemonic,
1676 kTests[i].identifier);
1677 printf(" kOutputs_%s_%s,\n", mnemonic, kTests[i].identifier);
1678 printf(" },\n");
1679 }
1680 printf("};\n");
1681 } else if (kCheckSimulatorTestResults) {
1682 // Check the results.
1683 unsigned total_error_count = 0;
1684 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) {
1685 bool instruction_has_errors = false;
1686 for (size_t j = 0; j < kTests[i].input_size; j++) {
1687 uint32_t apsr = results[i]->outputs[j].apsr;
1688 uint32_t rd = results[i]->outputs[j].rd;
1689 uint32_t apsr_input = kTests[i].inputs[j].apsr;
1690 uint32_t rd_input = kTests[i].inputs[j].rd;
1691 uint32_t apsr_ref = reference[i].outputs[j].apsr;
1692 uint32_t rd_ref = reference[i].outputs[j].rd;
1693
1694 if (((apsr != apsr_ref) || (rd != rd_ref)) &&
1695 (++total_error_count <= kErrorReportLimit)) {
1696 // Print the instruction once even if it triggered multiple failures.
1697 if (!instruction_has_errors) {
1698 printf("Error(s) when testing \"%s %s\":\n",
1699 mnemonic,
1700 kTests[i].operands_description);
1701 instruction_has_errors = true;
1702 }
1703 // Print subsequent errors.
1704 printf(" Input: ");
1705 printf("0x%08" PRIx32, apsr_input);
1706 printf(", ");
1707 printf("0x%08" PRIx32, rd_input);
1708 printf("\n");
1709 printf(" Expected: ");
1710 printf("0x%08" PRIx32, apsr_ref);
1711 printf(", ");
1712 printf("0x%08" PRIx32, rd_ref);
1713 printf("\n");
1714 printf(" Found: ");
1715 printf("0x%08" PRIx32, apsr);
1716 printf(", ");
1717 printf("0x%08" PRIx32, rd);
1718 printf("\n\n");
1719 }
1720 }
1721 }
1722
1723 if (total_error_count > kErrorReportLimit) {
1724 printf("%u other errors follow.\n",
1725 total_error_count - kErrorReportLimit);
1726 }
1727 VIXL_CHECK(total_error_count == 0);
1728 } else {
1729 VIXL_WARNING("Assembled the code, but did not run anything.\n");
1730 }
1731
1732 for (size_t i = 0; i < ARRAY_SIZE(kTests); i++) {
1733 delete[] results[i]->outputs;
1734 delete results[i];
1735 delete[] scratch_memory_buffers[i];
1736 }
1737 }
1738
1739 // Instantiate tests for each instruction in the list.
1740 // TODO: Remove this limitation by having a sandboxing mechanism.
1741 #if defined(VIXL_HOST_POINTER_32)
1742 #define TEST(mnemonic) \
1743 void Test_##mnemonic() { \
1744 TestHelper(&MacroAssembler::mnemonic, #mnemonic, kReference##mnemonic); \
1745 } \
1746 Test test_##mnemonic("AARCH32_SIMULATOR_COND_RDLOW_OPERAND_IMM8_" #mnemonic \
1747 "_T32", \
1748 &Test_##mnemonic);
1749 #else
1750 #define TEST(mnemonic) \
1751 void Test_##mnemonic() { \
1752 VIXL_WARNING("This test can only run on a 32-bit host.\n"); \
1753 USE(TestHelper); \
1754 } \
1755 Test test_##mnemonic("AARCH32_SIMULATOR_COND_RDLOW_OPERAND_IMM8_" #mnemonic \
1756 "_T32", \
1757 &Test_##mnemonic);
1758 #endif
1759
1760 FOREACH_INSTRUCTION(TEST)
1761 #undef TEST
1762
1763 } // namespace
1764 #endif
1765
1766 } // namespace aarch32
1767 } // namespace vixl
1768