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