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
47namespace vixl {
48namespace 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
63namespace {
64
65// Values to be passed to the assembler to produce the instruction under test.
66struct 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.
75struct 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
90struct TestResult {
91  size_t size;
92  const byte* encoding;
93};
94
95// Each element of this array produce one instruction encoding.
96const 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-all-low-in-it-block-add-t32.h"
601#include "aarch32/traces/assembler-cond-rd-rn-operand-rm-all-low-in-it-block-sub-t32.h"
602
603
604// The maximum number of errors to report in detail for each test.
605const unsigned kErrorReportLimit = 8;
606
607typedef void (MacroAssembler::*Fn)(Condition cond,
608                                   Register rd,
609                                   Register rn,
610                                   const Operand& op);
611
612void 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_ALL_LOW_IN_IT_BLOCK_" #mnemonic \
732      "_T32",                                                                  \
733      &Test_##mnemonic);
734FOREACH_INSTRUCTION(TEST)
735#undef TEST
736
737}  // namespace
738#endif
739
740}  // namespace aarch32
741}  // namespace vixl
742