• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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-assembler-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 
45 #define BUF_SIZE (4096)
46 
47 namespace vixl {
48 namespace aarch32 {
49 
50 // List of instruction mnemonics.
51 #define FOREACH_INSTRUCTION(M) \
52   M(add)                       \
53   M(sub)
54 
55 
56 // The following definitions are defined again in each generated test, therefore
57 // we need to place them in an anomymous namespace. It expresses that they are
58 // local to this file only, and the compiler is not allowed to share these types
59 // across test files during template instantiation. Specifically, `Operands` has
60 // various layouts across generated tests so it absolutely cannot be shared.
61 
62 #ifdef VIXL_INCLUDE_TARGET_T32
63 namespace {
64 
65 // Values to be passed to the assembler to produce the instruction under test.
66 struct Operands {
67   Condition cond;
68   Register rd;
69   Register rn;
70   Register rm;
71 };
72 
73 // This structure contains all data needed to test one specific
74 // instruction.
75 struct TestData {
76   // The `operands` field represents what to pass to the assembler to
77   // produce the instruction.
78   Operands operands;
79   // True if we need to generate an IT instruction for this test to be valid.
80   bool in_it_block;
81   // The condition to give the IT instruction, this will be set to "al" by
82   // default.
83   Condition it_condition;
84   // Description of the operands, used for error reporting.
85   const char* operands_description;
86   // Unique identifier, used for generating traces.
87   const char* identifier;
88 };
89 
90 struct TestResult {
91   size_t size;
92   const byte* encoding;
93 };
94 
95 // Each element of this array produce one instruction encoding.
96 const TestData kTests[] =
97     {{{cs, r7, r1, r5}, true, cs, "cs r7 r1 r5", "cs_r7_r1_r5"},
98      {{gt, r3, r1, r0}, true, gt, "gt r3 r1 r0", "gt_r3_r1_r0"},
99      {{ls, r4, r3, r6}, true, ls, "ls r4 r3 r6", "ls_r4_r3_r6"},
100      {{pl, r5, r3, r4}, true, pl, "pl r5 r3 r4", "pl_r5_r3_r4"},
101      {{hi, r1, r0, r0}, true, hi, "hi r1 r0 r0", "hi_r1_r0_r0"},
102      {{ls, r1, r2, r3}, true, ls, "ls r1 r2 r3", "ls_r1_r2_r3"},
103      {{vc, r4, r3, r4}, true, vc, "vc r4 r3 r4", "vc_r4_r3_r4"},
104      {{ne, r1, r7, r0}, true, ne, "ne r1 r7 r0", "ne_r1_r7_r0"},
105      {{ls, r3, r4, r0}, true, ls, "ls r3 r4 r0", "ls_r3_r4_r0"},
106      {{gt, r6, r4, r3}, true, gt, "gt r6 r4 r3", "gt_r6_r4_r3"},
107      {{ne, r5, r1, r0}, true, ne, "ne r5 r1 r0", "ne_r5_r1_r0"},
108      {{eq, r4, r6, r0}, true, eq, "eq r4 r6 r0", "eq_r4_r6_r0"},
109      {{mi, r2, r6, r1}, true, mi, "mi r2 r6 r1", "mi_r2_r6_r1"},
110      {{cs, r1, r4, r7}, true, cs, "cs r1 r4 r7", "cs_r1_r4_r7"},
111      {{hi, r6, r0, r2}, true, hi, "hi r6 r0 r2", "hi_r6_r0_r2"},
112      {{ne, r1, r7, r1}, true, ne, "ne r1 r7 r1", "ne_r1_r7_r1"},
113      {{lt, r4, r3, r3}, true, lt, "lt r4 r3 r3", "lt_r4_r3_r3"},
114      {{le, r5, r5, r4}, true, le, "le r5 r5 r4", "le_r5_r5_r4"},
115      {{ls, r3, r3, r1}, true, ls, "ls r3 r3 r1", "ls_r3_r3_r1"},
116      {{cc, r0, r4, r7}, true, cc, "cc r0 r4 r7", "cc_r0_r4_r7"},
117      {{eq, r6, r0, r6}, true, eq, "eq r6 r0 r6", "eq_r6_r0_r6"},
118      {{eq, r4, r3, r0}, true, eq, "eq r4 r3 r0", "eq_r4_r3_r0"},
119      {{vs, r4, r5, r7}, true, vs, "vs r4 r5 r7", "vs_r4_r5_r7"},
120      {{cs, r7, r4, r4}, true, cs, "cs r7 r4 r4", "cs_r7_r4_r4"},
121      {{lt, r3, r5, r2}, true, lt, "lt r3 r5 r2", "lt_r3_r5_r2"},
122      {{cc, r1, r6, r7}, true, cc, "cc r1 r6 r7", "cc_r1_r6_r7"},
123      {{ne, r1, r0, r1}, true, ne, "ne r1 r0 r1", "ne_r1_r0_r1"},
124      {{ge, r1, r3, r4}, true, ge, "ge r1 r3 r4", "ge_r1_r3_r4"},
125      {{lt, r6, r3, r3}, true, lt, "lt r6 r3 r3", "lt_r6_r3_r3"},
126      {{cs, r7, r2, r5}, true, cs, "cs r7 r2 r5", "cs_r7_r2_r5"},
127      {{ge, r6, r2, r3}, true, ge, "ge r6 r2 r3", "ge_r6_r2_r3"},
128      {{cc, r5, r6, r6}, true, cc, "cc r5 r6 r6", "cc_r5_r6_r6"},
129      {{ge, r7, r2, r4}, true, ge, "ge r7 r2 r4", "ge_r7_r2_r4"},
130      {{ls, r3, r1, r3}, true, ls, "ls r3 r1 r3", "ls_r3_r1_r3"},
131      {{le, r2, r4, r0}, true, le, "le r2 r4 r0", "le_r2_r4_r0"},
132      {{ge, r0, r7, r7}, true, ge, "ge r0 r7 r7", "ge_r0_r7_r7"},
133      {{hi, r0, r0, r2}, true, hi, "hi r0 r0 r2", "hi_r0_r0_r2"},
134      {{eq, r2, r3, r2}, true, eq, "eq r2 r3 r2", "eq_r2_r3_r2"},
135      {{ne, r1, r1, r4}, true, ne, "ne r1 r1 r4", "ne_r1_r1_r4"},
136      {{gt, r7, r0, r0}, true, gt, "gt r7 r0 r0", "gt_r7_r0_r0"},
137      {{ne, r0, r3, r6}, true, ne, "ne r0 r3 r6", "ne_r0_r3_r6"},
138      {{lt, r6, r4, r1}, true, lt, "lt r6 r4 r1", "lt_r6_r4_r1"},
139      {{cs, r1, r7, r7}, true, cs, "cs r1 r7 r7", "cs_r1_r7_r7"},
140      {{ge, r6, r5, r5}, true, ge, "ge r6 r5 r5", "ge_r6_r5_r5"},
141      {{le, r6, r5, r1}, true, le, "le r6 r5 r1", "le_r6_r5_r1"},
142      {{vc, r6, r2, r3}, true, vc, "vc r6 r2 r3", "vc_r6_r2_r3"},
143      {{mi, r3, r3, r1}, true, mi, "mi r3 r3 r1", "mi_r3_r3_r1"},
144      {{ls, r2, r7, r5}, true, ls, "ls r2 r7 r5", "ls_r2_r7_r5"},
145      {{hi, r6, r7, r6}, true, hi, "hi r6 r7 r6", "hi_r6_r7_r6"},
146      {{ls, r1, r6, r2}, true, ls, "ls r1 r6 r2", "ls_r1_r6_r2"},
147      {{cc, r1, r1, r6}, true, cc, "cc r1 r1 r6", "cc_r1_r1_r6"},
148      {{vc, r4, r6, r3}, true, vc, "vc r4 r6 r3", "vc_r4_r6_r3"},
149      {{vs, r7, r6, r3}, true, vs, "vs r7 r6 r3", "vs_r7_r6_r3"},
150      {{mi, r3, r0, r4}, true, mi, "mi r3 r0 r4", "mi_r3_r0_r4"},
151      {{ls, r1, r6, r7}, true, ls, "ls r1 r6 r7", "ls_r1_r6_r7"},
152      {{pl, r7, r6, r5}, true, pl, "pl r7 r6 r5", "pl_r7_r6_r5"},
153      {{eq, r0, r4, r4}, true, eq, "eq r0 r4 r4", "eq_r0_r4_r4"},
154      {{eq, r1, r4, r5}, true, eq, "eq r1 r4 r5", "eq_r1_r4_r5"},
155      {{ne, r2, r4, r0}, true, ne, "ne r2 r4 r0", "ne_r2_r4_r0"},
156      {{mi, r3, r6, r0}, true, mi, "mi r3 r6 r0", "mi_r3_r6_r0"},
157      {{le, r1, r5, r5}, true, le, "le r1 r5 r5", "le_r1_r5_r5"},
158      {{gt, r7, r5, r0}, true, gt, "gt r7 r5 r0", "gt_r7_r5_r0"},
159      {{vc, r4, r1, r6}, true, vc, "vc r4 r1 r6", "vc_r4_r1_r6"},
160      {{vc, r5, r0, r1}, true, vc, "vc r5 r0 r1", "vc_r5_r0_r1"},
161      {{gt, r0, r1, r4}, true, gt, "gt r0 r1 r4", "gt_r0_r1_r4"},
162      {{vs, r4, r7, r0}, true, vs, "vs r4 r7 r0", "vs_r4_r7_r0"},
163      {{eq, r6, r6, r3}, true, eq, "eq r6 r6 r3", "eq_r6_r6_r3"},
164      {{vs, r4, r5, r5}, true, vs, "vs r4 r5 r5", "vs_r4_r5_r5"},
165      {{ne, r3, r4, r0}, true, ne, "ne r3 r4 r0", "ne_r3_r4_r0"},
166      {{eq, r0, r5, r2}, true, eq, "eq r0 r5 r2", "eq_r0_r5_r2"},
167      {{ne, r2, r2, r5}, true, ne, "ne r2 r2 r5", "ne_r2_r2_r5"},
168      {{ge, r3, r2, r3}, true, ge, "ge r3 r2 r3", "ge_r3_r2_r3"},
169      {{vc, r2, r0, r3}, true, vc, "vc r2 r0 r3", "vc_r2_r0_r3"},
170      {{eq, r1, r6, r1}, true, eq, "eq r1 r6 r1", "eq_r1_r6_r1"},
171      {{vs, r4, r7, r3}, true, vs, "vs r4 r7 r3", "vs_r4_r7_r3"},
172      {{mi, r4, r0, r1}, true, mi, "mi r4 r0 r1", "mi_r4_r0_r1"},
173      {{cc, r3, r7, r1}, true, cc, "cc r3 r7 r1", "cc_r3_r7_r1"},
174      {{eq, r4, r2, r0}, true, eq, "eq r4 r2 r0", "eq_r4_r2_r0"},
175      {{cs, r5, r0, r1}, true, cs, "cs r5 r0 r1", "cs_r5_r0_r1"},
176      {{vc, r0, r3, r7}, true, vc, "vc r0 r3 r7", "vc_r0_r3_r7"},
177      {{pl, r4, r5, r6}, true, pl, "pl r4 r5 r6", "pl_r4_r5_r6"},
178      {{vc, r3, r0, r3}, true, vc, "vc r3 r0 r3", "vc_r3_r0_r3"},
179      {{gt, r3, r0, r1}, true, gt, "gt r3 r0 r1", "gt_r3_r0_r1"},
180      {{cs, r6, r0, r5}, true, cs, "cs r6 r0 r5", "cs_r6_r0_r5"},
181      {{ge, r4, r3, r6}, true, ge, "ge r4 r3 r6", "ge_r4_r3_r6"},
182      {{cc, r3, r4, r3}, true, cc, "cc r3 r4 r3", "cc_r3_r4_r3"},
183      {{ge, r6, r7, r6}, true, ge, "ge r6 r7 r6", "ge_r6_r7_r6"},
184      {{lt, r0, r5, r3}, true, lt, "lt r0 r5 r3", "lt_r0_r5_r3"},
185      {{ge, r4, r2, r3}, true, ge, "ge r4 r2 r3", "ge_r4_r2_r3"},
186      {{ge, r3, r5, r1}, true, ge, "ge r3 r5 r1", "ge_r3_r5_r1"},
187      {{ne, r2, r3, r0}, true, ne, "ne r2 r3 r0", "ne_r2_r3_r0"},
188      {{eq, r2, r0, r6}, true, eq, "eq r2 r0 r6", "eq_r2_r0_r6"},
189      {{gt, r7, r0, r6}, true, gt, "gt r7 r0 r6", "gt_r7_r0_r6"},
190      {{ls, r7, r5, r4}, true, ls, "ls r7 r5 r4", "ls_r7_r5_r4"},
191      {{vs, r1, r1, r1}, true, vs, "vs r1 r1 r1", "vs_r1_r1_r1"},
192      {{hi, r5, r0, r0}, true, hi, "hi r5 r0 r0", "hi_r5_r0_r0"},
193      {{lt, r4, r5, r7}, true, lt, "lt r4 r5 r7", "lt_r4_r5_r7"},
194      {{vs, r0, r6, r0}, true, vs, "vs r0 r6 r0", "vs_r0_r6_r0"},
195      {{pl, r0, r3, r6}, true, pl, "pl r0 r3 r6", "pl_r0_r3_r6"},
196      {{gt, r3, r4, r4}, true, gt, "gt r3 r4 r4", "gt_r3_r4_r4"},
197      {{le, r6, r2, r3}, true, le, "le r6 r2 r3", "le_r6_r2_r3"},
198      {{vc, r7, r2, r6}, true, vc, "vc r7 r2 r6", "vc_r7_r2_r6"},
199      {{cc, r4, r3, r7}, true, cc, "cc r4 r3 r7", "cc_r4_r3_r7"},
200      {{ge, r7, r5, r2}, true, ge, "ge r7 r5 r2", "ge_r7_r5_r2"},
201      {{cs, r6, r1, r3}, true, cs, "cs r6 r1 r3", "cs_r6_r1_r3"},
202      {{ls, r6, r1, r6}, true, ls, "ls r6 r1 r6", "ls_r6_r1_r6"},
203      {{cs, r1, r2, r5}, true, cs, "cs r1 r2 r5", "cs_r1_r2_r5"},
204      {{vs, r3, r5, r2}, true, vs, "vs r3 r5 r2", "vs_r3_r5_r2"},
205      {{ne, r3, r2, r6}, true, ne, "ne r3 r2 r6", "ne_r3_r2_r6"},
206      {{pl, r4, r1, r4}, true, pl, "pl r4 r1 r4", "pl_r4_r1_r4"},
207      {{vs, r5, r0, r2}, true, vs, "vs r5 r0 r2", "vs_r5_r0_r2"},
208      {{eq, r4, r5, r2}, true, eq, "eq r4 r5 r2", "eq_r4_r5_r2"},
209      {{cc, r1, r6, r0}, true, cc, "cc r1 r6 r0", "cc_r1_r6_r0"},
210      {{gt, r1, r3, r6}, true, gt, "gt r1 r3 r6", "gt_r1_r3_r6"},
211      {{pl, r2, r2, r5}, true, pl, "pl r2 r2 r5", "pl_r2_r2_r5"},
212      {{ls, r5, r7, r6}, true, ls, "ls r5 r7 r6", "ls_r5_r7_r6"},
213      {{ge, r2, r2, r3}, true, ge, "ge r2 r2 r3", "ge_r2_r2_r3"},
214      {{ge, r2, r7, r4}, true, ge, "ge r2 r7 r4", "ge_r2_r7_r4"},
215      {{ls, r1, r4, r3}, true, ls, "ls r1 r4 r3", "ls_r1_r4_r3"},
216      {{lt, r0, r0, r5}, true, lt, "lt r0 r0 r5", "lt_r0_r0_r5"},
217      {{le, r6, r6, r1}, true, le, "le r6 r6 r1", "le_r6_r6_r1"},
218      {{eq, r2, r0, r4}, true, eq, "eq r2 r0 r4", "eq_r2_r0_r4"},
219      {{gt, r3, r6, r4}, true, gt, "gt r3 r6 r4", "gt_r3_r6_r4"},
220      {{le, r6, r6, r6}, true, le, "le r6 r6 r6", "le_r6_r6_r6"},
221      {{pl, r4, r2, r3}, true, pl, "pl r4 r2 r3", "pl_r4_r2_r3"},
222      {{vs, r1, r1, r6}, true, vs, "vs r1 r1 r6", "vs_r1_r1_r6"},
223      {{ls, r3, r7, r3}, true, ls, "ls r3 r7 r3", "ls_r3_r7_r3"},
224      {{ge, r3, r0, r4}, true, ge, "ge r3 r0 r4", "ge_r3_r0_r4"},
225      {{hi, r4, r4, r0}, true, hi, "hi r4 r4 r0", "hi_r4_r4_r0"},
226      {{cc, r1, r7, r4}, true, cc, "cc r1 r7 r4", "cc_r1_r7_r4"},
227      {{hi, r6, r7, r4}, true, hi, "hi r6 r7 r4", "hi_r6_r7_r4"},
228      {{ls, r0, r0, r1}, true, ls, "ls r0 r0 r1", "ls_r0_r0_r1"},
229      {{cs, r0, r3, r1}, true, cs, "cs r0 r3 r1", "cs_r0_r3_r1"},
230      {{pl, r7, r5, r5}, true, pl, "pl r7 r5 r5", "pl_r7_r5_r5"},
231      {{le, r3, r0, r1}, true, le, "le r3 r0 r1", "le_r3_r0_r1"},
232      {{ne, r7, r7, r0}, true, ne, "ne r7 r7 r0", "ne_r7_r7_r0"},
233      {{vs, r1, r7, r7}, true, vs, "vs r1 r7 r7", "vs_r1_r7_r7"},
234      {{pl, r5, r0, r5}, true, pl, "pl r5 r0 r5", "pl_r5_r0_r5"},
235      {{gt, r2, r0, r2}, true, gt, "gt r2 r0 r2", "gt_r2_r0_r2"},
236      {{hi, r1, r4, r0}, true, hi, "hi r1 r4 r0", "hi_r1_r4_r0"},
237      {{hi, r2, r2, r4}, true, hi, "hi r2 r2 r4", "hi_r2_r2_r4"},
238      {{hi, r0, r7, r4}, true, hi, "hi r0 r7 r4", "hi_r0_r7_r4"},
239      {{cc, r6, r7, r1}, true, cc, "cc r6 r7 r1", "cc_r6_r7_r1"},
240      {{vc, r2, r1, r0}, true, vc, "vc r2 r1 r0", "vc_r2_r1_r0"},
241      {{vs, r2, r3, r4}, true, vs, "vs r2 r3 r4", "vs_r2_r3_r4"},
242      {{ge, r7, r7, r3}, true, ge, "ge r7 r7 r3", "ge_r7_r7_r3"},
243      {{ls, r3, r3, r7}, true, ls, "ls r3 r3 r7", "ls_r3_r3_r7"},
244      {{cc, r6, r5, r2}, true, cc, "cc r6 r5 r2", "cc_r6_r5_r2"},
245      {{le, r6, r6, r0}, true, le, "le r6 r6 r0", "le_r6_r6_r0"},
246      {{cc, r6, r2, r0}, true, cc, "cc r6 r2 r0", "cc_r6_r2_r0"},
247      {{pl, r2, r3, r3}, true, pl, "pl r2 r3 r3", "pl_r2_r3_r3"},
248      {{ge, r3, r1, r1}, true, ge, "ge r3 r1 r1", "ge_r3_r1_r1"},
249      {{cs, r4, r4, r3}, true, cs, "cs r4 r4 r3", "cs_r4_r4_r3"},
250      {{ne, r3, r7, r0}, true, ne, "ne r3 r7 r0", "ne_r3_r7_r0"},
251      {{ls, r4, r2, r0}, true, ls, "ls r4 r2 r0", "ls_r4_r2_r0"},
252      {{eq, r7, r7, r2}, true, eq, "eq r7 r7 r2", "eq_r7_r7_r2"},
253      {{ls, r6, r1, r3}, true, ls, "ls r6 r1 r3", "ls_r6_r1_r3"},
254      {{ne, r1, r7, r4}, true, ne, "ne r1 r7 r4", "ne_r1_r7_r4"},
255      {{mi, r1, r7, r6}, true, mi, "mi r1 r7 r6", "mi_r1_r7_r6"},
256      {{ne, r7, r2, r5}, true, ne, "ne r7 r2 r5", "ne_r7_r2_r5"},
257      {{eq, r6, r6, r1}, true, eq, "eq r6 r6 r1", "eq_r6_r6_r1"},
258      {{hi, r6, r7, r2}, true, hi, "hi r6 r7 r2", "hi_r6_r7_r2"},
259      {{cs, r0, r3, r5}, true, cs, "cs r0 r3 r5", "cs_r0_r3_r5"},
260      {{le, r1, r0, r2}, true, le, "le r1 r0 r2", "le_r1_r0_r2"},
261      {{mi, r0, r1, r4}, true, mi, "mi r0 r1 r4", "mi_r0_r1_r4"},
262      {{gt, r4, r6, r4}, true, gt, "gt r4 r6 r4", "gt_r4_r6_r4"},
263      {{le, r1, r2, r0}, true, le, "le r1 r2 r0", "le_r1_r2_r0"},
264      {{gt, r2, r7, r3}, true, gt, "gt r2 r7 r3", "gt_r2_r7_r3"},
265      {{mi, r4, r5, r7}, true, mi, "mi r4 r5 r7", "mi_r4_r5_r7"},
266      {{cs, r2, r5, r3}, true, cs, "cs r2 r5 r3", "cs_r2_r5_r3"},
267      {{cc, r3, r6, r0}, true, cc, "cc r3 r6 r0", "cc_r3_r6_r0"},
268      {{cs, r4, r2, r1}, true, cs, "cs r4 r2 r1", "cs_r4_r2_r1"},
269      {{eq, r0, r0, r1}, true, eq, "eq r0 r0 r1", "eq_r0_r0_r1"},
270      {{cc, r7, r7, r5}, true, cc, "cc r7 r7 r5", "cc_r7_r7_r5"},
271      {{ne, r7, r0, r3}, true, ne, "ne r7 r0 r3", "ne_r7_r0_r3"},
272      {{gt, r1, r5, r7}, true, gt, "gt r1 r5 r7", "gt_r1_r5_r7"},
273      {{le, r0, r6, r7}, true, le, "le r0 r6 r7", "le_r0_r6_r7"},
274      {{pl, r6, r3, r5}, true, pl, "pl r6 r3 r5", "pl_r6_r3_r5"},
275      {{ne, r0, r3, r5}, true, ne, "ne r0 r3 r5", "ne_r0_r3_r5"},
276      {{mi, r6, r4, r2}, true, mi, "mi r6 r4 r2", "mi_r6_r4_r2"},
277      {{ls, r1, r7, r2}, true, ls, "ls r1 r7 r2", "ls_r1_r7_r2"},
278      {{pl, r6, r0, r6}, true, pl, "pl r6 r0 r6", "pl_r6_r0_r6"},
279      {{cs, r3, r2, r5}, true, cs, "cs r3 r2 r5", "cs_r3_r2_r5"},
280      {{eq, r5, r3, r6}, true, eq, "eq r5 r3 r6", "eq_r5_r3_r6"},
281      {{ls, r6, r3, r1}, true, ls, "ls r6 r3 r1", "ls_r6_r3_r1"},
282      {{vs, r7, r1, r0}, true, vs, "vs r7 r1 r0", "vs_r7_r1_r0"},
283      {{mi, r2, r7, r2}, true, mi, "mi r2 r7 r2", "mi_r2_r7_r2"},
284      {{gt, r3, r7, r2}, true, gt, "gt r3 r7 r2", "gt_r3_r7_r2"},
285      {{vs, r5, r6, r6}, true, vs, "vs r5 r6 r6", "vs_r5_r6_r6"},
286      {{pl, r7, r6, r7}, true, pl, "pl r7 r6 r7", "pl_r7_r6_r7"},
287      {{vs, r5, r5, r2}, true, vs, "vs r5 r5 r2", "vs_r5_r5_r2"},
288      {{ls, r5, r3, r6}, true, ls, "ls r5 r3 r6", "ls_r5_r3_r6"},
289      {{cs, r2, r0, r2}, true, cs, "cs r2 r0 r2", "cs_r2_r0_r2"},
290      {{ls, r4, r6, r5}, true, ls, "ls r4 r6 r5", "ls_r4_r6_r5"},
291      {{lt, r0, r5, r1}, true, lt, "lt r0 r5 r1", "lt_r0_r5_r1"},
292      {{vc, r6, r5, r1}, true, vc, "vc r6 r5 r1", "vc_r6_r5_r1"},
293      {{le, r6, r1, r0}, true, le, "le r6 r1 r0", "le_r6_r1_r0"},
294      {{vs, r6, r4, r3}, true, vs, "vs r6 r4 r3", "vs_r6_r4_r3"},
295      {{mi, r7, r4, r2}, true, mi, "mi r7 r4 r2", "mi_r7_r4_r2"},
296      {{hi, r2, r3, r5}, true, hi, "hi r2 r3 r5", "hi_r2_r3_r5"},
297      {{vs, r2, r5, r4}, true, vs, "vs r2 r5 r4", "vs_r2_r5_r4"},
298      {{lt, r7, r4, r2}, true, lt, "lt r7 r4 r2", "lt_r7_r4_r2"},
299      {{ne, r5, r6, r1}, true, ne, "ne r5 r6 r1", "ne_r5_r6_r1"},
300      {{ne, r5, r3, r7}, true, ne, "ne r5 r3 r7", "ne_r5_r3_r7"},
301      {{le, r3, r1, r3}, true, le, "le r3 r1 r3", "le_r3_r1_r3"},
302      {{pl, r5, r5, r6}, true, pl, "pl r5 r5 r6", "pl_r5_r5_r6"},
303      {{ne, r5, r5, r6}, true, ne, "ne r5 r5 r6", "ne_r5_r5_r6"},
304      {{ne, r3, r7, r1}, true, ne, "ne r3 r7 r1", "ne_r3_r7_r1"},
305      {{mi, r2, r7, r0}, true, mi, "mi r2 r7 r0", "mi_r2_r7_r0"},
306      {{pl, r1, r2, r1}, true, pl, "pl r1 r2 r1", "pl_r1_r2_r1"},
307      {{vc, r1, r6, r6}, true, vc, "vc r1 r6 r6", "vc_r1_r6_r6"},
308      {{cs, r2, r2, r2}, true, cs, "cs r2 r2 r2", "cs_r2_r2_r2"},
309      {{pl, r4, r2, r5}, true, pl, "pl r4 r2 r5", "pl_r4_r2_r5"},
310      {{mi, r1, r3, r0}, true, mi, "mi r1 r3 r0", "mi_r1_r3_r0"},
311      {{vc, r3, r4, r2}, true, vc, "vc r3 r4 r2", "vc_r3_r4_r2"},
312      {{hi, r3, r4, r3}, true, hi, "hi r3 r4 r3", "hi_r3_r4_r3"},
313      {{eq, r2, r2, r1}, true, eq, "eq r2 r2 r1", "eq_r2_r2_r1"},
314      {{eq, r5, r1, r5}, true, eq, "eq r5 r1 r5", "eq_r5_r1_r5"},
315      {{vs, r7, r3, r1}, true, vs, "vs r7 r3 r1", "vs_r7_r3_r1"},
316      {{lt, r4, r1, r5}, true, lt, "lt r4 r1 r5", "lt_r4_r1_r5"},
317      {{cc, r0, r1, r6}, true, cc, "cc r0 r1 r6", "cc_r0_r1_r6"},
318      {{ls, r2, r1, r5}, true, ls, "ls r2 r1 r5", "ls_r2_r1_r5"},
319      {{pl, r4, r2, r7}, true, pl, "pl r4 r2 r7", "pl_r4_r2_r7"},
320      {{ne, r2, r3, r6}, true, ne, "ne r2 r3 r6", "ne_r2_r3_r6"},
321      {{cs, r3, r0, r6}, true, cs, "cs r3 r0 r6", "cs_r3_r0_r6"},
322      {{vc, r1, r3, r6}, true, vc, "vc r1 r3 r6", "vc_r1_r3_r6"},
323      {{vc, r7, r2, r7}, true, vc, "vc r7 r2 r7", "vc_r7_r2_r7"},
324      {{ge, r1, r2, r6}, true, ge, "ge r1 r2 r6", "ge_r1_r2_r6"},
325      {{cc, r7, r5, r7}, true, cc, "cc r7 r5 r7", "cc_r7_r5_r7"},
326      {{ls, r3, r0, r7}, true, ls, "ls r3 r0 r7", "ls_r3_r0_r7"},
327      {{lt, r6, r1, r0}, true, lt, "lt r6 r1 r0", "lt_r6_r1_r0"},
328      {{ne, r5, r6, r4}, true, ne, "ne r5 r6 r4", "ne_r5_r6_r4"},
329      {{cs, r0, r6, r5}, true, cs, "cs r0 r6 r5", "cs_r0_r6_r5"},
330      {{vs, r0, r5, r5}, true, vs, "vs r0 r5 r5", "vs_r0_r5_r5"},
331      {{pl, r2, r4, r7}, true, pl, "pl r2 r4 r7", "pl_r2_r4_r7"},
332      {{gt, r2, r7, r2}, true, gt, "gt r2 r7 r2", "gt_r2_r7_r2"},
333      {{ge, r0, r0, r5}, true, ge, "ge r0 r0 r5", "ge_r0_r0_r5"},
334      {{cs, r7, r1, r7}, true, cs, "cs r7 r1 r7", "cs_r7_r1_r7"},
335      {{eq, r0, r4, r3}, true, eq, "eq r0 r4 r3", "eq_r0_r4_r3"},
336      {{eq, r4, r7, r1}, true, eq, "eq r4 r7 r1", "eq_r4_r7_r1"},
337      {{mi, r6, r7, r0}, true, mi, "mi r6 r7 r0", "mi_r6_r7_r0"},
338      {{hi, r2, r4, r5}, true, hi, "hi r2 r4 r5", "hi_r2_r4_r5"},
339      {{ls, r0, r5, r7}, true, ls, "ls r0 r5 r7", "ls_r0_r5_r7"},
340      {{cc, r4, r7, r3}, true, cc, "cc r4 r7 r3", "cc_r4_r7_r3"},
341      {{hi, r4, r0, r1}, true, hi, "hi r4 r0 r1", "hi_r4_r0_r1"},
342      {{pl, r6, r6, r2}, true, pl, "pl r6 r6 r2", "pl_r6_r6_r2"},
343      {{gt, r2, r1, r3}, true, gt, "gt r2 r1 r3", "gt_r2_r1_r3"},
344      {{ge, r7, r6, r6}, true, ge, "ge r7 r6 r6", "ge_r7_r6_r6"},
345      {{pl, r1, r2, r0}, true, pl, "pl r1 r2 r0", "pl_r1_r2_r0"},
346      {{mi, r5, r7, r5}, true, mi, "mi r5 r7 r5", "mi_r5_r7_r5"},
347      {{hi, r0, r4, r5}, true, hi, "hi r0 r4 r5", "hi_r0_r4_r5"},
348      {{gt, r1, r5, r2}, true, gt, "gt r1 r5 r2", "gt_r1_r5_r2"},
349      {{le, r5, r5, r1}, true, le, "le r5 r5 r1", "le_r5_r5_r1"},
350      {{ne, r3, r3, r5}, true, ne, "ne r3 r3 r5", "ne_r3_r3_r5"},
351      {{gt, r4, r4, r6}, true, gt, "gt r4 r4 r6", "gt_r4_r4_r6"},
352      {{lt, r4, r1, r6}, true, lt, "lt r4 r1 r6", "lt_r4_r1_r6"},
353      {{vs, r4, r0, r4}, true, vs, "vs r4 r0 r4", "vs_r4_r0_r4"},
354      {{cc, r3, r6, r6}, true, cc, "cc r3 r6 r6", "cc_r3_r6_r6"},
355      {{ne, r3, r2, r5}, true, ne, "ne r3 r2 r5", "ne_r3_r2_r5"},
356      {{eq, r3, r2, r5}, true, eq, "eq r3 r2 r5", "eq_r3_r2_r5"},
357      {{gt, r6, r4, r5}, true, gt, "gt r6 r4 r5", "gt_r6_r4_r5"},
358      {{gt, r4, r1, r3}, true, gt, "gt r4 r1 r3", "gt_r4_r1_r3"},
359      {{pl, r0, r6, r4}, true, pl, "pl r0 r6 r4", "pl_r0_r6_r4"},
360      {{cs, r4, r5, r6}, true, cs, "cs r4 r5 r6", "cs_r4_r5_r6"},
361      {{gt, r3, r5, r6}, true, gt, "gt r3 r5 r6", "gt_r3_r5_r6"},
362      {{vc, r3, r5, r6}, true, vc, "vc r3 r5 r6", "vc_r3_r5_r6"},
363      {{mi, r0, r5, r2}, true, mi, "mi r0 r5 r2", "mi_r0_r5_r2"},
364      {{cs, r5, r4, r6}, true, cs, "cs r5 r4 r6", "cs_r5_r4_r6"},
365      {{pl, r2, r6, r5}, true, pl, "pl r2 r6 r5", "pl_r2_r6_r5"},
366      {{gt, r0, r4, r6}, true, gt, "gt r0 r4 r6", "gt_r0_r4_r6"},
367      {{le, r0, r0, r7}, true, le, "le r0 r0 r7", "le_r0_r0_r7"},
368      {{le, r1, r3, r2}, true, le, "le r1 r3 r2", "le_r1_r3_r2"},
369      {{le, r2, r4, r4}, true, le, "le r2 r4 r4", "le_r2_r4_r4"},
370      {{mi, r1, r6, r7}, true, mi, "mi r1 r6 r7", "mi_r1_r6_r7"},
371      {{le, r1, r3, r0}, true, le, "le r1 r3 r0", "le_r1_r3_r0"},
372      {{eq, r7, r0, r6}, true, eq, "eq r7 r0 r6", "eq_r7_r0_r6"},
373      {{cc, r5, r1, r6}, true, cc, "cc r5 r1 r6", "cc_r5_r1_r6"},
374      {{vc, r7, r5, r0}, true, vc, "vc r7 r5 r0", "vc_r7_r5_r0"},
375      {{lt, r3, r7, r7}, true, lt, "lt r3 r7 r7", "lt_r3_r7_r7"},
376      {{mi, r6, r0, r7}, true, mi, "mi r6 r0 r7", "mi_r6_r0_r7"},
377      {{vc, r5, r2, r1}, true, vc, "vc r5 r2 r1", "vc_r5_r2_r1"},
378      {{le, r2, r1, r3}, true, le, "le r2 r1 r3", "le_r2_r1_r3"},
379      {{mi, r0, r4, r6}, true, mi, "mi r0 r4 r6", "mi_r0_r4_r6"},
380      {{cs, r3, r3, r4}, true, cs, "cs r3 r3 r4", "cs_r3_r3_r4"},
381      {{lt, r0, r6, r6}, true, lt, "lt r0 r6 r6", "lt_r0_r6_r6"},
382      {{gt, r4, r2, r3}, true, gt, "gt r4 r2 r3", "gt_r4_r2_r3"},
383      {{gt, r5, r6, r3}, true, gt, "gt r5 r6 r3", "gt_r5_r6_r3"},
384      {{ne, r4, r5, r4}, true, ne, "ne r4 r5 r4", "ne_r4_r5_r4"},
385      {{ge, r5, r6, r6}, true, ge, "ge r5 r6 r6", "ge_r5_r6_r6"},
386      {{vc, r1, r4, r1}, true, vc, "vc r1 r4 r1", "vc_r1_r4_r1"},
387      {{vc, r0, r0, r6}, true, vc, "vc r0 r0 r6", "vc_r0_r0_r6"},
388      {{cc, r7, r5, r0}, true, cc, "cc r7 r5 r0", "cc_r7_r5_r0"},
389      {{vs, r4, r1, r2}, true, vs, "vs r4 r1 r2", "vs_r4_r1_r2"},
390      {{le, r0, r7, r3}, true, le, "le r0 r7 r3", "le_r0_r7_r3"},
391      {{le, r0, r2, r4}, true, le, "le r0 r2 r4", "le_r0_r2_r4"},
392      {{cc, r3, r4, r0}, true, cc, "cc r3 r4 r0", "cc_r3_r4_r0"},
393      {{lt, r0, r2, r3}, true, lt, "lt r0 r2 r3", "lt_r0_r2_r3"},
394      {{eq, r5, r7, r3}, true, eq, "eq r5 r7 r3", "eq_r5_r7_r3"},
395      {{pl, r6, r3, r1}, true, pl, "pl r6 r3 r1", "pl_r6_r3_r1"},
396      {{le, r1, r5, r7}, true, le, "le r1 r5 r7", "le_r1_r5_r7"},
397      {{cc, r5, r7, r0}, true, cc, "cc r5 r7 r0", "cc_r5_r7_r0"},
398      {{gt, r2, r2, r4}, true, gt, "gt r2 r2 r4", "gt_r2_r2_r4"},
399      {{ne, r4, r3, r5}, true, ne, "ne r4 r3 r5", "ne_r4_r3_r5"},
400      {{lt, r2, r3, r3}, true, lt, "lt r2 r3 r3", "lt_r2_r3_r3"},
401      {{lt, r5, r1, r1}, true, lt, "lt r5 r1 r1", "lt_r5_r1_r1"},
402      {{lt, r6, r4, r5}, true, lt, "lt r6 r4 r5", "lt_r6_r4_r5"},
403      {{ge, r6, r0, r2}, true, ge, "ge r6 r0 r2", "ge_r6_r0_r2"},
404      {{ls, r1, r3, r7}, true, ls, "ls r1 r3 r7", "ls_r1_r3_r7"},
405      {{eq, r5, r4, r7}, true, eq, "eq r5 r4 r7", "eq_r5_r4_r7"},
406      {{hi, r4, r7, r3}, true, hi, "hi r4 r7 r3", "hi_r4_r7_r3"},
407      {{eq, r6, r1, r5}, true, eq, "eq r6 r1 r5", "eq_r6_r1_r5"},
408      {{le, r5, r1, r7}, true, le, "le r5 r1 r7", "le_r5_r1_r7"},
409      {{hi, r1, r7, r5}, true, hi, "hi r1 r7 r5", "hi_r1_r7_r5"},
410      {{cc, r6, r2, r1}, true, cc, "cc r6 r2 r1", "cc_r6_r2_r1"},
411      {{gt, r7, r7, r0}, true, gt, "gt r7 r7 r0", "gt_r7_r7_r0"},
412      {{cc, r3, r1, r3}, true, cc, "cc r3 r1 r3", "cc_r3_r1_r3"},
413      {{mi, r2, r2, r2}, true, mi, "mi r2 r2 r2", "mi_r2_r2_r2"},
414      {{lt, r4, r5, r3}, true, lt, "lt r4 r5 r3", "lt_r4_r5_r3"},
415      {{vs, r6, r6, r2}, true, vs, "vs r6 r6 r2", "vs_r6_r6_r2"},
416      {{vc, r3, r2, r5}, true, vc, "vc r3 r2 r5", "vc_r3_r2_r5"},
417      {{vs, r1, r2, r3}, true, vs, "vs r1 r2 r3", "vs_r1_r2_r3"},
418      {{ne, r0, r1, r1}, true, ne, "ne r0 r1 r1", "ne_r0_r1_r1"},
419      {{le, r4, r0, r3}, true, le, "le r4 r0 r3", "le_r4_r0_r3"},
420      {{pl, r7, r5, r7}, true, pl, "pl r7 r5 r7", "pl_r7_r5_r7"},
421      {{mi, r0, r2, r2}, true, mi, "mi r0 r2 r2", "mi_r0_r2_r2"},
422      {{vc, r6, r0, r0}, true, vc, "vc r6 r0 r0", "vc_r6_r0_r0"},
423      {{vs, r7, r7, r2}, true, vs, "vs r7 r7 r2", "vs_r7_r7_r2"},
424      {{ne, r5, r5, r3}, true, ne, "ne r5 r5 r3", "ne_r5_r5_r3"},
425      {{ls, r2, r4, r6}, true, ls, "ls r2 r4 r6", "ls_r2_r4_r6"},
426      {{cc, r0, r2, r5}, true, cc, "cc r0 r2 r5", "cc_r0_r2_r5"},
427      {{pl, r1, r3, r3}, true, pl, "pl r1 r3 r3", "pl_r1_r3_r3"},
428      {{pl, r1, r6, r0}, true, pl, "pl r1 r6 r0", "pl_r1_r6_r0"},
429      {{hi, r6, r3, r4}, true, hi, "hi r6 r3 r4", "hi_r6_r3_r4"},
430      {{ne, r1, r7, r6}, true, ne, "ne r1 r7 r6", "ne_r1_r7_r6"},
431      {{lt, r6, r7, r4}, true, lt, "lt r6 r7 r4", "lt_r6_r7_r4"},
432      {{eq, r7, r6, r4}, true, eq, "eq r7 r6 r4", "eq_r7_r6_r4"},
433      {{lt, r1, r2, r4}, true, lt, "lt r1 r2 r4", "lt_r1_r2_r4"},
434      {{pl, r1, r5, r4}, true, pl, "pl r1 r5 r4", "pl_r1_r5_r4"},
435      {{vc, r0, r6, r5}, true, vc, "vc r0 r6 r5", "vc_r0_r6_r5"},
436      {{le, r0, r7, r5}, true, le, "le r0 r7 r5", "le_r0_r7_r5"},
437      {{mi, r5, r3, r3}, true, mi, "mi r5 r3 r3", "mi_r5_r3_r3"},
438      {{vs, r1, r3, r5}, true, vs, "vs r1 r3 r5", "vs_r1_r3_r5"},
439      {{pl, r4, r5, r4}, true, pl, "pl r4 r5 r4", "pl_r4_r5_r4"},
440      {{vc, r5, r0, r6}, true, vc, "vc r5 r0 r6", "vc_r5_r0_r6"},
441      {{vc, r3, r0, r5}, true, vc, "vc r3 r0 r5", "vc_r3_r0_r5"},
442      {{eq, r3, r2, r2}, true, eq, "eq r3 r2 r2", "eq_r3_r2_r2"},
443      {{lt, r7, r4, r0}, true, lt, "lt r7 r4 r0", "lt_r7_r4_r0"},
444      {{vc, r2, r3, r1}, true, vc, "vc r2 r3 r1", "vc_r2_r3_r1"},
445      {{pl, r4, r6, r7}, true, pl, "pl r4 r6 r7", "pl_r4_r6_r7"},
446      {{pl, r7, r3, r6}, true, pl, "pl r7 r3 r6", "pl_r7_r3_r6"},
447      {{vs, r1, r6, r2}, true, vs, "vs r1 r6 r2", "vs_r1_r6_r2"},
448      {{vc, r6, r3, r1}, true, vc, "vc r6 r3 r1", "vc_r6_r3_r1"},
449      {{hi, r5, r0, r4}, true, hi, "hi r5 r0 r4", "hi_r5_r0_r4"},
450      {{ls, r4, r4, r6}, true, ls, "ls r4 r4 r6", "ls_r4_r4_r6"},
451      {{mi, r3, r5, r2}, true, mi, "mi r3 r5 r2", "mi_r3_r5_r2"},
452      {{ge, r6, r3, r7}, true, ge, "ge r6 r3 r7", "ge_r6_r3_r7"},
453      {{vs, r0, r7, r5}, true, vs, "vs r0 r7 r5", "vs_r0_r7_r5"},
454      {{cc, r0, r3, r2}, true, cc, "cc r0 r3 r2", "cc_r0_r3_r2"},
455      {{cs, r3, r7, r3}, true, cs, "cs r3 r7 r3", "cs_r3_r7_r3"},
456      {{ls, r0, r3, r7}, true, ls, "ls r0 r3 r7", "ls_r0_r3_r7"},
457      {{pl, r1, r1, r2}, true, pl, "pl r1 r1 r2", "pl_r1_r1_r2"},
458      {{lt, r2, r2, r4}, true, lt, "lt r2 r2 r4", "lt_r2_r2_r4"},
459      {{cs, r4, r6, r5}, true, cs, "cs r4 r6 r5", "cs_r4_r6_r5"},
460      {{lt, r2, r7, r0}, true, lt, "lt r2 r7 r0", "lt_r2_r7_r0"},
461      {{vs, r3, r4, r6}, true, vs, "vs r3 r4 r6", "vs_r3_r4_r6"},
462      {{mi, r4, r2, r1}, true, mi, "mi r4 r2 r1", "mi_r4_r2_r1"},
463      {{eq, r0, r7, r7}, true, eq, "eq r0 r7 r7", "eq_r0_r7_r7"},
464      {{vc, r5, r7, r3}, true, vc, "vc r5 r7 r3", "vc_r5_r7_r3"},
465      {{gt, r6, r5, r2}, true, gt, "gt r6 r5 r2", "gt_r6_r5_r2"},
466      {{cs, r5, r4, r0}, true, cs, "cs r5 r4 r0", "cs_r5_r4_r0"},
467      {{ge, r1, r5, r6}, true, ge, "ge r1 r5 r6", "ge_r1_r5_r6"},
468      {{vs, r7, r7, r6}, true, vs, "vs r7 r7 r6", "vs_r7_r7_r6"},
469      {{cs, r4, r3, r3}, true, cs, "cs r4 r3 r3", "cs_r4_r3_r3"},
470      {{vc, r3, r5, r5}, true, vc, "vc r3 r5 r5", "vc_r3_r5_r5"},
471      {{le, r2, r3, r3}, true, le, "le r2 r3 r3", "le_r2_r3_r3"},
472      {{gt, r4, r1, r2}, true, gt, "gt r4 r1 r2", "gt_r4_r1_r2"},
473      {{pl, r6, r4, r2}, true, pl, "pl r6 r4 r2", "pl_r6_r4_r2"},
474      {{pl, r5, r0, r7}, true, pl, "pl r5 r0 r7", "pl_r5_r0_r7"},
475      {{cs, r4, r4, r1}, true, cs, "cs r4 r4 r1", "cs_r4_r4_r1"},
476      {{mi, r1, r6, r1}, true, mi, "mi r1 r6 r1", "mi_r1_r6_r1"},
477      {{gt, r2, r6, r4}, true, gt, "gt r2 r6 r4", "gt_r2_r6_r4"},
478      {{cc, r6, r0, r3}, true, cc, "cc r6 r0 r3", "cc_r6_r0_r3"},
479      {{pl, r5, r0, r4}, true, pl, "pl r5 r0 r4", "pl_r5_r0_r4"},
480      {{vs, r1, r0, r4}, true, vs, "vs r1 r0 r4", "vs_r1_r0_r4"},
481      {{hi, r6, r6, r4}, true, hi, "hi r6 r6 r4", "hi_r6_r6_r4"},
482      {{ge, r0, r1, r1}, true, ge, "ge r0 r1 r1", "ge_r0_r1_r1"},
483      {{mi, r2, r0, r3}, true, mi, "mi r2 r0 r3", "mi_r2_r0_r3"},
484      {{le, r4, r5, r7}, true, le, "le r4 r5 r7", "le_r4_r5_r7"},
485      {{ne, r6, r0, r2}, true, ne, "ne r6 r0 r2", "ne_r6_r0_r2"},
486      {{cc, r6, r7, r7}, true, cc, "cc r6 r7 r7", "cc_r6_r7_r7"},
487      {{hi, r3, r3, r2}, true, hi, "hi r3 r3 r2", "hi_r3_r3_r2"},
488      {{ne, r4, r5, r2}, true, ne, "ne r4 r5 r2", "ne_r4_r5_r2"},
489      {{lt, r3, r0, r0}, true, lt, "lt r3 r0 r0", "lt_r3_r0_r0"},
490      {{ls, r0, r4, r6}, true, ls, "ls r0 r4 r6", "ls_r0_r4_r6"},
491      {{gt, r2, r6, r5}, true, gt, "gt r2 r6 r5", "gt_r2_r6_r5"},
492      {{le, r6, r2, r6}, true, le, "le r6 r2 r6", "le_r6_r2_r6"},
493      {{ne, r2, r0, r3}, true, ne, "ne r2 r0 r3", "ne_r2_r0_r3"},
494      {{hi, r4, r1, r6}, true, hi, "hi r4 r1 r6", "hi_r4_r1_r6"},
495      {{vc, r3, r2, r6}, true, vc, "vc r3 r2 r6", "vc_r3_r2_r6"},
496      {{mi, r6, r1, r3}, true, mi, "mi r6 r1 r3", "mi_r6_r1_r3"},
497      {{ls, r5, r5, r6}, true, ls, "ls r5 r5 r6", "ls_r5_r5_r6"},
498      {{gt, r3, r6, r3}, true, gt, "gt r3 r6 r3", "gt_r3_r6_r3"},
499      {{cc, r1, r7, r2}, true, cc, "cc r1 r7 r2", "cc_r1_r7_r2"},
500      {{eq, r6, r1, r2}, true, eq, "eq r6 r1 r2", "eq_r6_r1_r2"},
501      {{ls, r0, r4, r3}, true, ls, "ls r0 r4 r3", "ls_r0_r4_r3"},
502      {{hi, r4, r2, r2}, true, hi, "hi r4 r2 r2", "hi_r4_r2_r2"},
503      {{cs, r0, r1, r4}, true, cs, "cs r0 r1 r4", "cs_r0_r1_r4"},
504      {{cc, r4, r3, r2}, true, cc, "cc r4 r3 r2", "cc_r4_r3_r2"},
505      {{pl, r2, r7, r3}, true, pl, "pl r2 r7 r3", "pl_r2_r7_r3"},
506      {{ge, r0, r7, r3}, true, ge, "ge r0 r7 r3", "ge_r0_r7_r3"},
507      {{ne, r4, r1, r1}, true, ne, "ne r4 r1 r1", "ne_r4_r1_r1"},
508      {{pl, r4, r2, r6}, true, pl, "pl r4 r2 r6", "pl_r4_r2_r6"},
509      {{eq, r5, r0, r0}, true, eq, "eq r5 r0 r0", "eq_r5_r0_r0"},
510      {{hi, r1, r6, r5}, true, hi, "hi r1 r6 r5", "hi_r1_r6_r5"},
511      {{ge, r4, r6, r3}, true, ge, "ge r4 r6 r3", "ge_r4_r6_r3"},
512      {{hi, r2, r4, r1}, true, hi, "hi r2 r4 r1", "hi_r2_r4_r1"},
513      {{ge, r6, r0, r3}, true, ge, "ge r6 r0 r3", "ge_r6_r0_r3"},
514      {{ne, r5, r4, r2}, true, ne, "ne r5 r4 r2", "ne_r5_r4_r2"},
515      {{gt, r0, r2, r4}, true, gt, "gt r0 r2 r4", "gt_r0_r2_r4"},
516      {{mi, r5, r6, r0}, true, mi, "mi r5 r6 r0", "mi_r5_r6_r0"},
517      {{le, r2, r7, r1}, true, le, "le r2 r7 r1", "le_r2_r7_r1"},
518      {{cc, r1, r2, r6}, true, cc, "cc r1 r2 r6", "cc_r1_r2_r6"},
519      {{pl, r3, r4, r6}, true, pl, "pl r3 r4 r6", "pl_r3_r4_r6"},
520      {{gt, r2, r3, r2}, true, gt, "gt r2 r3 r2", "gt_r2_r3_r2"},
521      {{eq, r2, r7, r6}, true, eq, "eq r2 r7 r6", "eq_r2_r7_r6"},
522      {{cc, r5, r1, r4}, true, cc, "cc r5 r1 r4", "cc_r5_r1_r4"},
523      {{ge, r7, r1, r6}, true, ge, "ge r7 r1 r6", "ge_r7_r1_r6"},
524      {{vc, r1, r7, r7}, true, vc, "vc r1 r7 r7", "vc_r1_r7_r7"},
525      {{mi, r1, r1, r4}, true, mi, "mi r1 r1 r4", "mi_r1_r1_r4"},
526      {{vs, r3, r5, r5}, true, vs, "vs r3 r5 r5", "vs_r3_r5_r5"},
527      {{hi, r3, r5, r3}, true, hi, "hi r3 r5 r3", "hi_r3_r5_r3"},
528      {{gt, r3, r4, r7}, true, gt, "gt r3 r4 r7", "gt_r3_r4_r7"},
529      {{le, r3, r0, r5}, true, le, "le r3 r0 r5", "le_r3_r0_r5"},
530      {{vc, r2, r2, r6}, true, vc, "vc r2 r2 r6", "vc_r2_r2_r6"},
531      {{le, r3, r5, r5}, true, le, "le r3 r5 r5", "le_r3_r5_r5"},
532      {{gt, r6, r1, r0}, true, gt, "gt r6 r1 r0", "gt_r6_r1_r0"},
533      {{vs, r2, r6, r1}, true, vs, "vs r2 r6 r1", "vs_r2_r6_r1"},
534      {{eq, r0, r2, r3}, true, eq, "eq r0 r2 r3", "eq_r0_r2_r3"},
535      {{vc, r5, r0, r5}, true, vc, "vc r5 r0 r5", "vc_r5_r0_r5"},
536      {{mi, r7, r3, r1}, true, mi, "mi r7 r3 r1", "mi_r7_r3_r1"},
537      {{hi, r3, r7, r1}, true, hi, "hi r3 r7 r1", "hi_r3_r7_r1"},
538      {{vc, r0, r5, r1}, true, vc, "vc r0 r5 r1", "vc_r0_r5_r1"},
539      {{eq, r6, r0, r4}, true, eq, "eq r6 r0 r4", "eq_r6_r0_r4"},
540      {{hi, r4, r4, r1}, true, hi, "hi r4 r4 r1", "hi_r4_r4_r1"},
541      {{vc, r6, r5, r2}, true, vc, "vc r6 r5 r2", "vc_r6_r5_r2"},
542      {{hi, r7, r2, r4}, true, hi, "hi r7 r2 r4", "hi_r7_r2_r4"},
543      {{hi, r2, r3, r1}, true, hi, "hi r2 r3 r1", "hi_r2_r3_r1"},
544      {{pl, r0, r6, r1}, true, pl, "pl r0 r6 r1", "pl_r0_r6_r1"},
545      {{cc, r5, r4, r4}, true, cc, "cc r5 r4 r4", "cc_r5_r4_r4"},
546      {{ls, r4, r5, r3}, true, ls, "ls r4 r5 r3", "ls_r4_r5_r3"},
547      {{vc, r3, r2, r7}, true, vc, "vc r3 r2 r7", "vc_r3_r2_r7"},
548      {{ne, r5, r3, r2}, true, ne, "ne r5 r3 r2", "ne_r5_r3_r2"},
549      {{pl, r0, r3, r2}, true, pl, "pl r0 r3 r2", "pl_r0_r3_r2"},
550      {{vs, r6, r2, r4}, true, vs, "vs r6 r2 r4", "vs_r6_r2_r4"},
551      {{hi, r6, r0, r4}, true, hi, "hi r6 r0 r4", "hi_r6_r0_r4"},
552      {{mi, r2, r5, r7}, true, mi, "mi r2 r5 r7", "mi_r2_r5_r7"},
553      {{lt, r4, r4, r4}, true, lt, "lt r4 r4 r4", "lt_r4_r4_r4"},
554      {{ne, r0, r5, r7}, true, ne, "ne r0 r5 r7", "ne_r0_r5_r7"},
555      {{pl, r1, r6, r6}, true, pl, "pl r1 r6 r6", "pl_r1_r6_r6"},
556      {{vc, r2, r4, r4}, true, vc, "vc r2 r4 r4", "vc_r2_r4_r4"},
557      {{eq, r7, r6, r5}, true, eq, "eq r7 r6 r5", "eq_r7_r6_r5"},
558      {{pl, r2, r7, r5}, true, pl, "pl r2 r7 r5", "pl_r2_r7_r5"},
559      {{cs, r0, r1, r3}, true, cs, "cs r0 r1 r3", "cs_r0_r1_r3"},
560      {{hi, r7, r6, r6}, true, hi, "hi r7 r6 r6", "hi_r7_r6_r6"},
561      {{le, r5, r5, r6}, true, le, "le r5 r5 r6", "le_r5_r5_r6"},
562      {{hi, r5, r7, r5}, true, hi, "hi r5 r7 r5", "hi_r5_r7_r5"},
563      {{cc, r3, r7, r4}, true, cc, "cc r3 r7 r4", "cc_r3_r7_r4"},
564      {{pl, r1, r0, r0}, true, pl, "pl r1 r0 r0", "pl_r1_r0_r0"},
565      {{eq, r1, r2, r6}, true, eq, "eq r1 r2 r6", "eq_r1_r2_r6"},
566      {{vc, r6, r1, r7}, true, vc, "vc r6 r1 r7", "vc_r6_r1_r7"},
567      {{ne, r4, r7, r2}, true, ne, "ne r4 r7 r2", "ne_r4_r7_r2"},
568      {{ls, r1, r3, r6}, true, ls, "ls r1 r3 r6", "ls_r1_r3_r6"},
569      {{ne, r4, r5, r7}, true, ne, "ne r4 r5 r7", "ne_r4_r5_r7"},
570      {{ne, r2, r6, r0}, true, ne, "ne r2 r6 r0", "ne_r2_r6_r0"},
571      {{ge, r4, r0, r5}, true, ge, "ge r4 r0 r5", "ge_r4_r0_r5"},
572      {{mi, r3, r7, r0}, true, mi, "mi r3 r7 r0", "mi_r3_r7_r0"},
573      {{ge, r4, r5, r3}, true, ge, "ge r4 r5 r3", "ge_r4_r5_r3"},
574      {{vs, r0, r5, r1}, true, vs, "vs r0 r5 r1", "vs_r0_r5_r1"},
575      {{eq, r6, r1, r6}, true, eq, "eq r6 r1 r6", "eq_r6_r1_r6"},
576      {{le, r7, r6, r7}, true, le, "le r7 r6 r7", "le_r7_r6_r7"},
577      {{vs, r1, r0, r0}, true, vs, "vs r1 r0 r0", "vs_r1_r0_r0"},
578      {{lt, r7, r4, r4}, true, lt, "lt r7 r4 r4", "lt_r7_r4_r4"},
579      {{ls, r2, r5, r5}, true, ls, "ls r2 r5 r5", "ls_r2_r5_r5"},
580      {{gt, r2, r7, r6}, true, gt, "gt r2 r7 r6", "gt_r2_r7_r6"},
581      {{cs, r2, r4, r5}, true, cs, "cs r2 r4 r5", "cs_r2_r4_r5"},
582      {{gt, r3, r2, r4}, true, gt, "gt r3 r2 r4", "gt_r3_r2_r4"},
583      {{vc, r5, r1, r6}, true, vc, "vc r5 r1 r6", "vc_r5_r1_r6"},
584      {{vc, r5, r5, r5}, true, vc, "vc r5 r5 r5", "vc_r5_r5_r5"},
585      {{gt, r5, r0, r6}, true, gt, "gt r5 r0 r6", "gt_r5_r0_r6"},
586      {{ls, r1, r7, r4}, true, ls, "ls r1 r7 r4", "ls_r1_r7_r4"},
587      {{vs, r6, r0, r0}, true, vs, "vs r6 r0 r0", "vs_r6_r0_r0"},
588      {{eq, r2, r7, r5}, true, eq, "eq r2 r7 r5", "eq_r2_r7_r5"},
589      {{eq, r0, r6, r4}, true, eq, "eq r0 r6 r4", "eq_r0_r6_r4"},
590      {{mi, r7, r1, r5}, true, mi, "mi r7 r1 r5", "mi_r7_r1_r5"},
591      {{mi, r3, r5, r1}, true, mi, "mi r3 r5 r1", "mi_r3_r5_r1"},
592      {{pl, r2, r2, r4}, true, pl, "pl r2 r2 r4", "pl_r2_r2_r4"},
593      {{cs, r2, r1, r6}, true, cs, "cs r2 r1 r6", "cs_r2_r1_r6"},
594      {{ls, r3, r1, r5}, true, ls, "ls r3 r1 r5", "ls_r3_r1_r5"},
595      {{hi, r1, r0, r1}, true, hi, "hi r1 r0 r1", "hi_r1_r0_r1"},
596      {{gt, r1, r2, r4}, true, gt, "gt r1 r2 r4", "gt_r1_r2_r4"}};
597 
598 // These headers each contain an array of `TestResult` with the reference output
599 // values. The reference arrays are names `kReference{mnemonic}`.
600 #include "aarch32/traces/assembler-cond-rd-rn-operand-rm-t32-all-low-in-it-block-add.h"
601 #include "aarch32/traces/assembler-cond-rd-rn-operand-rm-t32-all-low-in-it-block-sub.h"
602 
603 
604 // The maximum number of errors to report in detail for each test.
605 const unsigned kErrorReportLimit = 8;
606 
607 typedef void (MacroAssembler::*Fn)(Condition cond,
608                                    Register rd,
609                                    Register rn,
610                                    const Operand& op);
611 
TestHelper(Fn instruction,const char * mnemonic,const TestResult reference[])612 void TestHelper(Fn instruction,
613                 const char* mnemonic,
614                 const TestResult reference[]) {
615   unsigned total_error_count = 0;
616   MacroAssembler masm(BUF_SIZE);
617 
618   masm.UseT32();
619 
620   for (unsigned i = 0; i < ARRAY_SIZE(kTests); i++) {
621     // Values to pass to the macro-assembler.
622     Condition cond = kTests[i].operands.cond;
623     Register rd = kTests[i].operands.rd;
624     Register rn = kTests[i].operands.rn;
625     Register rm = kTests[i].operands.rm;
626     Operand op(rm);
627 
628     int32_t start = masm.GetCursorOffset();
629     {
630       // We never generate more that 4 bytes, as IT instructions are only
631       // allowed for narrow encodings.
632       ExactAssemblyScope scope(&masm, 4, ExactAssemblyScope::kMaximumSize);
633       if (kTests[i].in_it_block) {
634         masm.it(kTests[i].it_condition);
635       }
636       (masm.*instruction)(cond, rd, rn, op);
637     }
638     int32_t end = masm.GetCursorOffset();
639 
640     const byte* result_ptr =
641         masm.GetBuffer()->GetOffsetAddress<const byte*>(start);
642     VIXL_ASSERT(start < end);
643     uint32_t result_size = end - start;
644 
645     if (Test::generate_test_trace()) {
646       // Print the result bytes.
647       printf("const byte kInstruction_%s_%s[] = {\n",
648              mnemonic,
649              kTests[i].identifier);
650       for (uint32_t j = 0; j < result_size; j++) {
651         if (j == 0) {
652           printf("  0x%02" PRIx8, result_ptr[j]);
653         } else {
654           printf(", 0x%02" PRIx8, result_ptr[j]);
655         }
656       }
657       // This comment is meant to be used by external tools to validate
658       // the encoding. We can parse the comment to figure out what
659       // instruction this corresponds to.
660       if (kTests[i].in_it_block) {
661         printf(" // It %s; %s %s\n};\n",
662                kTests[i].it_condition.GetName(),
663                mnemonic,
664                kTests[i].operands_description);
665       } else {
666         printf(" // %s %s\n};\n", mnemonic, kTests[i].operands_description);
667       }
668     } else {
669       // Check we've emitted the exact same encoding as present in the
670       // trace file. Only print up to `kErrorReportLimit` errors.
671       if (((result_size != reference[i].size) ||
672            (memcmp(result_ptr, reference[i].encoding, reference[i].size) !=
673             0)) &&
674           (++total_error_count <= kErrorReportLimit)) {
675         printf("Error when testing \"%s\" with operands \"%s\":\n",
676                mnemonic,
677                kTests[i].operands_description);
678         printf("  Expected: ");
679         for (uint32_t j = 0; j < reference[i].size; j++) {
680           if (j == 0) {
681             printf("0x%02" PRIx8, reference[i].encoding[j]);
682           } else {
683             printf(", 0x%02" PRIx8, reference[i].encoding[j]);
684           }
685         }
686         printf("\n");
687         printf("  Found:    ");
688         for (uint32_t j = 0; j < result_size; j++) {
689           if (j == 0) {
690             printf("0x%02" PRIx8, result_ptr[j]);
691           } else {
692             printf(", 0x%02" PRIx8, result_ptr[j]);
693           }
694         }
695         printf("\n");
696       }
697     }
698   }
699 
700   masm.FinalizeCode();
701 
702   if (Test::generate_test_trace()) {
703     // Finalize the trace file by writing the final `TestResult` array
704     // which links all generated instruction encodings.
705     printf("const TestResult kReference%s[] = {\n", mnemonic);
706     for (unsigned i = 0; i < ARRAY_SIZE(kTests); i++) {
707       printf("  {\n");
708       printf("    ARRAY_SIZE(kInstruction_%s_%s),\n",
709              mnemonic,
710              kTests[i].identifier);
711       printf("    kInstruction_%s_%s,\n", mnemonic, kTests[i].identifier);
712       printf("  },\n");
713     }
714     printf("};\n");
715   } else {
716     if (total_error_count > kErrorReportLimit) {
717       printf("%u other errors follow.\n",
718              total_error_count - kErrorReportLimit);
719     }
720     // Crash if the test failed.
721     VIXL_CHECK(total_error_count == 0);
722   }
723 }
724 
725 // Instantiate tests for each instruction in the list.
726 #define TEST(mnemonic)                                                      \
727   void Test_##mnemonic() {                                                  \
728     TestHelper(&MacroAssembler::mnemonic, #mnemonic, kReference##mnemonic); \
729   }                                                                         \
730   Test test_##mnemonic(                                                     \
731       "AARCH32_ASSEMBLER_COND_RD_RN_OPERAND_RM_T32_ALL_LOW_IN_IT_"          \
732       "BLOCK_" #mnemonic,                                                   \
733       &Test_##mnemonic);
734 FOREACH_INSTRUCTION(TEST)
735 #undef TEST
736 
737 }  // namespace
738 #endif
739 
740 }  // namespace aarch32
741 }  // namespace vixl
742