jm-insns.c revision 8a43f81f6e42d3407ae9649a5b5c9ff801abdbe0
1a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* HOW TO COMPILE:
3a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjgcc -Winline -Wall -O -mregnames -DHAS_ALTIVEC -maltivec
5a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjThis program is useful, but the register usage conventions in
7a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjit are a complete dog.  In particular, _patch_op_imm has to
8a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjbe inlined, else you wind up with it segfaulting in
9a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjcompletely different places due to corruption (of r20 in the
10a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjcase I chased).
11a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj*/
12a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
13a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/*
14a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * test-ppc.c:
15a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * PPC tests for qemu-PPC CPU emulation checks
16a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
17a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * Copyright (c) 2005 Jocelyn Mayer
18a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
19a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   This program is free software; you can redistribute it and/or
20a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   modify it under the terms of the GNU General Public License V2
21a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   as published by the Free Software Foundation
22a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
23a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   This program is distributed in the hope that it will be useful,
24a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   but WITHOUT ANY WARRANTY; without even the implied warranty of
25a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   GNU General Public License for more details.
27a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
28a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   You should have received a copy of the GNU General Public License
29a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   along with this program; if not, write to the Free Software
30a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
31a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj */
32a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
33a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/*
34a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * Theory of operations:
35a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * a few registers are reserved for the test program:
36a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * r14 => r18
37a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * f14 => f18
38a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * I do preload test values in r14 thru r17 (or less, depending on the number
39a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * of register operands needed), patch the test opcode if any immediate
40a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * operands are required, execute the tested opcode.
41a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * XER, CCR and FPSCR are cleared before every test.
42a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * I always get the result in r17 and also save XER and CCR for fixed-point
43a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * operations. I also check FPSCR for floating points operations.
44a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
45a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * Improvments:
46a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * a more clever FPSCR management is needed: for now, I always test
47a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * the round-to-zero case. Other rounding modes also need to be tested.
48a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj */
49a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
50a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/*
51cfe949112586ed0423a6064ae91ad3046f282869cerion * Operation details
52cfe949112586ed0423a6064ae91ad3046f282869cerion * -----------------
53a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * The 'test' functions (via all_tests[]) are wrappers of single asm instns
54a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
55a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * The 'loops' (e.g. int_loops) do the actual work:
56a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *  - loops over as many arguments as the instn needs (regs | imms)
57a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *     - sets up the environment (reset cr,xer, assign src regs...)
58a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *     - maybe modifies the asm instn to test different imm args
59a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *     - calls the test function
60a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *     - retrieves relevant register data (rD,cr,xer,...)
61a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *     - prints argument and result data.
62a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
63a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * More specifically...
64a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
65a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * all_tests[i] holds insn tests
66a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *  - of which each holds: {instn_test_arr[], description, flags}
67a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
68a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * flags hold 3 instn classifiers: {family, type, arg_type}
69a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
70a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * // The main test loop:
71a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * do_tests( user_ctl_flags ) {
72a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *    foreach(curr_test = all_test[i]) {
73a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
74a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       // flags are used to control what tests are run:
75a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       if (curr_test->flags && !user_ctl_flags)
76a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *          continue;
77a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
78a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       // a 'loop_family_arr' is chosen based on the 'family' flag...
79a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       switch(curr_test->flags->family) {
80a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       case x: loop_family_arr = int_loops;
81a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *      ...
82a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       }
83a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
84a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       // ...and the actual test_loop to run is found by indexing into
85a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       // the loop_family_arr with the 'arg_type' flag:
86a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       test_loop = loop_family[curr_test->flags->arg_type]
87a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
88a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       // finally, loop over all instn tests for this test:
89a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       foreach (instn_test = curr_test->instn_test_arr[i]) {
90a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
91a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *          // and call the test_loop with the current instn_test function,name
92a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *          test_loop( instn_test->func, instn_test->name )
93a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *       }
94a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *    }
95a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * }
96cfe949112586ed0423a6064ae91ad3046f282869cerion *
97cfe949112586ed0423a6064ae91ad3046f282869cerion *
98cfe949112586ed0423a6064ae91ad3046f282869cerion * Details of intruction patching for immediate operands
99cfe949112586ed0423a6064ae91ad3046f282869cerion * -----------------------------------------------------
100cfe949112586ed0423a6064ae91ad3046f282869cerion * All the immediate insn test functions are of the form {imm_insn, blr}
101cfe949112586ed0423a6064ae91ad3046f282869cerion * In order to patch one of these functions, we simply copy both insns
102cfe949112586ed0423a6064ae91ad3046f282869cerion * to a stack buffer, and rewrite the immediate part of imm_insn.
103cfe949112586ed0423a6064ae91ad3046f282869cerion * We then execute our stack buffer.
104cfe949112586ed0423a6064ae91ad3046f282869cerion * All ppc instructions are 32bits wide, which makes this fairly easy.
105cfe949112586ed0423a6064ae91ad3046f282869cerion *
106cfe949112586ed0423a6064ae91ad3046f282869cerion * Example:
107cfe949112586ed0423a6064ae91ad3046f282869cerion * extern void test_addi (void);
108cfe949112586ed0423a6064ae91ad3046f282869cerion *      asm(".text\n"
109cfe949112586ed0423a6064ae91ad3046f282869cerion *      "test_addi:\n"
110cfe949112586ed0423a6064ae91ad3046f282869cerion *      "\taddi         17, 14, 0\n"
111cfe949112586ed0423a6064ae91ad3046f282869cerion *      "\tblr\n"
112cfe949112586ed0423a6064ae91ad3046f282869cerion *      ".previous\n"
113cfe949112586ed0423a6064ae91ad3046f282869cerion * );
114cfe949112586ed0423a6064ae91ad3046f282869cerion *
115cfe949112586ed0423a6064ae91ad3046f282869cerion * We are interested only in:
116cfe949112586ed0423a6064ae91ad3046f282869cerion *      "\taddi         17, 14, 0\n"
117cfe949112586ed0423a6064ae91ad3046f282869cerion *      "\tblr\n"
118cfe949112586ed0423a6064ae91ad3046f282869cerion *
119cfe949112586ed0423a6064ae91ad3046f282869cerion * In a loop test, we may see:
120cfe949112586ed0423a6064ae91ad3046f282869cerion * uint32_t func_buf[2];               // our new stack based 'function'
121cfe949112586ed0423a6064ae91ad3046f282869cerion * uint32_t *p;                        // ptr to access insns by idx
122cfe949112586ed0423a6064ae91ad3046f282869cerion * for imm...                          // loop over imm
123cfe949112586ed0423a6064ae91ad3046f282869cerion *   p = (void *)func;
124cfe949112586ed0423a6064ae91ad3046f282869cerion *   func_buf[1] = p[1];               // copy 'blr' to func_buf[1]
125cfe949112586ed0423a6064ae91ad3046f282869cerion *   patch_op_imm16(func_buf, p, imm); // patched 'addi' -> func_buf[0]
126cfe949112586ed0423a6064ae91ad3046f282869cerion *   func = (void *)func_buf;          // ptr to stack based insns
127cfe949112586ed0423a6064ae91ad3046f282869cerion *   (*func)();                        // exec our rewritten code
128cfe949112586ed0423a6064ae91ad3046f282869cerion *
129cfe949112586ed0423a6064ae91ad3046f282869cerion * patch_op_imm16() itself simply takes the uint32_t insn and overwrites
130cfe949112586ed0423a6064ae91ad3046f282869cerion * the immediate field with the new value (which, for 'addi', is the
131cfe949112586ed0423a6064ae91ad3046f282869cerion * low 16 bits).
132cfe949112586ed0423a6064ae91ad3046f282869cerion *
133cfe949112586ed0423a6064ae91ad3046f282869cerion * So in the loop test, if 'imm' is currently 9, and p[0] is:
134cfe949112586ed0423a6064ae91ad3046f282869cerion *   0x3A2E0000   => addi 17, 14, 0
135cfe949112586ed0423a6064ae91ad3046f282869cerion *
136cfe949112586ed0423a6064ae91ad3046f282869cerion * after patch_op_imm16(), func_buf[0] becomes:
137cfe949112586ed0423a6064ae91ad3046f282869cerion *   0x3A2E0009   => addi 17, 14, 9
138a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj*/
139a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
140586fb038935723146cb6950b38911aeb9fc12765cerion
141586fb038935723146cb6950b38911aeb9fc12765cerion/**********************************************************************/
142586fb038935723146cb6950b38911aeb9fc12765cerion/* Uncomment to enable many arguments for altivec insns */
143586fb038935723146cb6950b38911aeb9fc12765cerion#define USAGE_SIMPLE
144586fb038935723146cb6950b38911aeb9fc12765cerion
145586fb038935723146cb6950b38911aeb9fc12765cerion/* Uncomment to enable many arguments for altivec insns */
146586fb038935723146cb6950b38911aeb9fc12765cerion//#define ALTIVEC_ARGS_LARGE
147586fb038935723146cb6950b38911aeb9fc12765cerion
148586fb038935723146cb6950b38911aeb9fc12765cerion/* Uncomment to enable output of CR flags for float tests */
149586fb038935723146cb6950b38911aeb9fc12765cerion//#define TEST_FLOAT_FLAGS
150586fb038935723146cb6950b38911aeb9fc12765cerion
151586fb038935723146cb6950b38911aeb9fc12765cerion/* Uncomment to enable debug output */
152586fb038935723146cb6950b38911aeb9fc12765cerion//#define DEBUG_ARGS_BUILD
153586fb038935723146cb6950b38911aeb9fc12765cerion//#define DEBUG_FILTER
154586fb038935723146cb6950b38911aeb9fc12765cerion
155586fb038935723146cb6950b38911aeb9fc12765cerion/* These should be set at build time */
156586fb038935723146cb6950b38911aeb9fc12765cerion//#define NO_FLOAT
157586fb038935723146cb6950b38911aeb9fc12765cerion//#define HAS_ALTIVEC
158586fb038935723146cb6950b38911aeb9fc12765cerion//#define IS_PPC405
159586fb038935723146cb6950b38911aeb9fc12765cerion/**********************************************************************/
160586fb038935723146cb6950b38911aeb9fc12765cerion
161586fb038935723146cb6950b38911aeb9fc12765cerion
162a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <stdint.h>
163a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
164a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister double f14 __asm__ ("f14");
165a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister double f15 __asm__ ("f15");
166a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister double f16 __asm__ ("f16");
167a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister double f17 __asm__ ("f17");
168a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister double f18 __asm__ ("f18");
169a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister uint32_t r14 __asm__ ("r14");
170a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister uint32_t r15 __asm__ ("r15");
171a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister uint32_t r16 __asm__ ("r16");
172a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister uint32_t r17 __asm__ ("r17");
173a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjregister uint32_t r18 __asm__ ("r18");
174a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
175a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
176a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#   include <altivec.h>
177a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
178a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <assert.h>
179a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <ctype.h>
180a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <fcntl.h>
181a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj//#include <fenv.h>
182a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj//#include <math.h>
183a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <stdio.h>
184a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <stdlib.h>
185a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <string.h>
186a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <unistd.h>
187a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <malloc.h>
188a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1898a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
1908a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion#define ASSEMBLY_FUNC(__fname, __insn)     \
1918a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionasm(".section \".text\"\n"                 \
1928a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    "\t.align 2\n"                         \
1938a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    "\t.type "__fname",@function\n"        \
1948a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    __fname":\n"                           \
1958a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    "\t"__insn"\n"                         \
1968a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    "\tblr\n"                              \
1978a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    "\t.previous\n"                        \
1988a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    )
1998a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
2008a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
201a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* -------------- BEGIN #include "test-ppc.h" -------------- */
202a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/*
203a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * test-ppc.h:
204a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * PPC tests for qemu-PPC CPU emulation checks - definitions
205a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
206a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * Copyright (c) 2005 Jocelyn Mayer
207a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
208a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   This program is free software; you can redistribute it and/or
209a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   modify it under the terms of the GNU General Public License V2
210a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   as published by the Free Software Foundation
211a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
212a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   This program is distributed in the hope that it will be useful,
213a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   but WITHOUT ANY WARRANTY; without even the implied warranty of
214a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
215a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   GNU General Public License for more details.
216a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *
217a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   You should have received a copy of the GNU General Public License
218a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   along with this program; if not, write to the Free Software
219a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
220a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj */
221a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
222a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (__TEST_PPC_H__)
223a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#define __TEST_PPC_H__
224a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
225a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#include <stdint.h>
226a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
227a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjtypedef void (*test_func_t) (void);
228a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjtypedef struct test_t test_t;
229a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjtypedef struct test_table_t test_table_t;
230a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstruct test_t {
231a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    test_func_t func;
232530f73578552bc876a51fbf90cb6be29769bb362sewardj    const char *name;
233a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
234a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
235a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstruct test_table_t {
236a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    test_t *tests;
237530f73578552bc876a51fbf90cb6be29769bb362sewardj    const char *name;
238a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    uint32_t flags;
239a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
240a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
241530f73578552bc876a51fbf90cb6be29769bb362sewardjtypedef void (*test_loop_t) (const char *name, test_func_t func,
242a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                             uint32_t flags);
243a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
244a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjenum test_flags {
245a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    /* Nb arguments */
246a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_ONE_ARG    = 0x00000001,
247a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_TWO_ARGS   = 0x00000002,
248a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_THREE_ARGS = 0x00000003,
249a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_CMP_ARGS   = 0x00000004,  // family: compare
250a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_CMPI_ARGS  = 0x00000005,  // family: compare
251a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_TWO_I16    = 0x00000006,  // family: arith/logical
252a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_SPECIAL    = 0x00000007,  // family: logical
253a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_LD_ARGS    = 0x00000008,  // family: ldst
254a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_LDX_ARGS   = 0x00000009,  // family: ldst
255a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_ST_ARGS    = 0x0000000A,  // family: ldst
256a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_STX_ARGS   = 0x0000000B,  // family: ldst
257a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_NB_ARGS    = 0x0000000F,
258a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    /* Type */
259a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_ARITH      = 0x00000100,
260a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_LOGICAL    = 0x00000200,
261a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_COMPARE    = 0x00000300,
262a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_CROP       = 0x00000400,
263a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_LDST       = 0x00000500,
264a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_TYPE       = 0x00000F00,
265a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    /* Family */
266a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_INTEGER    = 0x00010000,
267a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_FLOAT      = 0x00020000,
268a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_405        = 0x00030000,
269a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_ALTIVEC    = 0x00040000,
270a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_FALTIVEC   = 0x00050000,
271a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_FAMILY     = 0x000F0000,
272a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    /* Flags: these may be combined, so use separate bitfields. */
273a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_CR         = 0x01000000,
274a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    PPC_XER_CA     = 0x02000000,
275a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
276a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
277a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (__TEST_PPC_H__) */
278a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
279a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* -------------- END #include "test-ppc.h" -------------- */
280a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
281a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
282a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
283a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
284a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (DEBUG_ARGS_BUILD)
285a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
286a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
287a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#define AB_DPRINTF(fmt, args...) do { } while (0)
288a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
289a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
290a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (DEBUG_FILTER)
291a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#define FDPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
292a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
293a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#define FDPRINTF(fmt, args...) do { } while (0)
294a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
295a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2968a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
297c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion/* Produce the 64-bit pattern corresponding to the supplied double. */
298c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic uint64_t double_to_bits ( double d )
299c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
300c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   union { uint64_t i; double d; } u;
301c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   assert(8 == sizeof(uint64_t));
302c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   assert(8 == sizeof(double));
303c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   assert(8 == sizeof(u));
304c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   u.d = d;
305c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   return u.i;
306c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
307c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
308c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if 0
309c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic float bits_to_float ( uint32_t i )
310c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
311c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   union { uint32_t i; float f; } u;
312c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   assert(4 == sizeof(uint32_t));
313c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   assert(4 == sizeof(float));
314c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   assert(4 == sizeof(u));
315c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   u.i = i;
316c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   return u.f;
317c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
318c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif
319a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3208a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
3218a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion#if defined (HAS_ALTIVEC)
3228a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionstatic void AB_DPRINTF_VEC32x4 ( vector unsigned int v )
3238a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion{
3248a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion#if defined (DEBUG_ARGS_BUILD)
3258a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   int i;
3268a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   unsigned int* p_int = (unsigned int*)&v;
3278a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   AB_DPRINTF("val");
3288a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   for (i=0; i<4; i++) {
3298a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion      AB_DPRINTF(" %08x", p_int[i]);
3308a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   }
3318a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   AB_DPRINTF("\n");
3328a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion#endif
3338a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion}
3348a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion#endif
3358a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
3368a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
337a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#define unused __attribute__ (( unused ))
338a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3398a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
340a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* -------------- BEGIN #include "ops-ppc.c" -------------- */
341a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
342a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* #include "test-ppc.h" */
343a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
344a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_add (void)
345a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
346a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("add          17, 14, 15");
347a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
348a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
349a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addo (void)
350a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
351a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addo         17, 14, 15");
352a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
353a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
354a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addc (void)
355a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
356a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addc         17, 14, 15");
357a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
358a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
359a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addco (void)
360a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
361a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addco        17, 14, 15");
362a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
363a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
364a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_divw (void)
365a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
366a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("divw         17, 14, 15");
367a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
368a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
369a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_divwo (void)
370a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
371a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("divwo        17, 14, 15");
372a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
373a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
374a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_divwu (void)
375a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
376a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("divwu        17, 14, 15");
377a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
378a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
379a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_divwuo (void)
380a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
381a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("divwuo       17, 14, 15");
382a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
383a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
384a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulhw (void)
385a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
386a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulhw        17, 14, 15");
387a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
388a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
389a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulhwu (void)
390a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
391a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulhwu       17, 14, 15");
392a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
393a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
394a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mullw (void)
395a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
396a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mullw        17, 14, 15");
397a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
398a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
399a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mullwo (void)
400a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
401a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mullwo       17, 14, 15");
402a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
403a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
404a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subf (void)
405a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
406a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subf         17, 14, 15");
407a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
408a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
409a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfo (void)
410a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
411a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfo        17, 14, 15");
412a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
413a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
414a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfc (void)
415a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
416a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfc        17, 14, 15");
417a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
418a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
419a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfco (void)
420a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
421a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfco       17, 14, 15");
422a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
423a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
424a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ia_ops_two[] = {
425a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_add             , "         add", },
426a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addo            , "        addo", },
427a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addc            , "        addc", },
428a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addco           , "       addco", },
429a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_divw            , "        divw", },
430a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_divwo           , "       divwo", },
431a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_divwu           , "       divwu", },
432a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_divwuo          , "      divwuo", },
433a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulhw           , "       mulhw", },
434a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulhwu          , "      mulhwu", },
435a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mullw           , "       mullw", },
436a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mullwo          , "      mullwo", },
437a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subf            , "        subf", },
438a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfo           , "       subfo", },
439a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfc           , "       subfc", },
440a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfco          , "      subfco", },
441a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
442a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
443a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
444a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_add_ (void)
445a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
446a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("add.         17, 14, 15");
447a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
448a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
449a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addo_ (void)
450a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
451a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addo.        17, 14, 15");
452a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
453a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
454a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addc_ (void)
455a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
456a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addc.        17, 14, 15");
457a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
458a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
459a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addco_ (void)
460a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
461a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addco.       17, 14, 15");
462a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
463a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
464a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_divw_ (void)
465a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
466a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("divw.        17, 14, 15");
467a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
468a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
469a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_divwo_ (void)
470a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
471a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("divwo.       17, 14, 15");
472a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
473a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
474a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_divwu_ (void)
475a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
476a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("divwu.       17, 14, 15");
477a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
478a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
479a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_divwuo_ (void)
480a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
481a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("divwuo.      17, 14, 15");
482a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
483a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
484a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulhw_ (void)
485a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
486a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulhw.       17, 14, 15");
487a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
488a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
489a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulhwu_ (void)
490a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
491a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulhwu.      17, 14, 15");
492a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
493a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
494a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mullw_ (void)
495a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
496a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mullw.       17, 14, 15");
497a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
498a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
499a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mullwo_ (void)
500a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
501a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mullwo.      17, 14, 15");
502a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
503a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
504a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subf_ (void)
505a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
506a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subf.        17, 14, 15");
507a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
508a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
509a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfo_ (void)
510a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
511a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfo.       17, 14, 15");
512a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
513a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
514a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfc_ (void)
515a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
516a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfc.       17, 14, 15");
517a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
518a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
519a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfco_ (void)
520a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
521a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfco.      17, 14, 15");
522a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
523a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
524a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_iar_ops_two[] = {
525a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_add_            , "        add.", },
526a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addo_           , "       addo.", },
527a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addc_           , "       addc.", },
528a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addco_          , "      addco.", },
529a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_divw_           , "       divw.", },
530a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_divwo_          , "      divwo.", },
531a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_divwu_          , "      divwu.", },
532a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_divwuo_         , "     divwuo.", },
533a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulhw_          , "      mulhw.", },
534a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulhwu_         , "     mulhwu.", },
535a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mullw_          , "      mullw.", },
536a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mullwo_         , "     mullwo.", },
537a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subf_           , "       subf.", },
538a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfo_          , "      subfo.", },
539a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfc_          , "      subfc.", },
540a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfco_         , "     subfco.", },
541a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
542a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
543a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
544a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_adde (void)
545a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
546a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("adde         17, 14, 15");
547a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
548a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
549a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addeo (void)
550a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
551a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addeo        17, 14, 15");
552a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
553a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
554a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfe (void)
555a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
556a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfe        17, 14, 15");
557a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
558a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
559a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfeo (void)
560a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
561a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfeo       17, 14, 15");
562a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
563a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
564a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_iac_ops_two[] = {
565a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_adde            , "        adde", },
566a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addeo           , "       addeo", },
567a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfe           , "       subfe", },
568a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfeo          , "      subfeo", },
569a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
570a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
571a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
572a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_adde_ (void)
573a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
574a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("adde.        17, 14, 15");
575a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
576a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
577a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addeo_ (void)
578a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
579a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addeo.       17, 14, 15");
580a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
581a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
582a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfe_ (void)
583a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
584a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfe.       17, 14, 15");
585a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
586a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
587a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfeo_ (void)
588a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
589a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfeo.      17, 14, 15");
590a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
591a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
592a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_iacr_ops_two[] = {
593a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_adde_           , "       adde.", },
594a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addeo_          , "      addeo.", },
595a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfe_          , "      subfe.", },
596a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfeo_         , "     subfeo.", },
597a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
598a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
599a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
600a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_and (void)
601a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
602a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("and          17, 14, 15");
603a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
604a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
605a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_andc (void)
606a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
607a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("andc         17, 14, 15");
608a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
609a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
610a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_eqv (void)
611a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
612a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("eqv          17, 14, 15");
613a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
614a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
615a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nand (void)
616a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
617a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nand         17, 14, 15");
618a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
619a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
620a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nor (void)
621a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
622a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nor          17, 14, 15");
623a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
624a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
625a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_or (void)
626a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
627a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("or           17, 14, 15");
628a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
629a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
630a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_orc (void)
631a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
632a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("orc          17, 14, 15");
633a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
634a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
635a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_xor (void)
636a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
637a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("xor          17, 14, 15");
638a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
639a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
640a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_slw (void)
641a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
642a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("slw          17, 14, 15");
643a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
644a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
645a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_sraw (void)
646a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
647a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("sraw         17, 14, 15");
648a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
649a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
650a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_srw (void)
651a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
652a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("srw          17, 14, 15");
653a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
654a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
655a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_il_ops_two[] = {
656a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_and             , "         and", },
657a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_andc            , "        andc", },
658a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_eqv             , "         eqv", },
659a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nand            , "        nand", },
660a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nor             , "         nor", },
661a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_or              , "          or", },
662a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_orc             , "         orc", },
663a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_xor             , "         xor", },
664a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_slw             , "         slw", },
665a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_sraw            , "        sraw", },
666a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_srw             , "         srw", },
667a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
668a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
669a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
670a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_and_ (void)
671a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
672a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("and.         17, 14, 15");
673a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
674a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
675a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_andc_ (void)
676a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
677a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("andc.        17, 14, 15");
678a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
679a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
680a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_eqv_ (void)
681a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
682a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("eqv.         17, 14, 15");
683a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
684a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
685a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nand_ (void)
686a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
687a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nand.        17, 14, 15");
688a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
689a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
690a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nor_ (void)
691a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
692a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nor.         17, 14, 15");
693a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
694a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
695a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_or_ (void)
696a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
697a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("or.          17, 14, 15");
698a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
699a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
700a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_orc_ (void)
701a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
702a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("orc.         17, 14, 15");
703a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
704a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
705a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_xor_ (void)
706a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
707a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("xor.         17, 14, 15");
708a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
709a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
710a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_slw_ (void)
711a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
712a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("slw.         17, 14, 15");
713a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
714a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
715a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_sraw_ (void)
716a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
717a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("sraw.        17, 14, 15");
718a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
719a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
720a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_srw_ (void)
721a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
722a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("srw.         17, 14, 15");
723a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
724a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
725a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ilr_ops_two[] = {
726a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_and_            , "        and.", },
727a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_andc_           , "       andc.", },
728a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_eqv_            , "        eqv.", },
729a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nand_           , "       nand.", },
730a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nor_            , "        nor.", },
731a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_or_             , "         or.", },
732a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_orc_            , "        orc.", },
733a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_xor_            , "        xor.", },
734a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_slw_            , "        slw.", },
735a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_sraw_           , "       sraw.", },
736a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_srw_            , "        srw.", },
737a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
738a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
739a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7408a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionstatic void test_cmpw (void)
741a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
7428a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    __asm__ __volatile__ ("cmpw         2, 14, 15");
743a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
744a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7458a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionstatic void test_cmplw (void)
746a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
7478a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    __asm__ __volatile__ ("cmplw        2, 14, 15");
748a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
749a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
750a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_icr_ops_two[] = {
7518a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    { &test_cmpw            , "        cmpw", },
7528a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    { &test_cmplw           , "       cmplw", },
753a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
754a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
755a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7568a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionextern void test_cmpwi (void);
7578a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_cmpwi", "cmpwi         2, 14, 0");
7588a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion
7598a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionextern void test_cmplwi (void);
7608a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_cmplwi", "cmplwi        2, 14, 0");
761a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
762a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_icr_ops_two_i16[] = {
7638a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    { &test_cmpwi           , "       cmpwi", },
7648a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion    { &test_cmplwi          , "      cmplwi", },
765a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
766a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
767a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
76857778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_addi (void);
7698a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_addi", "addi         17, 14, 0");
77057778621b9d85c82fcb5185ba146add1715c5432sewardj
77157778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_addic (void);
7728a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_addic", "addic        17, 14, 0");
77357778621b9d85c82fcb5185ba146add1715c5432sewardj
77457778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_addis (void);
7758a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_addis", "addis        17, 14, 0");
77657778621b9d85c82fcb5185ba146add1715c5432sewardj
77757778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_mulli (void);
7788a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_mulli", "mulli        17, 14, 0");
77957778621b9d85c82fcb5185ba146add1715c5432sewardj
78057778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_subfic (void);
7818a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_subfic", "subfic       17, 14, 0");
782a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
783a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ia_ops_two_i16[] = {
784a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addi            , "        addi", },
785a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addic           , "       addic", },
786a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addis           , "       addis", },
787a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulli           , "       mulli", },
788a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfic          , "      subfic", },
789a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
790a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
791a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
79257778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_addic_ (void);
7938a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_addic_", "addic.       17, 14, 0");
794a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
795a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_iar_ops_two_i16[] = {
796a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addic_          , "      addic.", },
797a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
798a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
799a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
80057778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_ori (void);
8018a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_ori", "ori       17, 14, 0");
80257778621b9d85c82fcb5185ba146add1715c5432sewardj
80357778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_oris (void);
8048a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_oris", "oris       17, 14, 0");
80557778621b9d85c82fcb5185ba146add1715c5432sewardj
80657778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_xori (void);
8078a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_xori", "xori       17, 14, 0");
80857778621b9d85c82fcb5185ba146add1715c5432sewardj
80957778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_xoris (void);
8108a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_xoris", "xoris       17, 14, 0");
811a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
812a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_il_ops_two_i16[] = {
813a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_ori             , "         ori", },
814a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_oris            , "        oris", },
815a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_xori            , "        xori", },
816a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_xoris           , "       xoris", },
817a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
818a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
819a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
82057778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_andi_ (void);
8218a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_andi_", "andi.       17, 14, 0");
82257778621b9d85c82fcb5185ba146add1715c5432sewardj
82357778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_andis_ (void);
8248a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_andis_", "andis.      17, 14, 0");
825a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
826a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ilr_ops_two_i16[] = {
827a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_andi_           , "       andi.", },
828a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_andis_          , "      andis.", },
829a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
830a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
831a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
832a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_crand (void)
833a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
834a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("crand        17, 14, 15");
835a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
836a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
837a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_crandc (void)
838a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
839a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("crandc       17, 14, 15");
840a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
841a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
842a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_creqv (void)
843a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
844a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("creqv        17, 14, 15");
845a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
846a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
847a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_crnand (void)
848a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
849a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("crnand       17, 14, 15");
850a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
851a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
852a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_crnor (void)
853a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
854a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("crnor        17, 14, 15");
855a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
856a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
857a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_cror (void)
858a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
859a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("cror         17, 14, 15");
860a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
861a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
862a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_crorc (void)
863a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
864a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("crorc        17, 14, 15");
865a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
866a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
867a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_crxor (void)
868a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
869a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("crxor        17, 14, 15");
870a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
871a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
872a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_crl_ops_two[] = {
873a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_crand           , "       crand", },
874a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_crandc          , "      crandc", },
875a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_creqv           , "       creqv", },
876a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_crnand          , "      crnand", },
877a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_crnor           , "       crnor", },
878a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_cror            , "        cror", },
879a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_crorc           , "       crorc", },
880a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_crxor           , "       crxor", },
881a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
882a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
883a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
884a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addme (void)
885a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
886a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addme        17, 14");
887a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
888a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
889a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addmeo (void)
890a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
891a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addmeo       17, 14");
892a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
893a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
894a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addze (void)
895a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
896a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addze        17, 14");
897a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
898a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
899a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addzeo (void)
900a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
901a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addzeo       17, 14");
902a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
903a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
904a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfme (void)
905a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
906a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfme       17, 14");
907a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
908a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
909a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfmeo (void)
910a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
911a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfmeo      17, 14");
912a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
913a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
914a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfze (void)
915a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
916a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfze       17, 14");
917a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
918a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
919a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfzeo (void)
920a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
921a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfzeo      17, 14");
922a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
923a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
924a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_iac_ops_one[] = {
925a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addme           , "       addme", },
926a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addmeo          , "      addmeo", },
927a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addze           , "       addze", },
928a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addzeo          , "      addzeo", },
929a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfme          , "      subfme", },
930a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfmeo         , "     subfmeo", },
931a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfze          , "      subfze", },
932a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfzeo         , "     subfzeo", },
933a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
934a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
935a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
936a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addme_ (void)
937a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
938a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addme.       17, 14");
939a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
940a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
941a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addmeo_ (void)
942a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
943a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addmeo.      17, 14");
944a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
945a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
946a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addze_ (void)
947a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
948a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addze.       17, 14");
949a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
950a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
951a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_addzeo_ (void)
952a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
953a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("addzeo.      17, 14");
954a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
955a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
956a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfme_ (void)
957a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
958a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfme.      17, 14");
959a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
960a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
961a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfmeo_ (void)
962a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
963a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfmeo.     17, 14");
964a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
965a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
966a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfze_ (void)
967a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
968a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfze.      17, 14");
969a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
970a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
971a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_subfzeo_ (void)
972a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
973a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("subfzeo.     17, 14");
974a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
975a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
976a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_iacr_ops_one[] = {
977a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addme_          , "      addme.", },
978a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addmeo_         , "     addmeo.", },
979a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addze_          , "      addze.", },
980a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_addzeo_         , "     addzeo.", },
981a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfme_         , "     subfme.", },
982a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfmeo_        , "    subfmeo.", },
983a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfze_         , "     subfze.", },
984a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_subfzeo_        , "    subfzeo.", },
985a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
986a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
987a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
988a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_cntlzw (void)
989a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
990a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("cntlzw       17, 14");
991a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
992a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
993a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_extsb (void)
994a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
995a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("extsb        17, 14");
996a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
997a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
998a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_extsh (void)
999a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1000a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("extsh        17, 14");
1001a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1002a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1003a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_neg (void)
1004a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1005a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("neg          17, 14");
1006a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1007a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1008a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nego (void)
1009a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1010a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nego         17, 14");
1011a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1012a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1013a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_il_ops_one[] = {
1014a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_cntlzw          , "      cntlzw", },
1015a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_extsb           , "       extsb", },
1016a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_extsh           , "       extsh", },
1017a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_neg             , "         neg", },
1018a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nego            , "        nego", },
1019a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1020a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1021a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1022a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_cntlzw_ (void)
1023a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1024a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("cntlzw.      17, 14");
1025a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1026a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1027a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_extsb_ (void)
1028a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1029a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("extsb.       17, 14");
1030a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1031a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1032a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_extsh_ (void)
1033a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1034a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("extsh.       17, 14");
1035a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1036a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1037a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_neg_ (void)
1038a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1039a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("neg.         17, 14");
1040a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1041a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1042a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nego_ (void)
1043a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1044a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nego.        17, 14");
1045a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1046a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1047a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ilr_ops_one[] = {
1048a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_cntlzw_         , "     cntlzw.", },
1049a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_extsb_          , "      extsb.", },
1050a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_extsh_          , "      extsh.", },
1051a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_neg_            , "        neg.", },
1052a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nego_           , "       nego.", },
1053a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1054a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1055a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
105657778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_rlwimi (void);
10578a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_rlwimi", "rlwimi      17, 14, 0, 0, 0");
105857778621b9d85c82fcb5185ba146add1715c5432sewardj
105957778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_rlwinm (void);
10608a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_rlwinm", "rlwinm      17, 14, 0, 0, 0");
106157778621b9d85c82fcb5185ba146add1715c5432sewardj
106257778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_rlwnm (void);
10638a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_rlwnm", "rlwnm      17, 14, 15, 0, 0");
106457778621b9d85c82fcb5185ba146add1715c5432sewardj
106557778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_srawi (void);
10668a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_srawi", "srawi      17, 14, 0");
1067a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1068a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mfcr (void)
1069a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1070a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mfcr         17");
1071a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1072a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1073a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mfspr (void)
1074a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1075a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mfspr        17, 1");
1076a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1077a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1078a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mtspr (void)
1079a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1080a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mtspr        1, 14");
1081a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1082a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1083a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_il_ops_spe[] = {
1084a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_rlwimi          , "      rlwimi", },
1085a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_rlwinm          , "      rlwinm", },
1086a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_rlwnm           , "       rlwnm", },
1087a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_srawi           , "       srawi", },
1088a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mfcr            , "        mfcr", },
1089a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mfspr           , "       mfspr", },
1090a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mtspr           , "       mtspr", },
1091a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1092a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1093a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
109457778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_rlwimi_ (void);
10958a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_rlwimi_", "rlwimi.      17, 14, 0, 0, 0");
109657778621b9d85c82fcb5185ba146add1715c5432sewardj
109757778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_rlwinm_ (void);
10988a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_rlwinm_", "rlwinm.      17, 14, 0, 0, 0");
109957778621b9d85c82fcb5185ba146add1715c5432sewardj
110057778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_rlwnm_ (void);
11018a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_rlwnm_", "rlwnm.      17, 14, 15, 0, 0");
110257778621b9d85c82fcb5185ba146add1715c5432sewardj
110357778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_srawi_ (void);
11048a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_srawi_", "srawi.      17, 14, 0");
110557778621b9d85c82fcb5185ba146add1715c5432sewardj
110657778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_mcrf (void);
11078a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_mcrf", "mcrf      0, 0");
110857778621b9d85c82fcb5185ba146add1715c5432sewardj
110957778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_mcrxr (void);
11108a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_mcrxr", "mcrxr      0");
111157778621b9d85c82fcb5185ba146add1715c5432sewardj
111257778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_mtcrf (void);
11138a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_mtcrf", "mtcrf      0, 14");
1114a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1115a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ilr_ops_spe[] = {
1116a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_rlwimi_         , "     rlwimi.", },
1117a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_rlwinm_         , "     rlwinm.", },
1118a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_rlwnm_          , "      rlwnm.", },
1119a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_srawi_          , "      srawi.", },
1120a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mcrf            , "        mcrf", },
1121a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mcrxr           , "       mcrxr", },
1122a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mtcrf           , "       mtcrf", },
1123a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1124a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1125a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
112657778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_lbz (void);
11278a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lbz", "lbz          17,0(14)");
112857778621b9d85c82fcb5185ba146add1715c5432sewardj
112957778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_lbzu (void);
11308a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lbzu", "lbzu          17,0(14)");
113157778621b9d85c82fcb5185ba146add1715c5432sewardj
113257778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_lha (void);
11338a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lha", "lha          17,0(14)");
113457778621b9d85c82fcb5185ba146add1715c5432sewardj
113557778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_lhau (void);
11368a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lhau", "lhau          17,0(14)");
113757778621b9d85c82fcb5185ba146add1715c5432sewardj
113857778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_lhz (void);
11398a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lhz", "lhz          17,0(14)");
114057778621b9d85c82fcb5185ba146add1715c5432sewardj
114157778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_lhzu (void);
11428a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lhzu", "lhzu         17,0(14)");
114357778621b9d85c82fcb5185ba146add1715c5432sewardj
114457778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_lwz (void);
11458a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lwz", "lwz          17,0(14)");
114657778621b9d85c82fcb5185ba146add1715c5432sewardj
114757778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_lwzu (void);
11488a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lwzu", "lwzu          17,0(14)");
1149a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1150a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ild_ops_two_i16[] = {
1151a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lbz             , "         lbz", },
1152a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lbzu            , "        lbzu", },
1153a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lha             , "         lha", },
1154a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lhau            , "        lhau", },
1155a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lhz             , "         lhz", },
1156a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lhzu            , "        lhzu", },
1157a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lwz             , "         lwz", },
1158a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lwzu            , "        lwzu", },
1159a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1160a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1161a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1162a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_lbzx (void)
1163a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1164a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("lbzx         17,14,15");
1165a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1166a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1167a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_lbzux (void)
1168a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1169a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("lbzux        17,14,15");
1170a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1171a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1172a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_lhax (void)
1173a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1174a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("lhax         17,14,15");
1175a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1176a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1177a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_lhaux (void)
1178a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1179a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("lhaux        17,14,15");
1180a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1181a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1182a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_lhzx (void)
1183a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1184a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("lhzx         17,14,15");
1185a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1186a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1187a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_lhzux (void)
1188a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1189a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("lhzux        17,14,15");
1190a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1191a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1192a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_lwzx (void)
1193a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1194a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("lwzx         17,14,15");
1195a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1196a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1197a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_lwzux (void)
1198a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1199a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("lwzux        17,14,15");
1200a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1201a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1202a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ild_ops_two[] = {
1203a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lbzx            , "        lbzx", },
1204a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lbzux           , "       lbzux", },
1205a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lhax            , "        lhax", },
1206a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lhaux           , "       lhaux", },
1207a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lhzx            , "        lhzx", },
1208a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lhzux           , "       lhzux", },
1209a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lwzx            , "        lwzx", },
1210a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_lwzux           , "       lwzux", },
1211a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1212a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1213a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
121457778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_stb (void);
12158a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_stb", "stb          14,0(15)");
121657778621b9d85c82fcb5185ba146add1715c5432sewardj
121757778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_stbu (void);
12188a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_stbu", "stbu          14,0(15)");
121957778621b9d85c82fcb5185ba146add1715c5432sewardj
122057778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_sth (void);
12218a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_sth", "sth          14,0(15)");
122257778621b9d85c82fcb5185ba146add1715c5432sewardj
122357778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_sthu (void);
12248a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_sthu", "sthu         14,0(15)");
122557778621b9d85c82fcb5185ba146add1715c5432sewardj
122657778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_stw (void);
12278a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_stw", "stw          14,0(15)");
122857778621b9d85c82fcb5185ba146add1715c5432sewardj
122957778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_stwu (void);
12308a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_stwu", "stwu          14,0(15)");
1231a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1232a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ist_ops_three_i16[] = {
1233a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_stb             , "         stb", },
1234a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_stbu            , "        stbu", },
1235a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_sth             , "         sth", },
1236a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_sthu            , "        sthu", },
1237a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_stw             , "         stw", },
1238a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_stwu            , "        stwu", },
1239a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1240a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1241a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1242a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_stbx (void)
1243a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1244a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("stbx         14,15,16");
1245a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1246a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1247a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_stbux (void)
1248a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1249a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("stbux        14,15,16");
1250a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1251a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1252a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_sthx (void)
1253a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1254a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("sthx         14,15,16");
1255a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1256a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1257a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_sthux (void)
1258a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1259a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("sthux        14,15,16");
1260a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1261a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1262a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_stwx (void)
1263a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1264a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("stwx         14,15,16");
1265a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1266a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1267a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_stwux (void)
1268a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1269a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("stwux        14,15,16");
1270a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1271a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1272a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ist_ops_three[] = {
1273a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_stbx            , "        stbx", },
1274a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_stbux           , "       stbux", },
1275a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_sthx            , "        sthx", },
1276a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_sthux           , "       sthux", },
1277a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_stwx            , "        stwx", },
1278a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_stwux           , "       stwux", },
1279a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1280a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1281a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1282a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
1283a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fsel (void)
1284a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1285a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fsel         17, 14, 15, 16");
1286a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1287a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1288a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmadd (void)
1289a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1290a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmadd        17, 14, 15, 16");
1291a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1292a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1293a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmadds (void)
1294a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1295a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmadds       17, 14, 15, 16");
1296a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1297a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1298a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmsub (void)
1299a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1300a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmsub        17, 14, 15, 16");
1301a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1302a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1303a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmsubs (void)
1304a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1305a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmsubs       17, 14, 15, 16");
1306a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1307a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1308a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnmadd (void)
1309a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1310a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnmadd       17, 14, 15, 16");
1311a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1312a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1313a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnmadds (void)
1314a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1315a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnmadds      17, 14, 15, 16");
1316a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1317a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1318a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnmsub (void)
1319a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1320a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnmsub       17, 14, 15, 16");
1321a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1322a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1323a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnmsubs (void)
1324a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1325a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnmsubs      17, 14, 15, 16");
1326a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1327a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1328a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_fa_ops_three[] = {
1329a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fsel            , "        fsel", },
1330a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmadd           , "       fmadd", },
1331a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmadds          , "      fmadds", },
1332a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmsub           , "       fmsub", },
1333a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmsubs          , "      fmsubs", },
1334a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnmadd          , "      fnmadd", },
1335a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnmadds         , "     fnmadds", },
1336a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnmsub          , "      fnmsub", },
1337a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnmsubs         , "     fnmsubs", },
1338a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1339a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1340a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1341a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1342a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
1343a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fsel_ (void)
1344a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1345a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fsel.        17, 14, 15, 16");
1346a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1347a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1348a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmadd_ (void)
1349a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1350a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmadd.       17, 14, 15, 16");
1351a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1352a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1353a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmadds_ (void)
1354a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1355a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmadds.      17, 14, 15, 16");
1356a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1357a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1358a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmsub_ (void)
1359a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1360a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmsub.       17, 14, 15, 16");
1361a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1362a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1363a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmsubs_ (void)
1364a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1365a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmsubs.      17, 14, 15, 16");
1366a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1367a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1368a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnmadd_ (void)
1369a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1370a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnmadd.      17, 14, 15, 16");
1371a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1372a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1373a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnmadds_ (void)
1374a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1375a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnmadds.     17, 14, 15, 16");
1376a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1377a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1378a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnmsub_ (void)
1379a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1380a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnmsub.      17, 14, 15, 16");
1381a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1382a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1383a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnmsubs_ (void)
1384a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1385a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnmsubs.     17, 14, 15, 16");
1386a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1387a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1388a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_far_ops_three[] = {
1389a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fsel_           , "       fsel.", },
1390a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmadd_          , "      fmadd.", },
1391a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmadds_         , "     fmadds.", },
1392a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmsub_          , "      fmsub.", },
1393a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmsubs_         , "     fmsubs.", },
1394a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnmadd_         , "     fnmadd.", },
1395a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnmadds_        , "    fnmadds.", },
1396a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnmsub_         , "     fnmsub.", },
1397a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnmsubs_        , "    fnmsubs.", },
1398a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1399a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1400a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1401a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1402a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
1403a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fadd (void)
1404a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1405a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fadd         17, 14, 15");
1406a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1407a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1408a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fadds (void)
1409a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1410a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fadds        17, 14, 15");
1411a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1412a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1413a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fsub (void)
1414a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1415a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fsub         17, 14, 15");
1416a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1417a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1418a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fsubs (void)
1419a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1420a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fsubs        17, 14, 15");
1421a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1422a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1423a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmul (void)
1424a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1425a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmul         17, 14, 15");
1426a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1427a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1428a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmuls (void)
1429a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1430a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmuls        17, 14, 15");
1431a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1432a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1433a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fdiv (void)
1434a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1435a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fdiv         17, 14, 15");
1436a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1437a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1438a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fdivs (void)
1439a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1440a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fdivs        17, 14, 15");
1441a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1442a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1443a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_fa_ops_two[] = {
1444a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fadd            , "        fadd", },
1445a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fadds           , "       fadds", },
1446a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fsub            , "        fsub", },
1447a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fsubs           , "       fsubs", },
1448a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmul            , "        fmul", },
1449a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmuls           , "       fmuls", },
1450a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fdiv            , "        fdiv", },
1451a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fdivs           , "       fdivs", },
1452a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1453a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1454a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1455a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1456a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
1457a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fadd_ (void)
1458a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1459a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fadd.        17, 14, 15");
1460a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1461a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1462a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fadds_ (void)
1463a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1464a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fadds.       17, 14, 15");
1465a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1466a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1467a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fsub_ (void)
1468a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1469a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fsub.        17, 14, 15");
1470a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1471a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1472a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fsubs_ (void)
1473a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1474a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fsubs.       17, 14, 15");
1475a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1476a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1477a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmul_ (void)
1478a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1479a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmul.        17, 14, 15");
1480a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1481a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1482a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmuls_ (void)
1483a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1484a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmuls.       17, 14, 15");
1485a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1486a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1487a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fdiv_ (void)
1488a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1489a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fdiv.        17, 14, 15");
1490a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1491a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1492a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fdivs_ (void)
1493a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1494a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fdivs.       17, 14, 15");
1495a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1496a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1497a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_far_ops_two[] = {
1498a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fadd_           , "       fadd.", },
1499a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fadds_          , "      fadds.", },
1500a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fsub_           , "       fsub.", },
1501a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fsubs_          , "      fsubs.", },
1502a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmul_           , "       fmul.", },
1503a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmuls_          , "      fmuls.", },
1504a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fdiv_           , "       fdiv.", },
1505a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fdivs_          , "      fdivs.", },
1506a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1507a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1508a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1509a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1510a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
1511a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fcmpo (void)
1512a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1513a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fcmpo        2, 14, 15");
1514a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1515a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1516a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fcmpu (void)
1517a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1518a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fcmpu        2, 14, 15");
1519a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1520a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1521a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_fcr_ops_two[] = {
1522a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fcmpo           , "       fcmpo", },
1523a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fcmpu           , "       fcmpu", },
1524a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1525a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1526a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1527a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1528a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
152905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
153005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if 0   // TODO: Not yet supported
1531a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fres (void)
1532a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1533a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fres         17, 14");
1534a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1535a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1536a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_frsqrte (void)
1537a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1538a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("frsqrte      17, 14");
1539a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
154005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif
1541a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1542a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_frsp (void)
1543a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1544a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("frsp         17, 14");
1545a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1546a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1547a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fctiw (void)
1548a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1549a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fctiw        17, 14");
1550a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1551a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1552a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fctiwz (void)
1553a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1554a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fctiwz       17, 14");
1555a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1556a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1557a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmr (void)
1558a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1559a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmr          17, 14");
1560a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1561a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1562a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fneg (void)
1563a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1564a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fneg         17, 14");
1565a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1566a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1567a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fabs (void)
1568a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1569a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fabs         17, 14");
1570a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1571a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1572a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnabs (void)
1573a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1574a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnabs        17, 14");
1575a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1576a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1577586fb038935723146cb6950b38911aeb9fc12765cerionstatic void test_fsqrt (void)
1578586fb038935723146cb6950b38911aeb9fc12765cerion{
1579586fb038935723146cb6950b38911aeb9fc12765cerion    __asm__ __volatile__ ("fsqrt        17, 14");
1580586fb038935723146cb6950b38911aeb9fc12765cerion}
1581586fb038935723146cb6950b38911aeb9fc12765cerion
1582a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_fa_ops_one[] = {
158305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   //    { &test_fres            , "        fres", },   // TODO: Not yet supported
158405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   //    { &test_frsqrte         , "     frsqrte", },   // TODO: Not yet supported
1585a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_frsp            , "        frsp", },
1586a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fctiw           , "       fctiw", },
1587a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fctiwz          , "      fctiwz", },
1588a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmr             , "         fmr", },
1589a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fneg            , "        fneg", },
1590a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fabs            , "        fabs", },
1591a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnabs           , "       fnabs", },
1592586fb038935723146cb6950b38911aeb9fc12765cerion    { &test_fsqrt           , "       fsqrt", },
1593a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1594a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1595a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1596a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1597a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
159805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
159905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if 0   // TODO: Not yet supported
1600a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fres_ (void)
1601a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1602a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fres.        17, 14");
1603a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1604a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1605a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_frsqrte_ (void)
1606a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1607a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("frsqrte.     17, 14");
1608a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
160905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif
1610a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1611a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_frsp_ (void)
1612a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1613a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("frsp.        17, 14");
1614a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1615a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1616a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fctiw_ (void)
1617a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1618a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fctiw.       17, 14");
1619a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1620a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1621a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fctiwz_ (void)
1622a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1623a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fctiwz.      17, 14");
1624a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1625a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1626a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fmr_ (void)
1627a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1628a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fmr.         17, 14");
1629a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1630a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1631a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fneg_ (void)
1632a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1633a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fneg.        17, 14");
1634a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1635a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1636a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fabs_ (void)
1637a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1638a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fabs.        17, 14");
1639a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1640a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1641a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_fnabs_ (void)
1642a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1643a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("fnabs.       17, 14");
1644a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1645a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1646a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_far_ops_one[] = {
164705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   //    { &test_fres_           , "       fres.", },   // TODO: Not yet supported
164805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    //    { &test_frsqrte_        , "    frsqrte.", },   // TODO: Not yet supported
1649a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_frsp_           , "       frsp.", },
1650a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fctiw_          , "      fctiw.", },
1651a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fctiwz_         , "     fctiwz.", },
1652a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fmr_            , "        fmr.", },
1653a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fneg_           , "       fneg.", },
1654a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fabs_           , "       fabs.", },
1655a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_fnabs_          , "      fnabs.", },
1656a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1657a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1658a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1659a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1660a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
1661a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_fl_ops_spe[] = {
1662a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1663a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1664a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1665a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1666a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
1667a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_flr_ops_spe[] = {
1668a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1669a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1670a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
1671a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1672c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1673c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if !defined (NO_FLOAT)
1674c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionextern void test_lfs (void);
16758a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lfs", "lfs          17,0(14)");
1676c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1677c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionextern void test_lfsu (void);
16788a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lfsu", "lfsu          17,0(14)");
1679c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1680c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionextern void test_lfd (void);
16818a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lfd", "lfd          17,0(14)");
1682c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1683c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionextern void test_lfdu (void);
16848a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_lfdu", "lfdu          17,0(14)");
1685c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1686c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic test_t tests_fld_ops_two_i16[] = {
1687c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_lfs             , "         lfs", },
1688c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_lfsu            , "        lfsu", },
1689c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_lfd             , "         lfd", },
1690c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_lfdu            , "        lfdu", },
1691c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { NULL,                   NULL,           },
1692c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion};
1693c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif /* !defined (NO_FLOAT) */
1694c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1695c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if !defined (NO_FLOAT)
1696c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_lfsx (void)
1697c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
1698c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    __asm__ __volatile__ ("lfsx         17,14,15");
1699c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
1700c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1701c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_lfsux (void)
1702c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
1703c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    __asm__ __volatile__ ("lfsux        17,14,15");
1704c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
1705c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1706c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_lfdx (void)
1707c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
1708c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    __asm__ __volatile__ ("lfdx         17,14,15");
1709c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
1710c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1711c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_lfdux (void)
1712c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
1713c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    __asm__ __volatile__ ("lfdux        17,14,15");
1714c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
1715c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1716c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic test_t tests_fld_ops_two[] = {
1717c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_lfsx            , "        lfsx", },
1718c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_lfsux           , "       lfsux", },
1719c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_lfdx            , "        lfdx", },
1720c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_lfdux           , "       lfdux", },
1721c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { NULL,                   NULL,           },
1722c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion};
1723c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif /* !defined (NO_FLOAT) */
1724c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1725c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if !defined (NO_FLOAT)
1726c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionextern void test_stfs (void);
17278a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_stfs", "stfs          14,0(15)");
1728c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1729c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionextern void test_stfsu (void);
17308a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_stfsu", "stfsu          14,0(15)");
1731c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1732c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionextern void test_stfd (void);
17338a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_stfd", "stfd          14,0(15)");
1734c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1735c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionextern void test_stfdu (void);
17368a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_stfdu", "stfdu         14,0(15)");
1737c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1738c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic test_t tests_fst_ops_three_i16[] = {
1739586fb038935723146cb6950b38911aeb9fc12765cerion    { &test_stfs             , "         stfs", },
1740586fb038935723146cb6950b38911aeb9fc12765cerion    { &test_stfsu            , "        stfsu", },
1741c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_stfd             , "         stfd", },
1742c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_stfdu            , "        stfdu", },
1743c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { NULL,                   NULL,           },
1744c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion};
1745c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif /* !defined (NO_FLOAT) */
1746c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1747c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if !defined (NO_FLOAT)
1748c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_stfsx (void)
1749c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
1750c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    __asm__ __volatile__ ("stfsx         14,15,16");
1751c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
1752c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1753c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_stfsux (void)
1754c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
1755c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    __asm__ __volatile__ ("stfsux        14,15,16");
1756c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
1757c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1758c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_stfdx (void)
1759c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
1760c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    __asm__ __volatile__ ("stfdx         14,15,16");
1761c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
1762c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1763c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_stfdux (void)
1764c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
1765c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    __asm__ __volatile__ ("stfdux        14,15,16");
1766c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
1767c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1768c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic test_t tests_fst_ops_three[] = {
1769586fb038935723146cb6950b38911aeb9fc12765cerion    { &test_stfsx            , "        stfsx", },
1770586fb038935723146cb6950b38911aeb9fc12765cerion    { &test_stfsux           , "       stfsux", },
1771c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_stfdx            , "        stfdx", },
1772c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { &test_stfdux           , "       stfdux", },
1773c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    { NULL,                   NULL,           },
1774c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion};
1775c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif /* !defined (NO_FLOAT) */
1776c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1777c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
1778a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
1779a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmhaddshs (void)
1780a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1781a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmhaddshs    17, 14, 15, 16");
1782a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1783a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1784a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmhraddshs (void)
1785a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1786a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmhraddshs   17, 14, 15, 16");
1787a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1788a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1789a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmladduhm (void)
1790a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1791a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmladduhm    17, 14, 15, 16");
1792a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1793a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1794a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmsumubm (void)
1795a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1796a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmsumubm     17, 14, 15, 16");
1797a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1798a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1799a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmsumuhm (void)
1800a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1801a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmsumuhm     17, 14, 15, 16");
1802a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1803a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1804a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmsumshs (void)
1805a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1806a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmsumshs     17, 14, 15, 16");
1807a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1808a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1809a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmsumuhs (void)
1810a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1811a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmsumuhs     17, 14, 15, 16");
1812a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1813a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1814a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmsummbm (void)
1815a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1816a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmsummbm     17, 14, 15, 16");
1817a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1818a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1819a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmsumshm (void)
1820a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1821a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmsumshm     17, 14, 15, 16");
1822a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1823a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1824a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_aa_ops_three[] = {
1825a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmhaddshs       , "   vmhaddshs", },
1826a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmhraddshs      , "  vmhraddshs", },
1827a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmladduhm       , "   vmladduhm", },
1828a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmsumubm        , "    vmsumubm", },
1829a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmsumuhm        , "    vmsumuhm", },
1830a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmsumshs        , "    vmsumshs", },
1831a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmsumuhs        , "    vmsumuhs", },
1832a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmsummbm        , "    vmsummbm", },
1833a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmsumshm        , "    vmsumshm", },
1834a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1835a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1836a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
1837a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1838a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
1839a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vperm (void)
1840a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1841a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vperm        17, 14, 15, 16");
1842a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1843a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1844a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsel (void)
1845a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1846a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsel         17, 14, 15, 16");
1847a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1848a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1849a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_al_ops_three[] = {
1850a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vperm           , "       vperm", },
1851a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsel            , "        vsel", },
1852a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
1853a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
1854a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
1855a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1856a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
1857a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vaddubm (void)
1858a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1859a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vaddubm      17, 14, 15");
1860a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1861a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1862a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vadduhm (void)
1863a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1864a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vadduhm      17, 14, 15");
1865a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1866a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1867a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vadduwm (void)
1868a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1869a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vadduwm      17, 14, 15");
1870a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1871a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1872a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vaddubs (void)
1873a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1874a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vaddubs      17, 14, 15");
1875a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1876a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1877a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vadduhs (void)
1878a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1879a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vadduhs      17, 14, 15");
1880a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1881a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1882a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vadduws (void)
1883a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1884a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vadduws      17, 14, 15");
1885a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1886a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1887a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vaddsbs (void)
1888a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1889a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vaddsbs      17, 14, 15");
1890a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1891a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1892a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vaddshs (void)
1893a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1894a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vaddshs      17, 14, 15");
1895a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1896a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1897a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vaddsws (void)
1898a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1899a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vaddsws      17, 14, 15");
1900a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1901a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1902a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vaddcuw (void)
1903a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1904a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vaddcuw      17, 14, 15");
1905a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1906a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1907a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsububm (void)
1908a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1909a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsububm      17, 14, 15");
1910a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1911a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1912a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubuhm (void)
1913a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1914a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubuhm      17, 14, 15");
1915a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1916a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1917a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubuwm (void)
1918a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1919a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubuwm      17, 14, 15");
1920a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1921a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1922a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsububs (void)
1923a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1924a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsububs      17, 14, 15");
1925a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1926a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1927a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubuhs (void)
1928a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1929a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubuhs      17, 14, 15");
1930a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1931a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1932a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubuws (void)
1933a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1934a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubuws      17, 14, 15");
1935a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1936a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1937a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubsbs (void)
1938a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1939a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubsbs      17, 14, 15");
1940a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1941a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1942a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubshs (void)
1943a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1944a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubshs      17, 14, 15");
1945a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1946a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1947a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubsws (void)
1948a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1949a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubsws      17, 14, 15");
1950a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1951a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1952a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubcuw (void)
1953a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1954a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubcuw      17, 14, 15");
1955a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1956a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1957a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmuloub (void)
1958a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1959a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmuloub      17, 14, 15");
1960a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1961a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1962a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmulouh (void)
1963a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1964a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmulouh      17, 14, 15");
1965a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1966a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1967a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmulosb (void)
1968a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1969a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmulosb      17, 14, 15");
1970a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1971a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1972a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmulosh (void)
1973a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1974a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmulosh      17, 14, 15");
1975a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1976a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1977a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmuleub (void)
1978a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1979a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmuleub      17, 14, 15");
1980a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1981a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1982a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmuleuh (void)
1983a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1984a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmuleuh      17, 14, 15");
1985a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1986a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1987a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmulesb (void)
1988a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1989a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmulesb      17, 14, 15");
1990a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1991a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1992a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmulesh (void)
1993a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1994a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmulesh      17, 14, 15");
1995a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
1996a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
1997a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsumsws (void)
1998a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
1999a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsumsws      17, 14, 15");
2000a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2001a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2002a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsum2sws (void)
2003a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2004a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsum2sws     17, 14, 15");
2005a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2006a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2007a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsum4ubs (void)
2008a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2009a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsum4ubs     17, 14, 15");
2010a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2011a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2012a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsum4sbs (void)
2013a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2014a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsum4sbs     17, 14, 15");
2015a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2016a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2017a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsum4shs (void)
2018a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2019a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsum4shs     17, 14, 15");
2020a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2021a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2022a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vavgub (void)
2023a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2024a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vavgub       17, 14, 15");
2025a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2026a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2027a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vavguh (void)
2028a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2029a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vavguh       17, 14, 15");
2030a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2031a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2032a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vavguw (void)
2033a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2034a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vavguw       17, 14, 15");
2035a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2036a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2037a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vavgsb (void)
2038a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2039a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vavgsb       17, 14, 15");
2040a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2041a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2042a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vavgsh (void)
2043a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2044a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vavgsh       17, 14, 15");
2045a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2046a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2047a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vavgsw (void)
2048a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2049a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vavgsw       17, 14, 15");
2050a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2051a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2052a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmaxub (void)
2053a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2054a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmaxub       17, 14, 15");
2055a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2056a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2057a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmaxuh (void)
2058a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2059a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmaxuh       17, 14, 15");
2060a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2061a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2062a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmaxuw (void)
2063a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2064a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmaxuw       17, 14, 15");
2065a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2066a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2067a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmaxsb (void)
2068a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2069a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmaxsb       17, 14, 15");
2070a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2071a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2072a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmaxsh (void)
2073a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2074a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmaxsh       17, 14, 15");
2075a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2076a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2077a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmaxsw (void)
2078a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2079a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmaxsw       17, 14, 15");
2080a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2081a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2082a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vminub (void)
2083a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2084a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vminub       17, 14, 15");
2085a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2086a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2087a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vminuh (void)
2088a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2089a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vminuh       17, 14, 15");
2090a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2091a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2092a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vminuw (void)
2093a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2094a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vminuw       17, 14, 15");
2095a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2096a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2097a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vminsb (void)
2098a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2099a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vminsb       17, 14, 15");
2100a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2101a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2102a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vminsh (void)
2103a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2104a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vminsh       17, 14, 15");
2105a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2106a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2107a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vminsw (void)
2108a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2109a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vminsw       17, 14, 15");
2110a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2111a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2112a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_aa_ops_two[] = {
2113a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vaddubm         , "     vaddubm", },
2114a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vadduhm         , "     vadduhm", },
2115a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vadduwm         , "     vadduwm", },
2116a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vaddubs         , "     vaddubs", },
2117a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vadduhs         , "     vadduhs", },
2118a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vadduws         , "     vadduws", },
2119a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vaddsbs         , "     vaddsbs", },
2120a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vaddshs         , "     vaddshs", },
2121a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vaddsws         , "     vaddsws", },
2122a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vaddcuw         , "     vaddcuw", },
2123a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsububm         , "     vsububm", },
2124a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubuhm         , "     vsubuhm", },
2125a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubuwm         , "     vsubuwm", },
2126a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsububs         , "     vsububs", },
2127a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubuhs         , "     vsubuhs", },
2128a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubuws         , "     vsubuws", },
2129a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubsbs         , "     vsubsbs", },
2130a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubshs         , "     vsubshs", },
2131a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubsws         , "     vsubsws", },
2132a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubcuw         , "     vsubcuw", },
2133a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmuloub         , "     vmuloub", },
2134a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmulouh         , "     vmulouh", },
2135a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmulosb         , "     vmulosb", },
2136a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmulosh         , "     vmulosh", },
2137a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmuleub         , "     vmuleub", },
2138a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmuleuh         , "     vmuleuh", },
2139a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmulesb         , "     vmulesb", },
2140a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmulesh         , "     vmulesh", },
2141a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsumsws         , "     vsumsws", },
2142a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsum2sws        , "    vsum2sws", },
2143a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsum4ubs        , "    vsum4ubs", },
2144a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsum4sbs        , "    vsum4sbs", },
2145a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsum4shs        , "    vsum4shs", },
2146a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vavgub          , "      vavgub", },
2147a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vavguh          , "      vavguh", },
2148a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vavguw          , "      vavguw", },
2149a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vavgsb          , "      vavgsb", },
2150a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vavgsh          , "      vavgsh", },
2151a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vavgsw          , "      vavgsw", },
2152a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmaxub          , "      vmaxub", },
2153a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmaxuh          , "      vmaxuh", },
2154a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmaxuw          , "      vmaxuw", },
2155a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmaxsb          , "      vmaxsb", },
2156a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmaxsh          , "      vmaxsh", },
2157a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmaxsw          , "      vmaxsw", },
2158a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vminub          , "      vminub", },
2159a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vminuh          , "      vminuh", },
2160a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vminuw          , "      vminuw", },
2161a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vminsb          , "      vminsb", },
2162a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vminsh          , "      vminsh", },
2163a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vminsw          , "      vminsw", },
2164a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2165a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2166a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2167a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2168a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2169a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vand (void)
2170a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2171a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vand         17, 14, 15");
2172a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2173a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2174a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vor (void)
2175a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2176a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vor          17, 14, 15");
2177a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2178a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2179a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vxor (void)
2180a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2181a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vxor         17, 14, 15");
2182a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2183a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2184a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vandc (void)
2185a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2186a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vandc        17, 14, 15");
2187a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2188a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2189a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vnor (void)
2190a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2191a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vnor         17, 14, 15");
2192a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2193a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2194a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrlb (void)
2195a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2196a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrlb         17, 14, 15");
2197a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2198a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2199a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrlh (void)
2200a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2201a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrlh         17, 14, 15");
2202a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2203a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2204a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrlw (void)
2205a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2206a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrlw         17, 14, 15");
2207a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2208a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2209a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vslb (void)
2210a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2211a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vslb         17, 14, 15");
2212a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2213a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2214a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vslh (void)
2215a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2216a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vslh         17, 14, 15");
2217a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2218a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2219a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vslw (void)
2220a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2221a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vslw         17, 14, 15");
2222a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2223a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2224a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsrb (void)
2225a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2226a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsrb         17, 14, 15");
2227a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2228a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2229a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsrh (void)
2230a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2231a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsrh         17, 14, 15");
2232a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2233a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2234a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsrw (void)
2235a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2236a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsrw         17, 14, 15");
2237a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2238a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2239a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsrab (void)
2240a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2241a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsrab        17, 14, 15");
2242a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2243a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2244a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsrah (void)
2245a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2246a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsrah        17, 14, 15");
2247a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2248a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2249a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsraw (void)
2250a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2251a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsraw        17, 14, 15");
2252a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2253a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2254a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkuhum (void)
2255a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2256a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkuhum      17, 14, 15");
2257a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2258a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2259a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkuwum (void)
2260a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2261a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkuwum      17, 14, 15");
2262a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2263a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2264a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkuhus (void)
2265a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2266a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkuhus      17, 14, 15");
2267a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2268a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2269a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkuwus (void)
2270a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2271a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkuwus      17, 14, 15");
2272a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2273a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2274a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkshus (void)
2275a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2276a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkshus      17, 14, 15");
2277a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2278a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2279a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkswus (void)
2280a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2281a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkswus      17, 14, 15");
2282a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2283a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2284a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkshss (void)
2285a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2286a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkshss      17, 14, 15");
2287a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2288a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2289a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkswss (void)
2290a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2291a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkswss      17, 14, 15");
2292a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2293a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2294a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vpkpx (void)
2295a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2296a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vpkpx        17, 14, 15");
2297a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2298a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2299a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmrghb (void)
2300a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2301a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmrghb       17, 14, 15");
2302a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2303a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2304a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmrghh (void)
2305a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2306a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmrghh       17, 14, 15");
2307a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2308a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2309a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmrghw (void)
2310a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2311a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmrghw       17, 14, 15");
2312a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2313a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2314a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmrglb (void)
2315a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2316a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmrglb       17, 14, 15");
2317a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2318a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2319a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmrglh (void)
2320a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2321a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmrglh       17, 14, 15");
2322a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2323a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2324a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmrglw (void)
2325a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2326a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmrglw       17, 14, 15");
2327a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2328a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2329a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vslo (void)
2330a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2331a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vslo         17, 14, 15");
2332a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2333a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2334a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsro (void)
2335a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2336a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsro         17, 14, 15");
2337a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2338a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2339a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_al_ops_two[] = {
2340a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vand            , "        vand", },
2341a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vor             , "         vor", },
2342a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vxor            , "        vxor", },
2343a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vandc           , "       vandc", },
2344a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vnor            , "        vnor", },
2345a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vrlb            , "        vrlb", },
2346a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vrlh            , "        vrlh", },
2347a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vrlw            , "        vrlw", },
2348a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vslb            , "        vslb", },
2349a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vslh            , "        vslh", },
2350a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vslw            , "        vslw", },
2351a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsrb            , "        vsrb", },
2352a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsrh            , "        vsrh", },
2353a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsrw            , "        vsrw", },
2354a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsrab           , "       vsrab", },
2355a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsrah           , "       vsrah", },
2356a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsraw           , "       vsraw", },
2357a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkuhum         , "     vpkuhum", },
2358a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkuwum         , "     vpkuwum", },
2359a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkuhus         , "     vpkuhus", },
2360a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkuwus         , "     vpkuwus", },
2361a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkshus         , "     vpkshus", },
2362a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkswus         , "     vpkswus", },
2363a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkshss         , "     vpkshss", },
2364a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkswss         , "     vpkswss", },
2365a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vpkpx           , "       vpkpx", },
2366a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmrghb          , "      vmrghb", },
2367a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmrghh          , "      vmrghh", },
2368a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmrghw          , "      vmrghw", },
2369a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmrglb          , "      vmrglb", },
2370a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmrglh          , "      vmrglh", },
2371a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmrglw          , "      vmrglw", },
2372a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vslo            , "        vslo", },
2373a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsro            , "        vsro", },
2374a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2375a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2376a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2377a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2378a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2379a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vupkhsb (void)
2380a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2381a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vupkhsb      17, 14");
2382a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2383a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2384a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vupkhsh (void)
2385a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2386a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vupkhsh      17, 14");
2387a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2388a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2389a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vupkhpx (void)
2390a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2391a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vupkhpx      17, 14");
2392a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2393a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2394a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vupklsb (void)
2395a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2396a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vupklsb      17, 14");
2397a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2398a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2399a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vupklsh (void)
2400a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2401a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vupklsh      17, 14");
2402a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2403a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2404a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vupklpx (void)
2405a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2406a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vupklpx      17, 14");
2407a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2408a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2409a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_al_ops_one[] = {
2410a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vupkhsb         , "     vupkhsb", },
2411a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vupkhsh         , "     vupkhsh", },
2412a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vupkhpx         , "     vupkhpx", },
2413a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vupklsb         , "     vupklsb", },
2414a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vupklsh         , "     vupklsh", },
2415a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vupklpx         , "     vupklpx", },
2416a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2417a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2418a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2419a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2420a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2421a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtub (void)
2422a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2423a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtub     17, 14, 15");
2424a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2425a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2426a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtuh (void)
2427a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2428a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtuh     17, 14, 15");
2429a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2430a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2431a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtuw (void)
2432a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2433a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtuw     17, 14, 15");
2434a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2435a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2436a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtsb (void)
2437a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2438a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtsb     17, 14, 15");
2439a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2440a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2441a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtsh (void)
2442a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2443a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtsh     17, 14, 15");
2444a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2445a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2446a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtsw (void)
2447a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2448a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtsw     17, 14, 15");
2449a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2450a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2451a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpequb (void)
2452a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2453a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpequb     17, 14, 15");
2454a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2455a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2456a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpequh (void)
2457a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2458a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpequh     17, 14, 15");
2459a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2460a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2461a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpequw (void)
2462a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2463a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpequw     17, 14, 15");
2464a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2465a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2466a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_ac_ops_two[] = {
2467a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtub        , "    vcmpgtub", },
2468a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtuh        , "    vcmpgtuh", },
2469a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtuw        , "    vcmpgtuw", },
2470a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtsb        , "    vcmpgtsb", },
2471a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtsh        , "    vcmpgtsh", },
2472a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtsw        , "    vcmpgtsw", },
2473a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpequb        , "    vcmpequb", },
2474a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpequh        , "    vcmpequh", },
2475a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpequw        , "    vcmpequw", },
2476a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2477a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2478a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2479a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2480a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2481a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtub_ (void)
2482a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2483a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtub.    17, 14, 15");
2484a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2485a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2486a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtuh_ (void)
2487a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2488a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtuh.    17, 14, 15");
2489a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2490a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2491a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtuw_ (void)
2492a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2493a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtuw.    17, 14, 15");
2494a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2495a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2496a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtsb_ (void)
2497a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2498a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtsb.    17, 14, 15");
2499a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2500a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2501a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtsh_ (void)
2502a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2503a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtsh.    17, 14, 15");
2504a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2505a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2506a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtsw_ (void)
2507a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2508a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtsw.    17, 14, 15");
2509a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2510a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2511a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpequb_ (void)
2512a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2513a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpequb.    17, 14, 15");
2514a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2515a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2516a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpequh_ (void)
2517a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2518a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpequh.    17, 14, 15");
2519a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2520a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2521a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpequw_ (void)
2522a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2523a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpequw.    17, 14, 15");
2524a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2525a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2526a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_acr_ops_two[] = {
2527a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtub_       , "   vcmpgtub.", },
2528a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtuh_       , "   vcmpgtuh.", },
2529a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtuw_       , "   vcmpgtuw.", },
2530a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtsb_       , "   vcmpgtsb.", },
2531a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtsh_       , "   vcmpgtsh.", },
2532a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtsw_       , "   vcmpgtsw.", },
2533a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpequb_       , "   vcmpequb.", },
2534a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpequh_       , "   vcmpequh.", },
2535a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpequw_       , "   vcmpequw.", },
2536a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2537a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2538a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2539a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2540a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2541a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsl (void)
2542a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2543a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsl          17, 14, 15");
2544a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2545a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2546a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsr (void)
2547a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2548a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsr          17, 14, 15");
2549a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2550a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
255157778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vspltb (void);
25528a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vspltb", "vspltb       17, 14, 0");
255357778621b9d85c82fcb5185ba146add1715c5432sewardj
255457778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vsplth (void);
25558a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vsplth", "vsplth       17, 14, 0");
255657778621b9d85c82fcb5185ba146add1715c5432sewardj
255757778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vspltw (void);
25588a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vspltw", "vspltw       17, 14, 0");
255957778621b9d85c82fcb5185ba146add1715c5432sewardj
256057778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vspltisb (void);
25618a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vspltisb", "vspltisb       17, 0");
256257778621b9d85c82fcb5185ba146add1715c5432sewardj
256357778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vspltish (void);
25648a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vspltish", "vspltish       17, 0");
256557778621b9d85c82fcb5185ba146add1715c5432sewardj
256657778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vspltisw (void);
25678a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vspltisw", "vspltisw       17, 0");
256857778621b9d85c82fcb5185ba146add1715c5432sewardj
256957778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vsldoi (void);
25708a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vsldoi", "vsldoi       17, 14, 15, 0");
2571a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
257205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_lvsl (void)
257305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
257405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("lvsl         17, 14, 15");
257505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
257605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
257705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_lvsr (void)
257805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
257905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("lvsr         17, 14, 15");
258005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
258105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
2582a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_av_int_ops_spe[] = {
2583a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsl             , "         vsl", },
2584a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsr             , "         vsr", },
2585a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vspltb          , "      vspltb", },
2586a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsplth          , "      vsplth", },
2587a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vspltw          , "      vspltw", },
2588a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vspltisb        , "    vspltisb", },
2589a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vspltish        , "    vspltish", },
2590a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vspltisw        , "    vspltisw", },
2591a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsldoi          , "      vsldoi", },
259205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_lvsl            , "        lvsl", },
259305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_lvsr            , "        lvsr", },
2594a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2595a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2596a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2597a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2598a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
259905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_lvebx (void)
260005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
260105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("lvebx        17,14,15");
260205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
260305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
260405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_lvehx (void)
260505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
260605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("lvehx        17,14,15");
260705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
260805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
260905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_lvewx (void)
261005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
261105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("lvewx        17,14,15");
261205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
261305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
261405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_lvx (void)
261505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
261605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("lvx          17,14,15");
261705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
261805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
261905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic test_t tests_ald_ops_two[] = {
262005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_lvebx           , "       lvebx", },
262105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_lvehx           , "       lvehx", },
262205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_lvewx           , "       lvewx", },
262305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_lvx             , "         lvx", },
262405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { NULL,                   NULL,           },
262505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion};
262605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif /* defined (HAS_ALTIVEC) */
262705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
262805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if defined (HAS_ALTIVEC)
262905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_stvebx (void)
263005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
263105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("stvebx       14,15,16");
263205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
263305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
263405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_stvehx (void)
263505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
263605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("stvehx       14,15,16");
263705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
263805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
263905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_stvewx (void)
264005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
264105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("stvewx       14,15,16");
264205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
264305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
264405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_stvx (void)
264505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
264605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    __asm__ __volatile__ ("stvx         14,15,16");
264705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
264805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
264905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic test_t tests_ast_ops_three[] = {
265005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_stvebx          , "      stvebx", },
265105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_stvehx          , "      stvehx", },
265205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_stvewx          , "      stvewx", },
265305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { &test_stvx            , "        stvx", },
265405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    { NULL,                   NULL,           },
265505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion};
265605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif /* defined (HAS_ALTIVEC) */
265705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
265805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if defined (HAS_ALTIVEC)
265905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if 0
2660a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmaddfp (void)
2661a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2662a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmaddfp      17, 14, 15, 16");
2663a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2664a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2665a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vnmsubfp (void)
2666a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2667a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vnmsubfp     17, 14, 15, 16");
2668a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
266905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif
2670a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2671a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_afa_ops_three[] = {
267205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion//    { &test_vmaddfp         , "     vmaddfp", },   // TODO: Not yet supported
267305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion//    { &test_vnmsubfp        , "    vnmsubfp", },   // TODO: Not yet supported
2674a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2675a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2676a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2677a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2678a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2679a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vaddfp (void)
2680a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2681a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vaddfp       17, 14, 15");
2682a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2683a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2684a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vsubfp (void)
2685a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2686a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vsubfp       17, 14, 15");
2687a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2688a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2689a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vmaxfp (void)
2690a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2691a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vmaxfp       17, 14, 15");
2692a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2693a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2694a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vminfp (void)
2695a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2696a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vminfp       17, 14, 15");
2697a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2698a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2699a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_afa_ops_two[] = {
2700a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vaddfp          , "      vaddfp", },
2701a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vsubfp          , "      vsubfp", },
2702a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vmaxfp          , "      vmaxfp", },
2703a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vminfp          , "      vminfp", },
2704a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2705a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2706a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2707a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2708a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2709a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrfin (void)
2710a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2711a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrfin        17, 14");
2712a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2713a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2714a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrfiz (void)
2715a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2716a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrfiz        17, 14");
2717a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2718a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2719a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrfip (void)
2720a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2721a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrfip        17, 14");
2722a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2723a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2724a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrfim (void)
2725a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2726a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrfim        17, 14");
2727a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2728a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2729a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrefp (void)
2730a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2731a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrefp        17, 14");
2732a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2733a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2734a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vrsqrtefp (void)
2735a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2736a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vrsqrtefp    17, 14");
2737a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2738a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
273905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if 0   // TODO: Not yet supported
2740a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vlogefp (void)
2741a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2742a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vlogefp      17, 14");
2743a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2744a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2745a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vexptefp (void)
2746a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2747a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vexptefp     17, 14");
2748a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
274905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif
2750a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2751a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_afa_ops_one[] = {
27528f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { &test_vrfin           , "       vrfin", },
27538f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { &test_vrfiz           , "       vrfiz", },
27548f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { &test_vrfip           , "       vrfip", },
27558f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { &test_vrfim           , "       vrfim", },
2756a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vrefp           , "       vrefp", },
2757a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vrsqrtefp       , "   vrsqrtefp", },
2758b3eb91bab95bd2d521848510e0b59b4daa49fe73cerion    //    { &test_vlogefp         , "     vlogefp", },   // TODO: Not yet supported
2759b3eb91bab95bd2d521848510e0b59b4daa49fe73cerion    //    { &test_vexptefp        , "    vexptefp", },   // TODO: Not yet supported
2760a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2761a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2762a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2763a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2764a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2765a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtfp (void)
2766a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2767a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtfp     17, 14, 15");
2768a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2769a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2770a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpeqfp (void)
2771a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2772a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpeqfp     17, 14, 15");
2773a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2774a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2775a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgefp (void)
2776a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2777a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgefp     17, 14, 15");
2778a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2779a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2780a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpbfp (void)
2781a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2782a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpbfp      17, 14, 15");
2783a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2784a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2785a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_afc_ops_two[] = {
2786a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtfp        , "    vcmpgtfp", },
2787a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpeqfp        , "    vcmpeqfp", },
2788a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgefp        , "    vcmpgefp", },
2789a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpbfp         , "     vcmpbfp", },
2790a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2791a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2792a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2793a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2794a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
2795a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgtfp_ (void)
2796a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2797a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgtfp.    17, 14, 15");
2798a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2799a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2800a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpeqfp_ (void)
2801a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2802a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpeqfp.    17, 14, 15");
2803a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2804a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2805a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpgefp_ (void)
2806a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2807a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpgefp.    17, 14, 15");
2808a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2809a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2810a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_vcmpbfp_ (void)
2811a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2812a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("vcmpbfp.     17, 14, 15");
2813a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2814a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2815a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_afcr_ops_two[] = {
2816a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgtfp_       , "   vcmpgtfp.", },
2817a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpeqfp_       , "   vcmpeqfp.", },
2818a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpgefp_       , "   vcmpgefp.", },
2819a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_vcmpbfp_        , "    vcmpbfp.", },
2820a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
2821a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
2822a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
2823a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
28248f5fc19da719edcd8dfca920837bde7ce1d3accacerion#if defined (HAS_ALTIVEC)
282557778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vcfux (void);
28268a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vcfux", "vcfux        17, 14, 0");
282757778621b9d85c82fcb5185ba146add1715c5432sewardj
282857778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vcfsx (void);
28298a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vcfsx", "vcfsx        17, 14, 0");
283057778621b9d85c82fcb5185ba146add1715c5432sewardj
283157778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vctuxs (void);
28328a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vctuxs", "vctuxs        17, 14, 0");
283357778621b9d85c82fcb5185ba146add1715c5432sewardj
283457778621b9d85c82fcb5185ba146add1715c5432sewardjextern void test_vctsxs (void);
28358a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerionASSEMBLY_FUNC("test_vctsxs", "vctsxs        17, 14, 0");
28368f5fc19da719edcd8dfca920837bde7ce1d3accacerion
28378f5fc19da719edcd8dfca920837bde7ce1d3accacerionstatic test_t tests_av_float_ops_spe[] = {
28388f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { &test_vcfux           , "       vcfux", },
28398f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { &test_vcfsx           , "       vcfsx", },
28408f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { &test_vctuxs          , "      vctuxs", },
28418f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { &test_vctsxs          , "      vctsxs", },
28428f5fc19da719edcd8dfca920837bde7ce1d3accacerion    { NULL,                   NULL,           },
28438f5fc19da719edcd8dfca920837bde7ce1d3accacerion};
28448f5fc19da719edcd8dfca920837bde7ce1d3accacerion#endif /* defined (HAS_ALTIVEC) */
28458f5fc19da719edcd8dfca920837bde7ce1d3accacerion
2846a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (IS_PPC405)
2847a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchw (void)
2848a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2849a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchw       17, 14, 15");
2850a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2851a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2852a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwo (void)
2853a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2854a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwo      17, 14, 15");
2855a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2856a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2857a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchws (void)
2858a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2859a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchws      17, 14, 15");
2860a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2861a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2862a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwso (void)
2863a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2864a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwso     17, 14, 15");
2865a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2866a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2867a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwsu (void)
2868a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2869a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwsu     17, 14, 15");
2870a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2871a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2872a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwsuo (void)
2873a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2874a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwsuo    17, 14, 15");
2875a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2876a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2877a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwu (void)
2878a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2879a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwu      17, 14, 15");
2880a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2881a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2882a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwuo (void)
2883a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2884a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwuo     17, 14, 15");
2885a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2886a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2887a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhw (void)
2888a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2889a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhw       17, 14, 15");
2890a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2891a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2892a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwo (void)
2893a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2894a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwo      17, 14, 15");
2895a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2896a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2897a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhws (void)
2898a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2899a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhws      17, 14, 15");
2900a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2901a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2902a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwso (void)
2903a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2904a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwso     17, 14, 15");
2905a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2906a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2907a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwsu (void)
2908a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2909a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwsu     17, 14, 15");
2910a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2911a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2912a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwsuo (void)
2913a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2914a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwsuo    17, 14, 15");
2915a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2916a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2917a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwu (void)
2918a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2919a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwu      17, 14, 15");
2920a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2921a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2922a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwuo (void)
2923a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2924a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwuo     17, 14, 15");
2925a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2926a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2927a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhw (void)
2928a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2929a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhw       17, 14, 15");
2930a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2931a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2932a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwo (void)
2933a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2934a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwo      17, 14, 15");
2935a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2936a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2937a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhws (void)
2938a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2939a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhws      17, 14, 15");
2940a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2941a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2942a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwso (void)
2943a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2944a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwso     17, 14, 15");
2945a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2946a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2947a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwsu (void)
2948a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2949a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwsu     17, 14, 15");
2950a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2951a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2952a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwsuo (void)
2953a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2954a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwsuo    17, 14, 15");
2955a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2956a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2957a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwu (void)
2958a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2959a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwu      17, 14, 15");
2960a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2961a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2962a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwuo (void)
2963a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2964a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwuo     17, 14, 15");
2965a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2966a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2967a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulchw (void)
2968a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2969a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulchw       17, 14, 15");
2970a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2971a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2972a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulchwu (void)
2973a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2974a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulchwu      17, 14, 15");
2975a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2976a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2977a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulhhw (void)
2978a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2979a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulhhw       17, 14, 15");
2980a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2981a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2982a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulhhwu (void)
2983a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2984a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulhhwu      17, 14, 15");
2985a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2986a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2987a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mullhw (void)
2988a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2989a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mullhw       17, 14, 15");
2990a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2991a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2992a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mullhwu (void)
2993a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2994a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mullhwu      17, 14, 15");
2995a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
2996a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
2997a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmacchw (void)
2998a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
2999a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmacchw      17, 14, 15");
3000a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3001a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3002a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmacchwo (void)
3003a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3004a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmacchwo     17, 14, 15");
3005a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3006a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3007a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmacchws (void)
3008a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3009a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmacchws     17, 14, 15");
3010a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3011a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3012a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmacchwso (void)
3013a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3014a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmacchwso    17, 14, 15");
3015a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3016a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3017a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmachhw (void)
3018a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3019a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmachhw      17, 14, 15");
3020a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3021a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3022a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmachhwo (void)
3023a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3024a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmachhwo     17, 14, 15");
3025a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3026a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3027a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmachhws (void)
3028a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3029a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmachhws     17, 14, 15");
3030a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3031a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3032a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmachhwso (void)
3033a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3034a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmachhwso    17, 14, 15");
3035a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3036a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3037a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmaclhw (void)
3038a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3039a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmaclhw      17, 14, 15");
3040a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3041a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3042a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmaclhwo (void)
3043a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3044a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmaclhwo     17, 14, 15");
3045a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3046a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3047a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmaclhws (void)
3048a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3049a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmaclhws     17, 14, 15");
3050a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3051a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3052a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmaclhwso (void)
3053a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3054a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmaclhwso    17, 14, 15");
3055a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3056a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3057a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_p4m_ops_two[] = {
3058a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchw          , "      macchw", },
3059a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwo         , "     macchwo", },
3060a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchws         , "     macchws", },
3061a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwso        , "    macchwso", },
3062a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwsu        , "    macchwsu", },
3063a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwsuo       , "   macchwsuo", },
3064a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwu         , "     macchwu", },
3065a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwuo        , "    macchwuo", },
3066a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhw          , "      machhw", },
3067a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwo         , "     machhwo", },
3068a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhws         , "     machhws", },
3069a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwso        , "    machhwso", },
3070a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwsu        , "    machhwsu", },
3071a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwsuo       , "   machhwsuo", },
3072a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwu         , "     machhwu", },
3073a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwuo        , "    machhwuo", },
3074a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhw          , "      maclhw", },
3075a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwo         , "     maclhwo", },
3076a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhws         , "     maclhws", },
3077a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwso        , "    maclhwso", },
3078a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwsu        , "    maclhwsu", },
3079a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwsuo       , "   maclhwsuo", },
3080a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwu         , "     maclhwu", },
3081a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwuo        , "    maclhwuo", },
3082a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulchw          , "      mulchw", },
3083a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulchwu         , "     mulchwu", },
3084a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulhhw          , "      mulhhw", },
3085a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulhhwu         , "     mulhhwu", },
3086a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mullhw          , "      mullhw", },
3087a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mullhwu         , "     mullhwu", },
3088a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmacchw         , "     nmacchw", },
3089a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmacchwo        , "    nmacchwo", },
3090a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmacchws        , "    nmacchws", },
3091a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmacchwso       , "   nmacchwso", },
3092a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmachhw         , "     nmachhw", },
3093a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmachhwo        , "    nmachhwo", },
3094a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmachhws        , "    nmachhws", },
3095a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmachhwso       , "   nmachhwso", },
3096a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmaclhw         , "     nmaclhw", },
3097a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmaclhwo        , "    nmaclhwo", },
3098a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmaclhws        , "    nmaclhws", },
3099a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmaclhwso       , "   nmaclhwso", },
3100a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
3101a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
3102a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (IS_PPC405) */
3103a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3104a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (IS_PPC405)
3105a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchw_ (void)
3106a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3107a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchw.      17, 14, 15");
3108a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3109a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3110a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwo_ (void)
3111a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3112a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwo.     17, 14, 15");
3113a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3114a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3115a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchws_ (void)
3116a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3117a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchws.     17, 14, 15");
3118a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3119a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3120a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwso_ (void)
3121a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3122a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwso.    17, 14, 15");
3123a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3124a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3125a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwsu_ (void)
3126a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3127a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwsu.    17, 14, 15");
3128a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3129a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3130a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwsuo_ (void)
3131a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3132a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwsuo.   17, 14, 15");
3133a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3134a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3135a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwu_ (void)
3136a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3137a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwu.     17, 14, 15");
3138a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3139a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3140a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_macchwuo_ (void)
3141a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3142a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("macchwuo.    17, 14, 15");
3143a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3144a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3145a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhw_ (void)
3146a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3147a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhw.      17, 14, 15");
3148a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3149a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3150a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwo_ (void)
3151a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3152a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwo.     17, 14, 15");
3153a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3154a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3155a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhws_ (void)
3156a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3157a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhws.     17, 14, 15");
3158a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3159a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3160a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwso_ (void)
3161a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3162a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwso.    17, 14, 15");
3163a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3164a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3165a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwsu_ (void)
3166a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3167a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwsu.    17, 14, 15");
3168a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3169a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3170a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwsuo_ (void)
3171a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3172a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwsuo.   17, 14, 15");
3173a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3174a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3175a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwu_ (void)
3176a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3177a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwu.     17, 14, 15");
3178a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3179a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3180a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_machhwuo_ (void)
3181a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3182a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("machhwuo.    17, 14, 15");
3183a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3184a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3185a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhw_ (void)
3186a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3187a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhw.      17, 14, 15");
3188a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3189a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3190a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwo_ (void)
3191a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3192a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwo.     17, 14, 15");
3193a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3194a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3195a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhws_ (void)
3196a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3197a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhws.     17, 14, 15");
3198a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3199a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3200a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwso_ (void)
3201a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3202a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwso.    17, 14, 15");
3203a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3204a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3205a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwsu_ (void)
3206a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3207a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwsu.    17, 14, 15");
3208a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3209a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3210a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwsuo_ (void)
3211a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3212a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwsuo.   17, 14, 15");
3213a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3214a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3215a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwu_ (void)
3216a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3217a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwu.     17, 14, 15");
3218a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3219a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3220a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_maclhwuo_ (void)
3221a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3222a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("maclhwuo.    17, 14, 15");
3223a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3224a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3225a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulchw_ (void)
3226a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3227a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulchw.      17, 14, 15");
3228a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3229a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3230a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulchwu_ (void)
3231a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3232a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulchwu.     17, 14, 15");
3233a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3234a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3235a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulhhw_ (void)
3236a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3237a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulhhw.      17, 14, 15");
3238a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3239a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3240a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mulhhwu_ (void)
3241a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3242a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mulhhwu.     17, 14, 15");
3243a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3244a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3245a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mullhw_ (void)
3246a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3247a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mullhw.      17, 14, 15");
3248a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3249a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3250a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_mullhwu_ (void)
3251a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3252a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("mullhwu.     17, 14, 15");
3253a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3254a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3255a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmacchw_ (void)
3256a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3257a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmacchw.     17, 14, 15");
3258a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3259a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3260a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmacchwo_ (void)
3261a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3262a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmacchwo.    17, 14, 15");
3263a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3264a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3265a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmacchws_ (void)
3266a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3267a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmacchws.    17, 14, 15");
3268a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3269a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3270a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmacchwso_ (void)
3271a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3272a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmacchwso.   17, 14, 15");
3273a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3274a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3275a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmachhw_ (void)
3276a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3277a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmachhw.     17, 14, 15");
3278a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3279a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3280a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmachhwo_ (void)
3281a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3282a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmachhwo.    17, 14, 15");
3283a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3284a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3285a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmachhws_ (void)
3286a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3287a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmachhws.    17, 14, 15");
3288a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3289a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3290a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmachhwso_ (void)
3291a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3292a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmachhwso.   17, 14, 15");
3293a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3294a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3295a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmaclhw_ (void)
3296a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3297a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmaclhw.     17, 14, 15");
3298a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3299a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3300a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmaclhwo_ (void)
3301a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3302a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmaclhwo.    17, 14, 15");
3303a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3304a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3305a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmaclhws_ (void)
3306a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3307a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmaclhws.    17, 14, 15");
3308a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3309a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3310a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_nmaclhwso_ (void)
3311a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3312a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    __asm__ __volatile__ ("nmaclhwso.   17, 14, 15");
3313a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3314a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3315a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_t tests_p4mc_ops_two[] = {
3316a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchw_         , "     macchw.", },
3317a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwo_        , "    macchwo.", },
3318a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchws_        , "    macchws.", },
3319a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwso_       , "   macchwso.", },
3320a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwsu_       , "   macchwsu.", },
3321a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwsuo_      , "  macchwsuo.", },
3322a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwu_        , "    macchwu.", },
3323a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_macchwuo_       , "   macchwuo.", },
3324a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhw_         , "     machhw.", },
3325a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwo_        , "    machhwo.", },
3326a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhws_        , "    machhws.", },
3327a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwso_       , "   machhwso.", },
3328a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwsu_       , "   machhwsu.", },
3329a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwsuo_      , "  machhwsuo.", },
3330a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwu_        , "    machhwu.", },
3331a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_machhwuo_       , "   machhwuo.", },
3332a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhw_         , "     maclhw.", },
3333a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwo_        , "    maclhwo.", },
3334a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhws_        , "    maclhws.", },
3335a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwso_       , "   maclhwso.", },
3336a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwsu_       , "   maclhwsu.", },
3337a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwsuo_      , "  maclhwsuo.", },
3338a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwu_        , "    maclhwu.", },
3339a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_maclhwuo_       , "   maclhwuo.", },
3340a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulchw_         , "     mulchw.", },
3341a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulchwu_        , "    mulchwu.", },
3342a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulhhw_         , "     mulhhw.", },
3343a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mulhhwu_        , "    mulhhwu.", },
3344a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mullhw_         , "     mullhw.", },
3345a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_mullhwu_        , "    mullhwu.", },
3346a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmacchw_        , "    nmacchw.", },
3347a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmacchwo_       , "   nmacchwo.", },
3348a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmacchws_       , "   nmacchws.", },
3349a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmacchwso_      , "  nmacchwso.", },
3350a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmachhw_        , "    nmachhw.", },
3351a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmachhwo_       , "   nmachhwo.", },
3352a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmachhws_       , "   nmachhws.", },
3353a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmachhwso_      , "  nmachhwso.", },
3354a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmaclhw_        , "    nmaclhw.", },
3355a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmaclhwo_       , "   nmaclhwo.", },
3356a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmaclhws_       , "   nmaclhws.", },
3357a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { &test_nmaclhwso_      , "  nmaclhwso.", },
3358a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,           },
3359a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
3360a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (IS_PPC405) */
3361a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3362a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_table_t all_tests[] = {
3363a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3364a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ia_ops_two      ,
3365a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer arith insns with two args",
3366a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00010102,
3367a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3368a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3369a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_iar_ops_two     ,
3370a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer arith insns with two args with flags update",
3371a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010102,
3372a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3373a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3374a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_iac_ops_two     ,
3375a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer arith insns with two args and carry",
3376a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x02010102,
3377a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3378a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3379a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_iacr_ops_two    ,
3380a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer arith insns with two args and carry with flags update",
3381a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x03010102,
3382a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3383a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3384a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_il_ops_two      ,
3385a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer logical insns with two args",
3386a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00010202,
3387a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3388a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3389a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ilr_ops_two     ,
3390a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer logical insns with two args with flags update",
3391a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010202,
3392a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3393a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3394a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_icr_ops_two     ,
3395a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer compare insns (two args)",
3396a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010304,
3397a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3398a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3399a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_icr_ops_two_i16 ,
3400a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer compare with immediate insns (two args)",
3401a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010305,
3402a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3403a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3404a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ia_ops_two_i16  ,
3405a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer arith insns\n    with one register + one 16 bits immediate args",
3406a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00010106,
3407a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3408a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3409a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_iar_ops_two_i16 ,
3410a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer arith insns\n    with one register + one 16 bits immediate args with flags update",
3411a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010106,
3412a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3413a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3414a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_il_ops_two_i16  ,
3415a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer logical insns\n    with one register + one 16 bits immediate args",
3416a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00010206,
3417a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3418a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3419a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ilr_ops_two_i16 ,
3420a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer logical insns\n    with one register + one 16 bits immediate args with flags update",
3421a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010206,
3422a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3423a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3424a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_crl_ops_two     ,
3425a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC condition register logical insns - two operands",
3426a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010202,
3427a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3428a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3429a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_iac_ops_one     ,
3430a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer arith insns with one arg and carry",
3431a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x02010101,
3432a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3433a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3434a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_iacr_ops_one    ,
3435a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer arith insns with one arg and carry with flags update",
3436a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x03010101,
3437a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3438a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3439a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_il_ops_one      ,
3440a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer logical insns with one arg",
3441a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00010201,
3442a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3443a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3444a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ilr_ops_one     ,
3445a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer logical insns with one arg with flags update",
3446a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010201,
3447a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3448a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3449a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_il_ops_spe      ,
3450a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC logical insns with special forms",
3451a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00010207,
3452a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3453a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3454a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ilr_ops_spe     ,
3455a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC logical insns with special forms with flags update",
3456a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01010207,
3457a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3458a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3459a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ild_ops_two_i16 ,
3460a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer load insns\n    with one register + one 16 bits immediate args with flags update",
3461a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00010508,
3462a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3463a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3464a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ild_ops_two     ,
3465a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer load insns with two register args",
3466a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00010509,
3467a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3468a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3469a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ist_ops_three_i16,
3470a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer store insns\n    with one register + one 16 bits immediate args with flags update",
3471a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x0001050a,
3472a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3473a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3474a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ist_ops_three   ,
3475a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC integer store insns with three register args",
3476a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x0001050b,
3477a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3478a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3479a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3480a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_fa_ops_three    ,
3481a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point arith insns with three args",
3482a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00020103,
3483a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3484a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3485a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3486a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3487c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        tests_far_ops_three    ,
3488a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point arith insns\n    with three args with flags update",
3489a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01020103,
3490a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3491a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3492a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3493a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3494a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_fa_ops_two      ,
3495a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point arith insns with two args",
3496a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00020102,
3497a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3498a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3499a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3500a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3501a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_far_ops_two     ,
3502a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point arith insns\n    with two args with flags update",
3503a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01020102,
3504a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3505a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3506a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3507a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3508a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_fcr_ops_two     ,
3509a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point compare insns (two args)",
3510a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01020304,
3511a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3512a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3513a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3514a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3515a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_fa_ops_one      ,
3516a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point arith insns with one arg",
3517a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00020101,
3518a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3519a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3520a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3521a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3522a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_far_ops_one     ,
3523a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point arith insns\n    with one arg with flags update",
3524a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01020101,
3525a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3526a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3527a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3528a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3529a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_fl_ops_spe      ,
3530a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point status register manipulation insns",
3531a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00020207,
3532a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3533a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3534a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
3535a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3536a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_flr_ops_spe     ,
3537a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC floating point status register manipulation insns\n  with flags update",
3538a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01020207,
3539a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3540a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
3541c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if !defined (NO_FLOAT)
3542c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    {
3543c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        tests_fld_ops_two_i16 ,
3544c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        "PPC float load insns\n    with one register + one 16 bits immediate args with flags update",
3545c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        0x00020508,
3546c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    },
3547c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif /* !defined (NO_FLOAT) */
3548c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if !defined (NO_FLOAT)
3549c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    {
3550c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        tests_fld_ops_two     ,
3551c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        "PPC float load insns with two register args",
3552c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        0x00020509,
3553c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    },
3554c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif /* !defined (NO_FLOAT) */
3555c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if !defined (NO_FLOAT)
3556c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    {
3557c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        tests_fst_ops_three_i16,
3558c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        "PPC float store insns\n    with one register + one 16 bits immediate args with flags update",
3559c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        0x0002050a,
3560c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    },
3561c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif /* !defined (NO_FLOAT) */
3562c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#if !defined (NO_FLOAT)
3563c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    {
3564c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        tests_fst_ops_three   ,
3565c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        "PPC float store insns with three register args",
3566c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion        0x0002050b,
3567c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    },
3568c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif /* !defined (NO_FLOAT) */
3569a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3570a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3571a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_aa_ops_three    ,
3572a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC altivec integer arith insns with three args",
3573a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00040103,
3574a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3575a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3576a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3577a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3578a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_al_ops_three    ,
3579a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC altivec integer logical insns with three args",
3580a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00040203,
3581a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3582a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3583a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3584a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3585a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_aa_ops_two      ,
3586a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC altivec integer arith insns with two args",
3587a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00040102,
3588a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3589a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3590a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3591a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3592a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_al_ops_two      ,
3593a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC altivec integer logical insns with two args",
3594a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00040202,
3595a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3596a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3597a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3598a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3599a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_al_ops_one      ,
3600a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC altivec integer logical insns with one arg",
3601a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00040201,
3602a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3603a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3604a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3605a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3606a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_ac_ops_two      ,
3607a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "Altivec integer compare insns",
3608a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00040302,
3609a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3610a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3611a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3612a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3613a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_acr_ops_two     ,
3614a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "Altivec integer compare insns with flags update",
3615a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01040302,
3616a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3617a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3618a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3619a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3620a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_av_int_ops_spe  ,
3621a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "Altivec integer special insns",
3622a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00040207,
3623a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3624a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3625a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3626a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
362705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion        tests_ald_ops_two     ,
362805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion        "Altivec load insns with two register args",
362905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion        0x00040509,
363005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    },
363105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif /* defined (HAS_ALTIVEC) */
363205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if defined (HAS_ALTIVEC)
363305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    {
363405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion        tests_ast_ops_three   ,
363505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion        "Altivec store insns with three register args",
363605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion        0x0004050b,
363705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    },
363805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif /* defined (HAS_ALTIVEC) */
363905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if defined (HAS_ALTIVEC)
364005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion    {
3641a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_afa_ops_three   ,
3642a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "Altivec floating point arith insns with three args",
3643a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00050103,
3644a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3645a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3646a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3647a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3648a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_afa_ops_two     ,
3649a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "Altivec floating point arith insns with two args",
3650a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00050102,
3651a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3652a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3653a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3654a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3655a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_afa_ops_one     ,
3656a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "Altivec floating point arith insns with one arg",
3657a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00050101,
3658a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3659a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3660a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3661a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3662a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_afc_ops_two     ,
3663a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "Altivec floating point compare insns",
3664a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00050302,
3665a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3666a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
3667a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3668a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3669a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_afcr_ops_two    ,
3670a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "Altivec floating point compare insns with flags update",
3671a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01050302,
3672a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3673a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
36748f5fc19da719edcd8dfca920837bde7ce1d3accacerion#if defined (HAS_ALTIVEC)
36758f5fc19da719edcd8dfca920837bde7ce1d3accacerion    {
36768f5fc19da719edcd8dfca920837bde7ce1d3accacerion        tests_av_float_ops_spe,
36778f5fc19da719edcd8dfca920837bde7ce1d3accacerion        "Altivec float special insns",
36788f5fc19da719edcd8dfca920837bde7ce1d3accacerion        0x00050207,
36798f5fc19da719edcd8dfca920837bde7ce1d3accacerion    },
36808f5fc19da719edcd8dfca920837bde7ce1d3accacerion#endif /* defined (HAS_ALTIVEC) */
3681a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (IS_PPC405)
3682a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3683a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_p4m_ops_two     ,
3684a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC 405 mac insns with three args",
3685a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x00030102,
3686a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3687a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (IS_PPC405) */
3688a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (IS_PPC405)
3689a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    {
3690a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        tests_p4mc_ops_two    ,
3691a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        "PPC 405 mac insns with three args with flags update",
3692a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        0x01030102,
3693a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    },
3694a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (IS_PPC405) */
3695a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    { NULL,                   NULL,               0x00000000, },
3696a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
3697a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3698a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* -------------- END #include "ops-ppc.c" -------------- */
3699a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3700a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic int verbose = 0;
3701a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic int arg_list_size = 0;
3702a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3703a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic double *fargs;
3704a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic int nb_fargs;
3705586fb038935723146cb6950b38911aeb9fc12765cerionstatic int nb_normal_fargs;
3706a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic uint32_t *iargs;
3707a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic int nb_iargs;
3708a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic uint16_t *ii16;
3709a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic int nb_ii16;
3710a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3711a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic vector unsigned int* viargs;
3712a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic int nb_viargs;
3713a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic vector float* vfargs;
3714a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic int nb_vfargs;
3715a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3716a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj//#define TEST_VSCR_SAT
3717a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
3718a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3719a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic inline void register_farg (void *farg,
37208a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion                                  int s, uint16_t _exp, uint64_t mant)
3721a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3722a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint64_t tmp;
3723a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
37248a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant;
3725a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   *(uint64_t *)farg = tmp;
3726a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   AB_DPRINTF("%d %03x %013llx => %016llx %0e\n",
37278a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion              s, _exp, mant, *(uint64_t *)farg, *(double *)farg);
3728a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3729a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3730a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void build_fargs_table (void)
3731a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3732c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   /* Double precision:
3733c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * Sign goes from zero to one               (1 bit)
3734c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * Exponent goes from 0 to ((1 << 12) - 1)  (11 bits)
3735c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * Mantissa goes from 1 to ((1 << 52) - 1)  (52 bits)
3736a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    * + special values:
3737c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * +0.0      : 0 0x000 0x0000000000000 => 0x0000000000000000
3738c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * -0.0      : 1 0x000 0x0000000000000 => 0x8000000000000000
3739c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * +infinity : 0 0x7FF 0x0000000000000 => 0x7FF0000000000000
3740c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * -infinity : 1 0x7FF 0x0000000000000 => 0xFFF0000000000000
3741c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * +QNaN     : 0 0x7FF 0x7FFFFFFFFFFFF => 0x7FF7FFFFFFFFFFFF
3742c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * -QNaN     : 1 0x7FF 0x7FFFFFFFFFFFF => 0xFFF7FFFFFFFFFFFF
3743c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * +SNaN     : 0 0x7FF 0x8000000000000 => 0x7FF8000000000000
3744c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * -SNaN     : 1 0x7FF 0x8000000000000 => 0xFFF8000000000000
3745a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    * (8 values)
3746c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
3747c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * Ref only:
3748c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * Single precision
3749c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * Sign:     1 bit
3750c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * Exponent: 8 bits
3751c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * Mantissa: 23 bits
3752c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * +0.0      : 0 0x00 0x000000 => 0x00000000
3753c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * -0.0      : 1 0x00 0x000000 => 0x80000000
3754c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * +infinity : 0 0xFF 0x000000 => 0x7F800000
3755c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * -infinity : 1 0xFF 0x000000 => 0xFF800000
3756c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * +QNaN     : 0 0xFF 0x3FFFFF => 0x7FBFFFFF
3757c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * -QNaN     : 1 0xFF 0x3FFFFF => 0xFFBFFFFF
3758c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * +SNaN     : 0 0xFF 0x400000 => 0x7FC00000
3759c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion    * -SNaN     : 1 0xFF 0x400000 => 0xFFC00000
3760a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    */
3761a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint64_t mant;
37628a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   uint16_t _exp, e0, e1;
3763a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int s;
3764a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i=0;
3765a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3766586fb038935723146cb6950b38911aeb9fc12765cerion   /* Note: VEX isn't so hot with denormals, so don't bother
37678a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion      testing them: set _exp > 0
3768586fb038935723146cb6950b38911aeb9fc12765cerion   */
3769586fb038935723146cb6950b38911aeb9fc12765cerion
3770a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if ( arg_list_size == 1 ) {   // Large
3771a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      fargs = malloc(200 * sizeof(double));
3772a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (s=0; s<2; s++) {
3773a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (e0=0; e0<2; e0++) {
3774586fb038935723146cb6950b38911aeb9fc12765cerion            for (e1=0x001; ; e1 = ((e1 + 1) << 2) + 6) {
3775a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               if (e1 >= 0x400)
3776a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                  e1 = 0x3fe;
37778a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion               _exp = (e0 << 10) | e1;
3778a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               for (mant = 0x0000000000001ULL; mant < (1ULL << 52);
3779a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                    /* Add 'random' bits */
3780a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                    mant = ((mant + 0x4A6) << 13) + 0x359) {
37818a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion                  register_farg(&fargs[i++], s, _exp, mant);
3782a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               }
3783a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               if (e1 == 0x3fe)
3784a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                  break;
3785a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            }
3786a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
3787a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
3788a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   } else {                      // Default
3789a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      fargs = malloc(16 * sizeof(double));
3790a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (s=0; s<2; s++) {                                // x2
3791a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj//       for (e0=0; e0<2; e0++) {
3792a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            for (e1=0x001; ; e1 = ((e1 + 1) << 13) + 7) {  // x2
3793586fb038935723146cb6950b38911aeb9fc12765cerion//          for (e1=0x001; ; e1 = ((e1 + 1) << 5) + 7) {   // x3
3794a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               if (e1 >= 0x400)
3795a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                  e1 = 0x3fe;
37968a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion//             _exp = (e0 << 10) | e1;
37978a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion               _exp = e1;
3798a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               for (mant = 0x0000000000001ULL; mant < (1ULL << 52);
3799a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                    /* Add 'random' bits */
3800a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                    mant = ((mant + 0x4A6) << 29) + 0x359) {  // x2
38018a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion                  register_farg(&fargs[i++], s, _exp, mant);
3802a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               }
3803a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               if (e1 == 0x3fe)
3804a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                  break;
3805a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            }
3806a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj//       }
3807a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
3808a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
3809a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3810586fb038935723146cb6950b38911aeb9fc12765cerion   /* To iterate over non-special values only */
3811586fb038935723146cb6950b38911aeb9fc12765cerion   nb_normal_fargs = i;
3812586fb038935723146cb6950b38911aeb9fc12765cerion
3813586fb038935723146cb6950b38911aeb9fc12765cerion
3814a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* Special values */
3815a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* +0.0      : 0 0x000 0x0000000000000 */
3816a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 0;
38178a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x000;
3818a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x0000000000000ULL;
38198a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_farg(&fargs[i++], s, _exp, mant);
3820a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* -0.0      : 1 0x000 0x0000000000000 */
3821a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 1;
38228a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x000;
3823a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x0000000000000ULL;
38248a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_farg(&fargs[i++], s, _exp, mant);
3825a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* +infinity : 0 0x7FF 0x0000000000000  */
3826a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 0;
38278a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x7FF;
3828a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x0000000000000ULL;
38298a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_farg(&fargs[i++], s, _exp, mant);
3830a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* -infinity : 1 0x7FF 0x0000000000000 */
3831a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 1;
38328a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x7FF;
3833a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x0000000000000ULL;
38348a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_farg(&fargs[i++], s, _exp, mant);
3835c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   /* +QNaN     : 0 0x7FF 0x7FFFFFFFFFFFF */
3836a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 0;
38378a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x7FF;
3838a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x7FFFFFFFFFFFFULL;
38398a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_farg(&fargs[i++], s, _exp, mant);
3840c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   /* -QNaN     : 1 0x7FF 0x7FFFFFFFFFFFF */
3841a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 1;
38428a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x7FF;
3843a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x7FFFFFFFFFFFFULL;
38448a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_farg(&fargs[i++], s, _exp, mant);
3845c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   /* +SNaN     : 0 0x7FF 0x8000000000000 */
3846a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 0;
38478a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x7FF;
3848a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x8000000000000ULL;
38498a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_farg(&fargs[i++], s, _exp, mant);
3850c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   /* -SNaN     : 1 0x7FF 0x8000000000000 */
3851a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 1;
38528a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x7FF;
3853a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x8000000000000ULL;
38548a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_farg(&fargs[i++], s, _exp, mant);
3855a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   AB_DPRINTF("Registered %d fargs values\n", i);
3856c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
3857a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   nb_fargs = i;
3858a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3859a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3860a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void build_iargs_table (void)
3861a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3862a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint64_t tmp;
3863a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i=0;
3864a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3865a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (arg_list_size == 1) {                   // Large
3866a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      iargs = malloc(400 * sizeof(uint32_t));
3867a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (tmp=0; ; tmp = tmp + 1 + (tmp >> 1)) {
3868a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (tmp >= 0x100000000ULL)
3869a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmp = 0xFFFFFFFF;
38708a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion         iargs[i++] = (uint32_t)tmp;
38718a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion         AB_DPRINTF("val %08x\n", (uint32_t)tmp);
3872a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (tmp == 0xFFFFFFFF)
3873a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            break;
3874a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
3875a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   } else {                                    // Default
3876a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      iargs = malloc(10 * sizeof(uint32_t));
3877a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // for (tmp = 0; ; tmp = 71*tmp + 1 + (tmp>>1)) {  // gives 8
3878a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // for (tmp = 0; ; tmp = 100000*tmp + 1 + (tmp>>1)) {  // gives 4
3879a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (tmp=0; ; tmp = 999999*tmp + 999999) {  // gives 3
3880a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (tmp >= 0x100000000ULL)
3881a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmp = 0xFFFFFFFF;
38828a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion         iargs[i++] = (uint32_t)tmp;
38838a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion         AB_DPRINTF("val %08x\n", (uint32_t)tmp);
3884a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (tmp == 0xFFFFFFFF)
3885a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            break;
3886a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
3887a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
3888a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   AB_DPRINTF("Registered %d iargs values\n", i);
3889a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   nb_iargs = i;
3890a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3891a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3892a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void build_ii16_table (void)
3893a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3894a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t tmp;
3895a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i=0;
3896a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3897a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (arg_list_size == 1) {                   // Large
3898a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ii16 = malloc(200 * sizeof(uint32_t));
3899a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (tmp=0; ; tmp = tmp + 1 + (tmp >> 2)) {
3900a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (tmp >= 0x10000)
3901a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmp = 0xFFFF;
3902a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         ii16[i++] = tmp;
3903a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         AB_DPRINTF("val %08x\n", tmp);
3904a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (tmp == 0xFFFF)
3905a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            break;
3906a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
3907a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   } else {                                    // Default
3908a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ii16 = malloc(10 * sizeof(uint32_t));
3909a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (tmp=0; ; tmp = 999*tmp + 999) {  // gives 3
3910a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (tmp >= 0x10000)
3911a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmp = 0xFFFF;
3912a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         ii16[i++] = tmp;
3913a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         AB_DPRINTF("val %08x\n", tmp);
3914a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (tmp == 0xFFFF)
3915a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            break;
3916a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
3917a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
3918a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   AB_DPRINTF("Registered %d ii16 values\n", i);
3919a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   nb_ii16 = i;
3920a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3921a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3922a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
3923a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void build_viargs_table (void)
3924a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3925a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (ALTIVEC_ARGS_LARGE)
3926f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int i=2;
3927a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   viargs = memalign(16, i * sizeof(vector unsigned int));
3928a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   viargs[0] = (vector unsigned int) { 0x01020304,0x05060708,0x090A0B0C,0x0E0D0E0F };
39298a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   AB_DPRINTF_VEC32x4( viargs[0] );
3930a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   viargs[1] = (vector unsigned int) { 0xF1F2F3F4,0xF5F6F7F8,0xF9FAFBFC,0xFEFDFEFF };
39318a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   AB_DPRINTF_VEC32x4( viargs[1] );
3932a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
3933f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int i,j;
3934a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // build from iargs table (large/default already set)
3935a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   viargs = malloc(nb_iargs * sizeof(vector unsigned int));
3936a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
3937f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      j = iargs[i];
3938a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      viargs[i] = (vector unsigned int){ j, j*2, j*3, j*4 };
39398a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion      AB_DPRINTF_VEC32x4( viargs[i] );
3940a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
3941a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
3942f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion
3943a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   AB_DPRINTF("Registered %d viargs values\n", i);
3944a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   nb_viargs = i;
3945a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3946a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3947a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic inline void register_vfarg (vector float* vfarg,
39488a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion                                  int s, uint8_t _exp, uint32_t mant)
3949a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3950a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t tmp;
395181aab3c751b11fcfa6629b449c92bd7e3f459567sewardj   vector uint32_t* vfargI = (vector uint32_t*)vfarg;
395281aab3c751b11fcfa6629b449c92bd7e3f459567sewardj
39538a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   tmp = ((uint64_t)s << 31) | ((uint64_t)_exp << 23) | mant;
395481aab3c751b11fcfa6629b449c92bd7e3f459567sewardj   *vfargI = (vector uint32_t){ tmp,tmp,tmp,tmp };
3955a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   AB_DPRINTF("%d %02x %06x => %08x %0e\n",
39568a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion              s, _exp, mant, *((uint32_t*)&tmp), *(float*)&tmp);
3957a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
3958a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3959a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void build_vfargs_table (void)
3960a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
3961a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* Sign goes from zero to one
3962a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    * Exponent goes from 0 to ((1 << 9) - 1)
3963a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    * Mantissa goes from 1 to ((1 << 24) - 1)
3964a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    * + special values:
39658f5fc19da719edcd8dfca920837bde7ce1d3accacerion    * +0.0      : 0 0x00 0x000000            => 0x00000000
39668f5fc19da719edcd8dfca920837bde7ce1d3accacerion    * -0.0      : 1 0x00 0x000000            => 0x80000000
39678f5fc19da719edcd8dfca920837bde7ce1d3accacerion    * +infinity : 0 0xFF 0x000000            => 0x7F800000
39688f5fc19da719edcd8dfca920837bde7ce1d3accacerion    * -infinity : 1 0xFF 0x000000            => 0xFF800000
39698f5fc19da719edcd8dfca920837bde7ce1d3accacerion    * +SNaN     : 0 0xFF 0x7FFFFF (non-zero) => 0x7FFFFFFF
39708f5fc19da719edcd8dfca920837bde7ce1d3accacerion    * -SNaN     : 1 0xFF 0x7FFFFF (non-zero) => 0xFFFFFFFF
39718f5fc19da719edcd8dfca920837bde7ce1d3accacerion    * +QNaN     : 0 0xFF 0x3FFFFF (non-zero) => 0x7FBFFFFF
39728f5fc19da719edcd8dfca920837bde7ce1d3accacerion    * -QNaN     : 1 0xFF 0x3FFFFF (non-zero) => 0xFFBFFFFF
3973a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    * (8 values)
3974a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    */
3975a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t mant;
39768a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   uint16_t _exp;
3977a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int s;
3978a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i=0;
3979a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
3980a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
398105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#if !defined (ALTIVEC_ARGS_LARGE)
398205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   nb_vfargs = 12;
3983a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   vfargs = memalign(16, nb_vfargs * sizeof(vector float));
3984a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
398505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   // 4 values:
398605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   for (s=0; s<2; s++) {
39878a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion      for (_exp=0x5; ; _exp += 0x9D ) {
39888a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion         if (_exp > 0xDF)
398905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion            break;
399005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         for (mant = 0x3FFFFF; mant < 0x7FFFFF;
399105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion              mant = /* random */ ((mant + 0x1A6) << 31) + 0x159) {
39928a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion            register_vfarg(&vfargs[i++], s, (uint8_t)_exp, mant);
399305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         }
399405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      }
399505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   }
399605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#else
399705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   nb_vfargs = 50;
399805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   vfargs = memalign(16, nb_vfargs * sizeof(vector float));
399905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
400005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   for (s=0; s<2; s++) {
40018a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion      for (_exp=0x0; ; _exp += 0x3F ) {
40028a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion         //      for (_exp=0; ; _exp = ((_exp + 1) << 1) + 3) {
40038a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion         if (_exp >= 0xFE)
40048a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion            _exp = 0xFE;
400505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         for (mant = 0x0; mant < 0x7FFFFF;
400605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion              mant = /* random */ ((mant + 0x4A6) << 5) + 0x359) {
40078a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion            register_vfarg(&vfargs[i++], s, (uint8_t)_exp, mant);
400805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         }
40098a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion         if (_exp >= 0xFE)
401005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion            break;
401105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      }
401205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   }
401305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion#endif
401405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
4015a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* Special values */
4016a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* +0.0      : 0 0x00 0x000000 */
4017a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 0;
40188a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x00;
4019a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x000000;
40208a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_vfarg(&vfargs[i++], s, _exp, mant);
4021a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* -0.0      : 1 0x00 0x000000 */
4022a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 1;
40238a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0x00;
4024a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x000000;
40258a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_vfarg(&vfargs[i++], s, _exp, mant);
4026a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4027a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* +infinity : 0 0xFF 0x000000  */
4028a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 0;
40298a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0xFF;
4030a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x000000;
40318a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_vfarg(&vfargs[i++], s, _exp, mant);
4032a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* -infinity : 1 0xFF 0x000000 */
4033a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 1;
40348a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0xFF;
4035a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   mant = 0x000000;
40368a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_vfarg(&vfargs[i++], s, _exp, mant);
4037a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
40388a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   /* NaN: _exponent all 1s, non-zero fraction */
4039a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* SNaN is a NaN with the most significant fraction bit clear.*/
40408f5fc19da719edcd8dfca920837bde7ce1d3accacerion   /* +SNaN     : 0 0xFF 0x7FFFFF */
4041a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 0;
40428a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0xFF;
40438f5fc19da719edcd8dfca920837bde7ce1d3accacerion   mant = 0x7FFFFF;
40448a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_vfarg(&vfargs[i++], s, _exp, mant);
40458f5fc19da719edcd8dfca920837bde7ce1d3accacerion   /* -SNaN     : 1 0xFF 0x7FFFFF */
4046a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 1;
40478a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0xFF;
40488f5fc19da719edcd8dfca920837bde7ce1d3accacerion   mant = 0x7FFFFF;
40498a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_vfarg(&vfargs[i++], s, _exp, mant);
4050a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4051a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* QNaN is a NaN with the most significant fraction bit set */
40528f5fc19da719edcd8dfca920837bde7ce1d3accacerion   /* +QNaN     : 0 0xFF 0x3F0000 */
4053a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 0;
40548a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0xFF;
40558f5fc19da719edcd8dfca920837bde7ce1d3accacerion   mant = 0x3FFFFF;
40568a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_vfarg(&vfargs[i++], s, _exp, mant);
40578f5fc19da719edcd8dfca920837bde7ce1d3accacerion   /* -QNaN     : 1 0xFF 0x3F0000 */
4058a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   s = 1;
40598a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   _exp = 0xFF;
40608f5fc19da719edcd8dfca920837bde7ce1d3accacerion   mant = 0x3FFFFF;
40618a43f81f6e42d3407ae9649a5b5c9ff801abdbe0cerion   register_vfarg(&vfargs[i++], s, _exp, mant);
4062a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   AB_DPRINTF("Registered %d vfargs values\n", i);
4063a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
406405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   assert(i <= nb_vfargs);
406505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   nb_vfargs = i;
4066a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4067a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
4068a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4069a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
4070a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void dump_iargs (void)
4071a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4072a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
4073a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i = 0; i < nb_iargs; i++) {
4074a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("iarg %d: %08x %08x %08x\n", i, iargs[i],
4075a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             (unsigned int)&iargs[i], (unsigned int)iargs);
4076a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4077a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4078a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4079a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void dump_iargs16 (void)
4080a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4081a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
4082a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i = 0; i < nb_ii16; i++) {
4083a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("iarg16 %d: %08x %08x %08x\n", i, ii16[i],
4084a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             (unsigned int)&ii16[i], (unsigned int)ii16);
4085a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4086a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4087a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4088a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void dump_vfargs (void)
4089a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4090f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   vector float vf;
4091f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   float f;
4092a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i=0;
4093a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_vfargs; i++) {
4094f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vf = (vector float)vfargs[i];
4095f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      f  = ((float*)&vf)[0];
4096a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("vfarg %3d: %24f : %08x\n", i, f, ((unsigned int*)&f)[0]);
4097a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4098a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4099a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
4100a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4101530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_three_args (const char* name, test_func_t func,
4102a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                 unused uint32_t test_flags)
4103a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4104a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
4105a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j, k;
4106a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4107a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4108a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_iargs; j++) {
4109a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (k=0; k<nb_iargs; k++) {
4110a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r14 = iargs[i];
4111a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r15 = iargs[j];
4112a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r16 = iargs[k];
4113a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Save flags */
4114a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr 18");
4115a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmpcr = r18;
4116a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfxer 18");
4117a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmpxer = r18;
4118a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Set up flags for test */
4119a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = 0;
4120a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr 18");
4121a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtxer 18");
4122a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (*func)();
4123a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr 18");
4124a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags = r18;
4125a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfxer 18");
4126a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            xer = r18;
4127a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            res = r17;
4128a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Restore flags */
4129a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = tmpcr;
4130a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr 18");
4131a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = tmpxer;
4132a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtxer 18");
4133a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s %08x, %08x, %08x => %08x (%08x %08x)\n",
4134a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   name, iargs[i], iargs[j], iargs[k], res, flags, xer);
4135a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
4136a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (verbose) printf("\n");
4137a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4138a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4139a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4140a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4141530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_two_args (const char* name, test_func_t func,
4142a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                               uint32_t test_flags)
4143a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4144a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, xer_orig, tmpcr, tmpxer;
4145664c85989cc01a6885489b299d849eecab53abbesewardj   int i, j, is_div;
4146664c85989cc01a6885489b299d849eecab53abbesewardj
4147664c85989cc01a6885489b299d849eecab53abbesewardj   // catches div, divwu, divo, divwu, divwuo, and . variants
4148664c85989cc01a6885489b299d849eecab53abbesewardj   is_div = NULL != strstr(name, "divw");
4149a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4150a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   xer_orig = 0x00000000;
4151a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj redo:
4152a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4153a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_iargs; j++) {
4154a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r14 = iargs[i];
4155a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r15 = iargs[j];
4156664c85989cc01a6885489b299d849eecab53abbesewardj         /* result of division by zero is implementation dependent.
4157664c85989cc01a6885489b299d849eecab53abbesewardj            don't test it. */
4158664c85989cc01a6885489b299d849eecab53abbesewardj         if (is_div && iargs[j] == 0)
4159664c85989cc01a6885489b299d849eecab53abbesewardj            continue;
4160a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
4161a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4162a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpcr = r18;
4163a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4164a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpxer = r18;
4165a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Set up flags for test */
4166a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = 0;
4167a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4168a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = xer_orig;
4169a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4170a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
4171a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4172a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = r18;
4173a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4174a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         xer = r18;
4175a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         res = r17;
4176a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
4177a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpcr;
4178a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4179a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpxer;
4180a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4181a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s %08x, %08x => %08x (%08x %08x)\n",
4182a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                name, iargs[i], iargs[j], res, flags, xer);
4183a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4184a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
4185a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4186664c85989cc01a6885489b299d849eecab53abbesewardj   if ((test_flags & PPC_XER_CA) && xer_orig == 0x00000000) {
4187a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer_orig = 0x20000000;
4188a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      goto redo;
4189a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4190a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4191a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4192530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_one_arg (const char* name, test_func_t func,
4193a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                               uint32_t test_flags)
4194a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4195a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, xer_orig, tmpcr, tmpxer;
4196a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
4197a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4198a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   xer_orig = 0x00000000;
4199a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj redo:
4200a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4201a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[i];
4202a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4203a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4204a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4205a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4206a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4207a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4208a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
4209a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4210a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = xer_orig;
4211a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4212a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
4213a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
4214a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4215a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4216a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4217a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4218a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4219a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4220a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4221a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4222a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4223a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %08x => %08x (%08x %08x)\n",
4224a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, iargs[i], res, flags, xer);
4225a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4226664c85989cc01a6885489b299d849eecab53abbesewardj   if ((test_flags & PPC_XER_CA) && xer_orig == 0x00000000) {
4227a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer_orig = 0x20000000;
4228a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      goto redo;
4229a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4230a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4231a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4232a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic inline void invalidate_icache ( void *ptr, int nbytes )
4233a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4234a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   unsigned int startaddr = (unsigned int) ptr;
4235a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   unsigned int endaddr   = startaddr + nbytes;
4236a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   unsigned int cls       = 32; /*VG_(cache_line_size_ppc32);*/
4237a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   unsigned int addr;
4238a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4239a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   startaddr &= ~(cls - 1);
4240a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (addr = startaddr; addr < endaddr; addr += cls)
4241a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      asm volatile("dcbst 0,%0" : : "r" (addr));
4242a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   asm volatile("sync");
4243a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (addr = startaddr; addr < endaddr; addr += cls)
4244a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      asm volatile("icbi 0,%0" : : "r" (addr));
4245a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   asm volatile("sync; isync");
4246a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4247a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4248a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* for god knows what reason, if this isn't inlined, the
4249a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   program segfaults. */
4250a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic inline void _patch_op_imm (void *out, void *in,
4251a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                  uint16_t imm, int sh, int len)
4252a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4253a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t *p, *q;
4254a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4255a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   p = out;
4256a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   q = in;
4257a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   *p = (*q & ~(((1 << len) - 1) << sh)) | ((imm & ((1 << len) - 1)) << sh);
4258a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4259a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4260a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic inline void patch_op_imm (void *out, void *in,
4261a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                 uint16_t imm, int sh, int len)
4262a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4263a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t *p;
4264a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4265a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   p = out;
4266a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   _patch_op_imm(out, in, imm, sh, len);
4267a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   invalidate_icache(out, 4);
4268a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4269a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4270a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic inline void patch_op_imm16 (void *out, void *in, uint16_t imm)
4271a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4272a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   patch_op_imm(out, in, imm, 0, 16);
4273a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4274a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4275530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_one_reg_imm16 (const char* name,
4276a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                    test_func_t func,
4277a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                    unused uint32_t test_flags)
4278a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4279a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
4280a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
4281a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
4282a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4283a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4284a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_ii16; j++) {
4285a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         p = (void *)func;
4286a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
4287a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("copy func %s from %p to %p (%08x %08x)\n",
4288a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                name, func, func_buf, p[0], p[1]);
4289a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
4290a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func_buf[1] = p[1];
4291a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         patch_op_imm16(func_buf, p, ii16[j]);
4292a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func = (void *)func_buf;
4293a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
4294a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf(" =>  func %s from %p to %p (%08x %08x)\n",
4295a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                name, func, func_buf, func_buf[0], func_buf[1]);
4296a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
4297a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r14 = iargs[i];
4298a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
4299a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4300a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpcr = r18;
4301a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4302a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpxer = r18;
4303a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Set up flags for test */
4304a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = 0;
4305a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4306a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4307a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
4308a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4309a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = r18;
4310a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4311a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         xer = r18;
4312a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         res = r17;
4313a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
4314a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpcr;
4315a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4316a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpxer;
4317a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4318a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s %08x, %08x => %08x (%08x %08x)\n",
4319a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                name, iargs[i], ii16[j], res, flags, xer);
4320a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4321a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
4322a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4323a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4324a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4325a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* Special test cases for:
4326a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * rlwimi
4327a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * rlwinm
4328a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * rlwnm
4329a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * srawi
4330a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mcrf
4331a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mcrfs
4332a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mcrxr_cb
4333a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mfcr_cb
4334a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mfspr_cb
4335a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mftb_cb
4336a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mtcrf_cb
4337a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mtspr_cb
4338a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj */
4339a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4340530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void rlwi_cb (const char* name, test_func_t func,
4341a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                     unused uint32_t test_flags)
4342a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4343a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
4344a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
4345a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j, k, l;
4346a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4347a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int arg_step = (arg_list_size == 0) ? 31 : 3;
4348a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4349a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4350a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<32; j+=arg_step) {
4351a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (k=0; k<32; k+=arg_step) {
4352a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            for (l=0; l<32; l+=arg_step) {
4353a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               p = (void *)func;
4354a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               func_buf[1] = p[1];
4355a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               _patch_op_imm(func_buf, p, j, 11, 5);
4356a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               _patch_op_imm(func_buf, p, k, 6, 5);
4357a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               patch_op_imm(func_buf, p, l, 1, 5);
4358a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               func = (void *)func_buf;
4359a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r14 = iargs[i];
4360a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               /* Save flags */
4361a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mfcr 18");
4362a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               tmpcr = r18;
4363a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mfxer 18");
4364a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               tmpxer = r18;
4365a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               /* Set up flags for test */
4366a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r18 = 0;
4367a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mtcr 18");
4368a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mtxer 18");
4369a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               (*func)();
4370a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mfcr 18");
4371a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               flags = r18;
4372a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mfxer 18");
4373a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               xer = r18;
4374a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               res = r17;
4375a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               /* Restore flags */
4376a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r18 = tmpcr;
4377a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mtcr 18");
4378a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r18 = tmpxer;
4379a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mtxer 18");
4380a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               printf("%s %08x, %d, %d, %d => %08x (%08x %08x)\n",
4381a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      name, iargs[i], j, k, l, res, flags, xer);
4382a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            }
4383a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            if (verbose) printf("\n");
4384a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
4385a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4386a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4387a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4388a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4389530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void rlwnm_cb (const char* name, test_func_t func,
4390a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
4391a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4392a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
4393a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
4394a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j, k, l;
4395a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4396a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int arg_step = (arg_list_size == 0) ? 31 : 3;
4397a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4398a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4399a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_iargs; j++) {
4400a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (k=0; k<32; k+=arg_step) {
4401a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            for (l=0; l<32; l+=arg_step) {
4402a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               p = (void *)func;
4403a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               func_buf[1] = p[1];
4404a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               _patch_op_imm(func_buf, p, k, 6, 5);
4405a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               patch_op_imm(func_buf, p, l, 1, 5);
4406a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               func = (void *)func_buf;
4407a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r14 = iargs[i];
4408a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r15 = iargs[j];
4409a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               /* Save flags */
4410a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mfcr 18");
4411a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               tmpcr = r18;
4412a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mfxer 18");
4413a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               tmpxer = r18;
4414a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               /* Set up flags for test */
4415a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r18 = 0;
4416a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mtcr 18");
4417a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mtxer 18");
4418a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               (*func)();
4419a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mfcr 18");
4420a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               flags = r18;
4421a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mfxer 18");
4422a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               xer = r18;
4423a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               res = r17;
4424a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               /* Restore flags */
4425a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r18 = tmpcr;
4426a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mtcr 18");
4427a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               r18 = tmpxer;
4428a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               __asm__ __volatile__ ("mtxer 18");
4429a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               printf("%s %08x, %08x, %d, %d => %08x (%08x %08x)\n",
4430a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      name, iargs[i], iargs[j], k, l, res, flags, xer);
4431a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            }
4432a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            if (verbose) printf("\n");
4433a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
4434a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4435a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4436a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4437a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4438530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void srawi_cb (const char* name, test_func_t func,
4439a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
4440a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4441a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
4442a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
4443a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
4444a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4445a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int arg_step = (arg_list_size == 0) ? 31 : 1;
4446a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4447a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4448a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<32; j+=arg_step) {
4449a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         p = (void *)func;
4450a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func_buf[1] = p[1];
4451a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         patch_op_imm(func_buf, p, j, 11, 5);
4452a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func = (void *)func_buf;
4453a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r14 = iargs[i];
4454a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
4455a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4456a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpcr = r18;
4457a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4458a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpxer = r18;
4459a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Set up flags for test */
4460a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = 0;
4461a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4462a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4463a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
4464a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4465a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = r18;
4466a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4467a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         xer = r18;
4468a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         res = r17;
4469a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
4470a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpcr;
4471a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4472a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpxer;
4473a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4474a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s %08x, %d => %08x (%08x %08x)\n",
4475a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                name, iargs[i], j, res, flags, xer);
4476a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4477a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
4478a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4479a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4480a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4481530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void mcrf_cb (const char* name, test_func_t func,
4482a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
4483a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4484a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
4485a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, xer, tmpcr, tmpxer;
4486a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j, k;
4487a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4488a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int arg_step = (arg_list_size == 0) ? 7 : 1;
4489a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4490a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4491a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<8; j+=arg_step) {
4492a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (k=0; k<8; k+=arg_step) {
4493a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            p = (void *)func;
4494a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            func_buf[1] = p[1];
4495a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            _patch_op_imm(func_buf, p, j, 23, 3);
4496a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            patch_op_imm(func_buf, p, k, 18, 3);
4497a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            func = (void *)func_buf;
4498a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r14 = iargs[i];
4499a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Save flags */
4500a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr 18");
4501a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmpcr = r18;
4502a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfxer 18");
4503a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmpxer = r18;
4504a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Set up flags for test */
4505a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = 0;
4506a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr 14");
4507a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtxer 18");
4508a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (*func)();
4509a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr 18");
4510a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags = r18;
4511a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfxer 18");
4512a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            xer = r18;
4513a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Restore flags */
4514a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = tmpcr;
4515a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr 18");
4516a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = tmpxer;
4517a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtxer 18");
4518a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s %d, %d (%08x) => (%08x %08x)\n",
4519a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   name, j, k, iargs[i], flags, xer);
4520a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
4521a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (verbose) printf("\n");
4522a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4523a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4524a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4525a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4526a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
4527530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void mcrfs_cb (const char* name, test_func_t func,
4528a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
4529a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{}
4530a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
4531a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4532a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4533530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void mcrxr_cb (const char* name, test_func_t func,
4534a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
4535a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4536a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
4537a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, xer, tmpcr, tmpxer;
4538a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j, k;
4539a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4540a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int arg_step = 1; //(arg_list_size == 0) ? 7 : 1;
4541a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4542a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<16; i+=arg_step) {
4543a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      j = i << 28;
4544a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (k=0; k<8; k+=arg_step) {
4545a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         p = (void *)func;
4546a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func_buf[1] = p[1];
4547a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         patch_op_imm(func_buf, p, k, 23, 3);
4548a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func = (void *)func_buf;
4549a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r14 = j;
4550a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
4551a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4552a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpcr = r18;
4553a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4554a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpxer = r18;
4555a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Set up flags for test */
4556a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = 0;
4557a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4558a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 14");
4559a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
4560a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4561a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = r18;
4562a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4563a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         xer = r18;
4564a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
4565a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpcr;
4566a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4567a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpxer;
4568a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4569a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s %d (%08x) => (%08x %08x)\n",
4570a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                name, k, j, flags, xer);
4571a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4572a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
4573a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4574a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4575a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4576530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void mfcr_cb (const char* name, test_func_t func,
4577a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                     unused uint32_t test_flags)
4578a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4579a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
4580a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
4581a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4582a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4583a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[i];
4584a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4585a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4586a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4587a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4588a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4589a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4590a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
4591a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 14");
4592a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4593a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
4594a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4595a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4596a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4597a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4598a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
4599a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4600a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4601a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4602a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4603a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4604a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s (%08x) => %08x (%08x %08x)\n",
4605a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, iargs[i], res, flags, xer);
4606a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4607a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4608a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4609a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj// NOTE: Not using func: calling function kills lr
4610530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void mfspr_cb (const char* name, test_func_t func,
4611a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
4612a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4613fdeaa95698883fa09d0abefa4511cfab6466e316sewardj   //volatile uint32_t res, flags, xer, ctr, lr, tmpcr, tmpxer;
4614fdeaa95698883fa09d0abefa4511cfab6466e316sewardj   int j, k, res;
4615a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4616a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Call func, just to stop compiler complaining
4617a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   (*func)();
4618a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4619941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   // mtxer followed by mfxer
4620941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   for (k=0; k<nb_iargs; k++) {
4621941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      j = iargs[k];
4622941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      __asm__ __volatile__(
4623941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         "mtxer %1\n"
4624941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         "\tmfxer %0"
4625941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         : /*out*/"=r"(res) : /*in*/"r"(j) : /*trashed*/"xer"
4626941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      );
4627941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      res &= 0xE000007F; /* rest of the bits are undefined */
4628941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      printf("%s: %08x -> mtxer -> mfxer => %08x\n",
4629941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj             name, j, res);
4630941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   }
4631941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj
4632941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   // mtlr followed by mflr
4633941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   for (k=0; k<nb_iargs; k++) {
4634941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      j = iargs[k];
4635941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      __asm__ __volatile__(
4636941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         "mtlr %1\n"
4637941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         "\tmflr %0"
4638941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         : /*out*/"=r"(res) : /*in*/"r"(j) : /*trashed*/"lr"
4639941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      );
4640941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      printf("%s: %08x ->  mtlr ->  mflr => %08x\n",
4641941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj             name, j, res);
4642941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   }
4643941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj
4644941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   // mtctr followed by mfctr
4645941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   for (k=0; k<nb_iargs; k++) {
4646941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      j = iargs[k];
4647941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      __asm__ __volatile__(
4648941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         "mtctr %1\n"
4649941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         "\tmfctr %0"
4650941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj         : /*out*/"=r"(res) : /*in*/"r"(j) : /*trashed*/"ctr"
4651941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      );
4652941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj      printf("%s: %08x -> mtctr -> mfctr => %08x\n",
4653941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj             name, j, res);
4654941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj   }
4655941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj
4656941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj#if 0
4657a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // mfxer
4658a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   j = 1;
4659a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (k=0; k<nb_iargs; k++) {
4660a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[k];
4661a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4662a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4663a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4664a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4665a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4666a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4667a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4668a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
4669a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // Only valid bits of xer: 0xE000007F
4670a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("lis  15,0xE000");
4671a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("addi 15,15,0x007F");
4672a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("and  16,15,14");
4673a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4674a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr  18");
4675a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 16");
4676a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtlr  18");
4677a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtctr 18");
4678a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4679a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfspr 17, 1");   // func()
4680a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4681a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4682a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4683a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr  18");
4684a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4685a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mflr  18");
4686a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      lr = r18;
4687a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfctr 18");
4688a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ctr = r18;
4689a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
4690a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4691a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4692a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4693a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4694a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4695a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4696a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4697a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d (%08x) => %08x (%08x %08x, %08x, %08x)\n",
4698a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, j, iargs[k], res, flags, xer, lr, ctr);
4699a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4700a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (verbose) printf("\n");
4701a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4702a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // mflr
4703a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   j = 8;
4704a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (k=0; k<nb_iargs; k++) {
4705a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[k];
4706a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4707a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4708a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4709a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4710a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4711a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4712a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4713a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4714a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
4715a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr  18");
4716a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtlr  14");
4717a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtctr 18");
4718a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4719a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4720a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfspr 17, 8");   // func()
4721a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4722a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4723a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4724a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr  18");
4725a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4726a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mflr  18");
4727a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      lr = r18;
4728a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfctr 18");
4729a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ctr = r18;
4730a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
4731a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4732a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4733a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4734a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4735a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4736a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4737a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4738a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d (%08x) => %08x (%08x %08x, %08x, %08x)\n",
4739a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, j, iargs[k], res, flags, xer, lr, ctr);
4740a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4741a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (verbose) printf("\n");
4742a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4743a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // mfctr
4744a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   j = 9;
4745a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (k=0; k<nb_iargs; k++) {
4746a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[k];
4747a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4748a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4749a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4750a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4751a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4752a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4753a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4754a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4755a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
4756a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr  18");
4757a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtctr 14");
4758a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4759a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtlr  18");
4760a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4761a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfspr 17, 9");   // func()
4762a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4763a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr  18");
4764a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4765a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4766a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4767a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mflr  18");
4768a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      lr = r18;
4769a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfctr 18");
4770a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ctr = r18;
4771a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
4772a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4773a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4774a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4775a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4776a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4777a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4778a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4779a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d (%08x) => %08x (%08x %08x, %08x, %08x)\n",
4780f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion             name, j, iargs[k], res, flags, xer, lr, ctr);
4781a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4782941051f9c5677a9ab62f9ccf82a124cbc0bbb5basewardj#endif
4783a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4784a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4785a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
4786530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void mftb_cb (const char* name, test_func_t func,
4787a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                     unused uint32_t test_flags)
4788a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4789a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj// How to test this?
4790a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj// 1) TBU won't change for a while
4791a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj// 2) TBL will have changed every loop iter
4792a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4793a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
4794a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
4795a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4796a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   i = 269;
4797a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (j=0; j<16; j++) {
4798a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4799a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4800a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4801a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4802a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4803a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4804a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
4805a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4806a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4807a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4808a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mftb 17, 269");  // func
4809a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4810a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4811a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4812a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4813a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4814a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
4815a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4816a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4817a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4818a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4819a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4820a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d => %08x (%08x %08x)\n",
4821a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, i, res, flags, xer);
4822a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4823a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (verbose) printf("\n");
4824a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4825a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   i = 268;
4826a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (j=0; j<16; j++) {
4827a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4828a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4829a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4830a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4831a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4832a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4833a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
4834a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4835a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4836a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4837a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mftb 17, 268");  // func
4838a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4839a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4840a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4841a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4842a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4843a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
4844a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4845a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4846a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4847a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4848a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4849a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d => %08x (%08x %08x)\n",
4850a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, i, res, flags, xer);
4851a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4852a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4853a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
4854a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4855530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void mtcrf_cb (const char* name, test_func_t func,
4856a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
4857a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4858a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
4859a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, xer, tmpcr, tmpxer;
4860a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
4861a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4862a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int arg_step = (arg_list_size == 0) ? 99 : 1;
4863a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4864a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
4865a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<256; j+=arg_step) {
4866a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         p = (void *)func;
4867a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func_buf[1] = p[1];
4868a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         patch_op_imm(func_buf, p, j, 12, 8);
4869a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func = (void *)func_buf;
4870a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r14 = iargs[i];
4871a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
4872a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4873a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpcr = r18;
4874a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4875a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpxer = r18;
4876a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Set up flags for test */
4877a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = 0;
4878a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4879a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4880a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
4881a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
4882a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = r18;
4883a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
4884a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         xer = r18;
4885a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
4886a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpcr;
4887a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
4888a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpxer;
4889a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
4890a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s %d, %08x => (%08x %08x)\n",
4891a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                name, j, iargs[i], flags, xer);
4892a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
4893a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
4894a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4895a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
4896a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4897a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj// NOTE: Not using func: calling function kills lr
4898530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void mtspr_cb (const char* name, test_func_t func,
4899a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
4900a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
4901fdeaa95698883fa09d0abefa4511cfab6466e316sewardj#if 0
4902a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, xer, ctr, lr, tmpcr, tmpxer;
4903a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int j, k;
4904a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4905a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Call func, just to stop compiler complaining
4906a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   (*func)();
4907a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4908a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // mtxer
4909a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   j = 1;
4910a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (k=0; k<nb_iargs; k++) {
4911a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[k];
4912a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4913a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4914a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4915a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4916a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4917a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4918a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4919a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4920a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
4921a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4922a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // Only valid bits of xer: 0xE000007F
4923a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // VEX masks these (maybe it shouldn't?), so let's do it first:
4924a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("lis  15,0xE000");
4925a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("addi 15,15,0x007F");
4926a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("and  16,15,14");
4927a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4928a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr  18");
4929a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4930a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtlr  18");
4931a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtctr 18");
4932a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4933a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 16");   // func()
4934a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4935a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4936a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4937a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr  18");
4938a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4939a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mflr  18");
4940a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      lr = r18;
4941a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfctr 18");
4942a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ctr = r18;
4943a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4944a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4945a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4946a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4947a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4948a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4949a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4950a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d, %08x => (%08x %08x, %08x, %08x)\n",
4951a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, j, iargs[k], flags, xer, lr, ctr);
4952a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4953a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (verbose) printf("\n");
4954a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4955a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // mtlr
4956a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   j = 8;
4957a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (k=0; k<nb_iargs; k++) {
4958a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[k];
4959a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4960a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
4961a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
4962a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
4963a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4964a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
4965a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4966a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
4967a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0x0;
4968a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr  18");
4969a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtlr  18");
4970a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtctr 18");
4971a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4972a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4973a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtlr  14");   // func()
4974a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4975a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
4976a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
4977a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr  18");
4978a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
4979a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mflr  18");
4980a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      lr = r18;
4981a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfctr 17");  // CAB: if 18, bashes lr - bad gcc opt?
4982a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ctr = r17;
4983a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4984a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
4985a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
4986a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
4987a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
4988a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
4989a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4990a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d, %08x => (%08x %08x, %08x, %08x)\n",
4991a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, j, iargs[k], flags, xer, lr, ctr);
4992a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
4993a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (verbose) printf("\n");
4994a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
4995a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // mtctr
4996a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   j = 9;
4997a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (k=0; k<nb_iargs; k++) {
4998a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[k];
4999a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5000a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5001a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5002a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
5003a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5004a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
5005a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5006a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
5007a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
5008a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr  18");
5009a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtctr 18");
5010a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5011a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtlr  18");
5012a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5013a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtctr 14");   // func()
5014a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5015a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5016a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
5017a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr  18");
5018a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
5019a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mflr  18");
5020a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      lr = r18;
5021a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfctr 17");
5022a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ctr = r17;
5023a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5024a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
5025a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
5026a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5027a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
5028a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5029a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5030a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d, %08x => (%08x %08x, %08x, %08x)\n",
5031a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, j, iargs[k], flags, xer, lr, ctr);
5032a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5033fdeaa95698883fa09d0abefa4511cfab6466e316sewardj#endif
5034a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5035a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5036a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5037a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5038a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjtypedef struct special_t special_t;
5039a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5040a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstruct special_t {
5041530f73578552bc876a51fbf90cb6be29769bb362sewardj   const char *name;
5042530f73578552bc876a51fbf90cb6be29769bb362sewardj   void (*test_cb)(const char* name, test_func_t func,
5043a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   unused uint32_t test_flags);
5044a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
5045a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5046a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void test_special (special_t *table,
5047530f73578552bc876a51fbf90cb6be29769bb362sewardj                          const char* name, test_func_t func,
5048a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                          unused uint32_t test_flags)
5049a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5050530f73578552bc876a51fbf90cb6be29769bb362sewardj   const char *tmp;
5051a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
5052a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5053a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (tmp = name; isspace(*tmp); tmp++)
5054a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      continue;
5055a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; table[i].name != NULL; i++) {
5056a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
5057a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      fprintf(stderr, "look for handler for '%s' (%s)\n", name,
5058a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj              table[i].name);
5059a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
5060a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (strcmp(table[i].name, tmp) == 0) {
5061a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*table[i].test_cb)(name, func, test_flags);
5062a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         return;
5063a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
5064a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5065a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   fprintf(stderr, "ERROR: no test found for op '%s'\n", name);
5066a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5067a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5068a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic special_t special_int_ops[] = {
5069a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5070a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "rlwimi", /* One register + 3 5 bits immediate arguments */
5071a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &rlwi_cb,
5072a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5073a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5074a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "rlwimi.", /* One register + 3 5 bits immediate arguments */
5075a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &rlwi_cb,
5076a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5077a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5078a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "rlwinm", /* One register + 3 5 bits immediate arguments */
5079a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &rlwi_cb,
5080a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5081a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5082a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "rlwinm.", /* One register + 3 5 bits immediate arguments */
5083a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &rlwi_cb,
5084a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5085a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5086a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "rlwnm",  /* Two registers + 2 5 bits immediate arguments */
5087a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &rlwnm_cb,
5088a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5089a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5090a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "rlwnm.",  /* Two registers + 2 5 bits immediate arguments */
5091a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &rlwnm_cb,
5092a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5093a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5094a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "srawi",  /* One register + 1 5 bits immediate arguments */
5095a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &srawi_cb,
5096a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5097a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5098a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "srawi.",  /* One register + 1 5 bits immediate arguments */
5099a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &srawi_cb,
5100a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5101a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5102a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mcrf",  /* 2 3 bits immediate arguments */
5103a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mcrf_cb,
5104a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5105a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
5106a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5107a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mcrfs",  /* 2 3 bits immediate arguments */
5108a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mcrfs_cb,
5109a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5110a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
5111a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5112a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mcrxr",  /* 1 3 bits immediate argument */
5113a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mcrxr_cb,
5114a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5115a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5116a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mfcr",  /* No arguments */
5117a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mfcr_cb,
5118a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5119a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5120a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mfspr",  /* 1 10 bits immediate argument */
5121a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mfspr_cb,
5122a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5123a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
5124a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {   // Move from time base
5125a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mftb",  /* 1 10 bits immediate arguments */
5126a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mftb_cb,
5127a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5128a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
5129a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5130a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtcrf",  /* One register + 1 8 bits immediate arguments */
5131a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mtcrf_cb,
5132a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5133a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5134a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtspr",  /* One register + 1 10 bits immediate arguments */
5135a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mtspr_cb,
5136a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5137a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5138a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      NULL,
5139a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      NULL,
5140a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5141a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
5142a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5143530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_special (const char* name, test_func_t func,
5144a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                              uint32_t test_flags)
5145a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5146a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   test_special(special_int_ops, name, func, test_flags);
5147a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5148a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5149a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5150530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_ld_one_reg_imm16 (const char* name,
5151a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                       test_func_t func,
5152a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                       unused uint32_t test_flags)
5153a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5154a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
5155a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, rA, flags, xer, tmpcr, tmpxer;
5156a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
5157a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5158a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // +ve d
5159a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
5160c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      j = i * 4;                      // offset = i * sizeof(uint32_t)
5161a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      p = (void *)func;
5162a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func_buf[1] = p[1];
5163a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      patch_op_imm16(func_buf, p, j);
5164a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func = (void *)func_buf;
5165c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r14 = (uint32_t)&iargs[0];      // base reg = start of array
5166a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5167a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5168a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5169a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
5170a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5171a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
5172a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5173a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
5174a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
5175a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5176a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5177a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
5178a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5179a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
5180a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5181a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
5182a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
5183a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      rA = r14;
5184a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5185a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
5186a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
5187a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5188a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
5189a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5190a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5191a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d, (%08x) => %08x, (%08x %08x)\n",
5192a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, j, /*&iargs[0], */ iargs[i], res, /*rA, */ flags, xer);
5193a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5194a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (verbose) printf("\n");
5195a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5196a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // -ve d
5197a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i = -nb_iargs+1; i<=0; i++) {
5198a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      j = i * 4;          // sizeof(uint32_t)
5199a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      p = (void *)func;
5200a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func_buf[1] = p[1];
5201a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      patch_op_imm16(func_buf, p, j);
5202a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func = (void *)func_buf;
5203a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = (uint32_t)&iargs[nb_iargs-1];
5204a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5205a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5206a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5207a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
5208a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5209a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
5210a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5211a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
5212a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
5213a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5214a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5215a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
5216a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5217a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
5218a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5219a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
5220a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
5221a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      rA = r14;
5222a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5223a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
5224a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
5225a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5226a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
5227a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5228a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5229a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d, (%08x) => %08x (%08x %08x)\n",
5230a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, j, /*&iargs[nb_iargs-1], */ iargs[nb_iargs-1+i], res, /*rA, */ flags, xer);
5231a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5232a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5233a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5234530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_ld_two_regs (const char* name,
5235a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                  test_func_t func,
5236a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                  unused uint32_t test_flags)
5237a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5238a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, rA, flags, xer, tmpcr, tmpxer;
5239a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
5240a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5241a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // +ve d
5242a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
5243a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      j = i * 4;          // sizeof(uint32_t)
5244a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = (uint32_t)&iargs[0];
5245a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r15 = j;
5246a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5247a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5248a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5249a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
5250a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5251a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
5252a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5253a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
5254a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
5255a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5256a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5257a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
5258a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5259a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
5260a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5261a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
5262a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = r17;
5263a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      rA = r14;
5264a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5265a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
5266a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
5267a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5268a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
5269a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5270a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5271a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %d (%08x) => %08x (%08x %08x)\n",
5272a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, /*&iargs[0], */ j, iargs[i], res, /*rA, */ flags, xer);
5273a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5274a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5275a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5276530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_st_two_regs_imm16 (const char* name,
5277a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                        test_func_t func,
5278a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                        unused uint32_t test_flags)
5279a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5280a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
5281a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t rA, flags, xer, tmpcr, tmpxer;
5282a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
5283a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t *iargs_priv;
5284a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5285a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // private iargs table to store to
5286a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   iargs_priv = malloc(nb_iargs * sizeof(uint32_t));
5287a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++)
5288a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      iargs_priv[i] = 0;
5289a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5290a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   //     __asm__ __volatile__ ("stwu         14,0(15)");
5291a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5292a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // +ve d
5293a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
5294a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      j = i * 4;          // sizeof(uint32_t)
5295a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      p = (void *)func;
5296a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func_buf[1] = p[1];
5297a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      patch_op_imm16(func_buf, p, j);
5298a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func = (void *)func_buf;
5299a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[i];                      // read from iargs
5300a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r15 = (uint32_t)&iargs_priv[0];      // store to r15 + j
5301a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5302a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5303a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5304a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
5305a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5306a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
5307a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5308a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
5309a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
5310a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5311a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5312a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
5313a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5314a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
5315a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5316a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
5317a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      rA = r15;
5318a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5319a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
5320a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
5321a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5322a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
5323a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5324a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5325a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %08x, %d => %08x, (%08x %08x)\n",
5326a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, iargs[i], j, /*&iargs_priv[0], */ iargs_priv[i], /*rA, */ flags, xer);
5327a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5328a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (verbose) printf("\n");
5329a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5330a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // -ve d
5331a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i = -nb_iargs+1; i<=0; i++) {
5332a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      j = i * 4;          // sizeof(uint32_t)
5333a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      p = (void *)func;
5334a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func_buf[1] = p[1];
5335a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      patch_op_imm16(func_buf, p, j);
5336a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func = (void *)func_buf;
5337a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[nb_iargs-1+i];                // read from iargs
5338a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r15 = (uint32_t)&iargs_priv[nb_iargs-1];  // store to r15 + j
5339a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5340a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5341a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5342a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
5343a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5344a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
5345a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5346a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
5347a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
5348a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5349a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5350a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
5351a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5352a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
5353a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5354a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
5355a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      rA = r15;
5356a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5357a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
5358a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
5359a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5360a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
5361a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5362a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5363a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %08x, %d => %08x, (%08x %08x)\n",
5364a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, iargs[nb_iargs-1+i], j, /*&iargs_priv[nb_iargs-1], */ iargs_priv[nb_iargs-1+i], /*rA, */ flags, xer);
5365a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5366a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   free(iargs_priv);
5367a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5368a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5369530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_int_st_three_regs (const char* name,
5370a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                    test_func_t func,
5371a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                    unused uint32_t test_flags)
5372a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5373a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t rA, flags, xer, tmpcr, tmpxer;
5374a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
5375a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t *iargs_priv;
5376a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5377a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // private iargs table to store to
5378a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   iargs_priv = malloc(nb_iargs * sizeof(uint32_t));
5379a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++)
5380a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      iargs_priv[i] = 0;
5381a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5382a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
5383a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      j = i * 4;          // sizeof(uint32_t)
5384a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r14 = iargs[i];                      // read from iargs
5385a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r15 = (uint32_t)&iargs_priv[0];      // store to r15 + j
5386a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r16 = j;
5387a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5388a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5389a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5390a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
5391a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5392a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
5393a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5394a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
5395a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
5396a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5397a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5398a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
5399a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5400a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
5401a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5402a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      xer = r18;
5403a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      rA = r15;
5404a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5405a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
5406a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
5407a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5408a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
5409a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5410a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5411a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %08x, %d => %08x, (%08x %08x)\n",
5412a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             name, iargs[i], /*&iargs_priv[0], */ j, iargs_priv[i], /*rA, */ flags, xer);
5413a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5414a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   free(iargs_priv);
5415a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5416a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5417a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5418a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* Used in do_tests, indexed by flags->nb_args
5419a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   Elements correspond to enum test_flags::num args
5420a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj*/
5421a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_loop_t int_loops[] = {
5422a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_one_arg,
5423a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_two_args,
5424a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_three_args,
5425a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_two_args,
5426a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_one_reg_imm16,
5427a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_one_reg_imm16,
5428a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_special,
5429a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_ld_one_reg_imm16,
5430a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_ld_two_regs,
5431a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_st_two_regs_imm16,
5432a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_int_st_three_regs,
5433a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
5434a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5435a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
5436530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_float_three_args (const char* name, test_func_t func,
5437a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                   unused uint32_t test_flags)
5438a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5439a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   double res;
5440a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint64_t u0, u1, u2, ur;
5441a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr, tmpxer;
5442a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j, k;
5443c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5444586fb038935723146cb6950b38911aeb9fc12765cerion   /* Note: using nb_normal_fargs:
5445586fb038935723146cb6950b38911aeb9fc12765cerion      - not testing special values for these insns
5446586fb038935723146cb6950b38911aeb9fc12765cerion   */
5447586fb038935723146cb6950b38911aeb9fc12765cerion
5448586fb038935723146cb6950b38911aeb9fc12765cerion   for (i=0; i<nb_normal_fargs; i+=3) {
5449586fb038935723146cb6950b38911aeb9fc12765cerion      for (j=0; j<nb_normal_fargs; j+=5) {
5450586fb038935723146cb6950b38911aeb9fc12765cerion         for (k=0; k<nb_normal_fargs; k+=7) {
5451a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            u0 = *(uint64_t *)(&fargs[i]);
5452a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            u1 = *(uint64_t *)(&fargs[j]);
5453a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            u2 = *(uint64_t *)(&fargs[k]);
5454a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            f14 = fargs[i];
5455a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            f15 = fargs[j];
5456a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            f16 = fargs[k];
5457c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5458a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Save flags */
5459a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr 18");
5460a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmpcr = r18;
5461a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfxer 18");
5462a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmpxer = r18;
5463a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Set up flags for test */
5464a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = 0;
5465a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr 18");
5466a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtxer 18");
5467a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            f18 = +0.0;
5468a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtfsf 0xFF, 18");
5469a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (*func)();
5470a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr 18");
5471a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags = r18;
5472a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            res = f17;
5473a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            ur = *(uint64_t *)(&res);
5474a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Restore flags */
5475a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = tmpcr;
5476a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr 18");
5477a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = tmpxer;
5478a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtxer 18");
5479586fb038935723146cb6950b38911aeb9fc12765cerion
5480586fb038935723146cb6950b38911aeb9fc12765cerion            /* Note: zapping the bottom byte of the result,
5481586fb038935723146cb6950b38911aeb9fc12765cerion               as vex's accuracy isn't perfect */
5482586fb038935723146cb6950b38911aeb9fc12765cerion            ur &= 0xFFFFFFFFFFFFFF00ULL;
5483586fb038935723146cb6950b38911aeb9fc12765cerion
5484586fb038935723146cb6950b38911aeb9fc12765cerion#if defined TEST_FLOAT_FLAGS
5485a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s %016llx, %016llx, %016llx => %016llx (%08x)\n",
5486a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   name, u0, u1, u2, ur, flags);
5487586fb038935723146cb6950b38911aeb9fc12765cerion#else
5488586fb038935723146cb6950b38911aeb9fc12765cerion            printf("%s %016llx, %016llx, %016llx => %016llx\n",
5489586fb038935723146cb6950b38911aeb9fc12765cerion                   name, u0, u1, u2, ur);
5490586fb038935723146cb6950b38911aeb9fc12765cerion#endif
5491a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
5492a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (verbose) printf("\n");
5493a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
5494a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5495a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5496a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5497530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_float_two_args (const char* name, test_func_t func,
5498a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                 unused uint32_t test_flags)
5499a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5500a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   double res;
5501a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint64_t u0, u1, ur;
5502a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr, tmpxer;
5503a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j;
5504a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5505a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_fargs; i+=3) {
5506a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_fargs; j+=5) {
5507a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         u0 = *(uint64_t *)(&fargs[i]);
5508a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         u1 = *(uint64_t *)(&fargs[j]);
5509a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         f14 = fargs[i];
5510a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         f15 = fargs[j];
5511a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
5512a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
5513a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpcr = r18;
5514a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfxer 18");
5515a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpxer = r18;
5516a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Set up flags for test */
5517a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = 0;
5518a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
5519a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
5520a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         f18 = +0.0;
5521a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtfsf 0xFF, 18");
5522a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
5523a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr 18");
5524a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = r18;
5525a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         res = f17;
5526a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         ur = *(uint64_t *)(&res);
5527a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
5528a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpcr;
5529a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr 18");
5530a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         r18 = tmpxer;
5531a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtxer 18");
5532586fb038935723146cb6950b38911aeb9fc12765cerion#if defined TEST_FLOAT_FLAGS
5533a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s %016llx, %016llx => %016llx (%08x)\n",
5534a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                name, u0, u1, ur, flags);
5535586fb038935723146cb6950b38911aeb9fc12765cerion#else
5536586fb038935723146cb6950b38911aeb9fc12765cerion         printf("%s %016llx, %016llx => %016llx\n",
5537586fb038935723146cb6950b38911aeb9fc12765cerion                name, u0, u1, ur);
5538586fb038935723146cb6950b38911aeb9fc12765cerion#endif
5539a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
5540a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
5541a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
5542a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5543a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5544530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_float_one_arg (const char* name, test_func_t func,
5545a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                unused uint32_t test_flags)
5546a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5547a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   double res;
5548a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint64_t u0, ur;
5549a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr, tmpxer;
5550a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
5551586fb038935723146cb6950b38911aeb9fc12765cerion
5552586fb038935723146cb6950b38911aeb9fc12765cerion   /* if we're testing fctiw or fctiwz, zap the hi 32bits,
5553586fb038935723146cb6950b38911aeb9fc12765cerion      as they're undefined */
5554586fb038935723146cb6950b38911aeb9fc12765cerion   unsigned char zap_hi_32bits = strstr(name,"fctiw") ? 1 : 0;
5555586fb038935723146cb6950b38911aeb9fc12765cerion
5556a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_fargs; i++) {
5557a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      u0 = *(uint64_t *)(&fargs[i]);
5558a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      f14 = fargs[i];
5559a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5560a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5561a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpcr = r18;
5562a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfxer 18");
5563a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tmpxer = r18;
5564a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Set up flags for test */
5565a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = 0;
5566a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5567a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5568a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      f18 = +0.0;
5569a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtfsf 0xFF, 18");
5570a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
5571a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr 18");
5572a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = r18;
5573a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      res = f17;
5574a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ur = *(uint64_t *)(&res);
5575a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
5576a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpcr;
5577a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr 18");
5578a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      r18 = tmpxer;
5579a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtxer 18");
5580586fb038935723146cb6950b38911aeb9fc12765cerion
5581586fb038935723146cb6950b38911aeb9fc12765cerion      if (zap_hi_32bits != 0)
5582586fb038935723146cb6950b38911aeb9fc12765cerion         ur &= 0xFFFFFFFFULL;
5583586fb038935723146cb6950b38911aeb9fc12765cerion
5584586fb038935723146cb6950b38911aeb9fc12765cerion#if defined TEST_FLOAT_FLAGS
5585a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s %016llx => %016llx (%08x)\n", name, u0, ur, flags);
5586586fb038935723146cb6950b38911aeb9fc12765cerion#else
5587586fb038935723146cb6950b38911aeb9fc12765cerion      printf("%s %016llx => %016llx\n", name, u0, ur);
5588586fb038935723146cb6950b38911aeb9fc12765cerion#endif
5589a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj    }
5590a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5591a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5592a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* Special test cases for:
5593a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mffs
5594a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mtfsb0
5595a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj * mtfsb1
5596a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj */
5597a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic special_t special_float_ops[] = {
5598a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if 0
5599a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5600a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mffs",   /* One 5 bits immediate argument */
5601a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mffs_cb,
5602a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5603a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5604a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mffs.",   /* One 5 bits immediate argument */
5605a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mffs_cb,
5606a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5607a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5608a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtfsb0", /* One 5 bits immediate argument */
5609a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mffs_cb,
5610a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5611a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5612a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtfsb0.", /* One 5 bits immediate argument */
5613a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mffs_cb,
5614a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5615a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5616a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtfsb1", /* One 5 bits immediate argument */
5617a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mffs_cb,
5618a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5619a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5620a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtfsb1.", /* One 5 bits immediate argument */
5621a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mffs_cb,
5622a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5623a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5624a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtfsf",  /* One register + 1 8 bits immediate argument */
5625a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mtfsf_cb,
5626a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5627a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5628a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtfsf.",  /* One register + 1 8 bits immediate argument */
5629a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mtfsf_cb,
5630a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5631a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5632a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtfsfi", /* One 5 bits argument + 1 5 bits argument */
5633a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mtfsfi_cb,
5634a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5635a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5636a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "mtfsfi.", /* One 5 bits argument + 1 5 bits argument */
5637a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &mtfsfi_cb,
5638a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5639a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
5640a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
5641a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      NULL,
5642a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      NULL,
5643a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
5644a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
5645a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5646530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_float_special (const char* name, test_func_t func,
5647a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                uint32_t test_flags)
5648a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5649a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   test_special(special_float_ops, name, func, test_flags);
5650a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
5651a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5652c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5653c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_float_ld_one_reg_imm16 (const char* name,
5654c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion                                         test_func_t func,
5655c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion                                         unused uint32_t test_flags)
5656c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
5657c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   uint32_t base, func_buf[2], *p;
5658c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   volatile uint32_t flags, xer, tmpcr, tmpxer;
5659c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   volatile double src, res;
5660c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   int i, offs;
5661c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5662c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   /* offset within [1-nb_fargs:nb_fargs] */
5663c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   for (i=1-nb_fargs; i<nb_fargs; i++) {
5664c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      offs = i * 8;      // offset = i * sizeof(double)
5665c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      if (i < 0) {
5666c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         src  = fargs[nb_fargs-1 + i];
5667c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         base = (uint32_t)&fargs[nb_fargs-1];
5668c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      } else {
5669c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         src = fargs[i];
5670c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         base = (uint32_t)&fargs[0];
5671c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      }
5672c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5673c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      p = (void *)func;
5674c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      func_buf[1] = p[1];
5675c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      patch_op_imm16(func_buf, p, offs);
5676c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      func = (void *)func_buf;
5677c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5678c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      // load from fargs[idx] => r14 + offs
5679c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r14 = base;
5680c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5681c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Save flags */
5682c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfcr 18");
5683c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      tmpcr = r18;
5684c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfxer 18");
5685c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      tmpxer = r18;
5686c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5687c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Set up flags for test */
5688c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = 0;
5689c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtcr 18");
5690c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtxer 18");
5691c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      (*func)();
5692c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfcr 18");
5693c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      flags = r18;
5694c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfxer 18");
5695c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      xer = r18;
5696c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      res = f17;
5697c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5698c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Restore flags */
5699c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = tmpcr;
5700c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtcr 18");
5701c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = tmpxer;
5702c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtxer 18");
5703c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5704586fb038935723146cb6950b38911aeb9fc12765cerion#if defined TEST_FLOAT_FLAGS
5705c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      printf("%s %016llx, %4d => %016llx, %08x (%08x %08x)\n",
5706c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             name, double_to_bits(src), offs,
5707c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             double_to_bits(res), r14, flags, xer);
5708586fb038935723146cb6950b38911aeb9fc12765cerion#else
5709586fb038935723146cb6950b38911aeb9fc12765cerion      printf("%s %016llx, %4d => %016llx, %08x\n",
5710586fb038935723146cb6950b38911aeb9fc12765cerion             name, double_to_bits(src), offs,
5711586fb038935723146cb6950b38911aeb9fc12765cerion             double_to_bits(res), r14);
5712586fb038935723146cb6950b38911aeb9fc12765cerion#endif
5713c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   }
5714c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   if (verbose) printf("\n");
5715c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
5716c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5717c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_float_ld_two_regs (const char* name,
5718c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion                                    test_func_t func,
5719c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion                                    unused uint32_t test_flags)
5720c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
5721c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   volatile uint32_t base, flags, xer, tmpcr, tmpxer;
5722c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   volatile double src, res;
5723c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   int i;
5724c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5725c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   /* offset within [1-nb_fargs:nb_fargs] */
5726c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   for (i=1-nb_fargs; i<nb_fargs; i++) {
5727c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r15 = i * 8;                 // offset = i * sizeof(double)
5728c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      if (i < 0) {                 // base reg = start of array
5729c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         src  = fargs[nb_fargs-1 + i];
5730c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         base = (uint32_t)&fargs[nb_fargs-1];
5731c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      } else {
5732c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         src  = fargs[i];
5733c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         base = (uint32_t)&fargs[0];
5734c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      }
5735c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5736c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r14 = base;
5737c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5738c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Save flags */
5739c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfcr 18");
5740c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      tmpcr = r18;
5741c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfxer 18");
5742c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      tmpxer = r18;
5743c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5744c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Set up flags for test */
5745c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = 0;
5746c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtcr 18");
5747c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtxer 18");
5748c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      (*func)();
5749c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfcr 18");
5750c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      flags = r18;
5751c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfxer 18");
5752c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      xer = r18;
5753c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      res = f17;
5754c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5755c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Restore flags */
5756c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = tmpcr;
5757c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtcr 18");
5758c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = tmpxer;
5759c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtxer 18");
5760c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5761586fb038935723146cb6950b38911aeb9fc12765cerion#if defined TEST_FLOAT_FLAGS
5762c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      printf("%s %016llx, %4d => %016llx, %08x (%08x %08x)\n",
5763c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             name, double_to_bits(src), r15,
5764c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             double_to_bits(res), r14, flags, xer);
5765586fb038935723146cb6950b38911aeb9fc12765cerion#else
5766586fb038935723146cb6950b38911aeb9fc12765cerion      printf("%s %016llx, %4d => %016llx, %08x\n",
5767586fb038935723146cb6950b38911aeb9fc12765cerion             name, double_to_bits(src), r15,
5768586fb038935723146cb6950b38911aeb9fc12765cerion             double_to_bits(res), r14);
5769586fb038935723146cb6950b38911aeb9fc12765cerion#endif
5770c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   }
5771c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
5772c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5773c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_float_st_two_regs_imm16 (const char* name,
5774c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion                                          test_func_t func,
5775c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion                                          unused uint32_t test_flags)
5776c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
5777c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   uint32_t base, func_buf[2], *p;
5778c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   volatile uint32_t flags, xer, tmpcr, tmpxer;
5779c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   double src, *p_dst;
5780c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   int i, offs;
5781c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   double *fargs_priv;
5782586fb038935723146cb6950b38911aeb9fc12765cerion   int nb_tmp_fargs = nb_fargs;
5783586fb038935723146cb6950b38911aeb9fc12765cerion
5784586fb038935723146cb6950b38911aeb9fc12765cerion   /* if we're storing an fp single-precision, don't want nans
5785586fb038935723146cb6950b38911aeb9fc12765cerion      - the vex implementation doesn't like them (yet)
5786586fb038935723146cb6950b38911aeb9fc12765cerion      Note: This is actually a bigger problem: the vex implementation
5787586fb038935723146cb6950b38911aeb9fc12765cerion      rounds these insns twice.  This leads to many rounding errors.
5788586fb038935723146cb6950b38911aeb9fc12765cerion      For the small fargs set, however, this doesn't show up.
5789586fb038935723146cb6950b38911aeb9fc12765cerion   */
5790586fb038935723146cb6950b38911aeb9fc12765cerion   if (strstr(name, "stfs"))
5791586fb038935723146cb6950b38911aeb9fc12765cerion      nb_tmp_fargs = nb_normal_fargs;
5792586fb038935723146cb6950b38911aeb9fc12765cerion
5793586fb038935723146cb6950b38911aeb9fc12765cerion
5794c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   // private fargs table to store to
5795586fb038935723146cb6950b38911aeb9fc12765cerion   fargs_priv = malloc(nb_tmp_fargs * sizeof(double));
5796c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5797586fb038935723146cb6950b38911aeb9fc12765cerion   /* offset within [1-nb_tmp_fargs:nb_tmp_fargs] */
5798586fb038935723146cb6950b38911aeb9fc12765cerion   for (i=1-nb_tmp_fargs; i<nb_tmp_fargs; i++) {
5799c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      offs = i * 8;    // offset = i * sizeof(double)
5800c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      if (i < 0) {
5801586fb038935723146cb6950b38911aeb9fc12765cerion         src   =  fargs     [nb_tmp_fargs-1 + i];
5802586fb038935723146cb6950b38911aeb9fc12765cerion         p_dst = &fargs_priv[nb_tmp_fargs-1 + i];
5803586fb038935723146cb6950b38911aeb9fc12765cerion         base  = (uint32_t)&fargs_priv[nb_tmp_fargs-1];
5804c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      } else {
5805c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         src   =  fargs     [i];
5806c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         p_dst = &fargs_priv[i];
5807c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         base  = (uint32_t)&fargs_priv[0];
5808c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      }
5809c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      *p_dst = 0;  // clear dst
5810c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5811c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      p = (void *)func;
5812c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      func_buf[1] = p[1];
5813c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      patch_op_imm16(func_buf, p, offs);
5814c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      func = (void *)func_buf;
5815c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5816c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      // read from fargs[idx] => f14
5817c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      // store to fargs_priv[idx] => r15 + offs
5818c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      f14 = src;
5819c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r15 = base;
5820c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5821c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion     /* Save flags */
5822c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfcr 18");
5823c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      tmpcr = r18;
5824c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfxer 18");
5825c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      tmpxer = r18;
5826c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5827c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Set up flags for test */
5828c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = 0;
5829c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtcr 18");
5830c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtxer 18");
5831c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      (*func)();
5832c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfcr 18");
5833c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      flags = r18;
5834c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfxer 18");
5835c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      xer = r18;
5836c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5837c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Restore flags */
5838c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = tmpcr;
5839c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtcr 18");
5840c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = tmpxer;
5841c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtxer 18");
5842c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5843586fb038935723146cb6950b38911aeb9fc12765cerion#if defined TEST_FLOAT_FLAGS
5844c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      printf("%s %016llx, %4d => %016llx, %08x (%08x %08x)\n",
5845c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             name, double_to_bits(src), offs,
5846c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             double_to_bits(*p_dst), r15, flags, xer);
5847586fb038935723146cb6950b38911aeb9fc12765cerion#else
5848586fb038935723146cb6950b38911aeb9fc12765cerion      printf("%s %016llx, %4d => %016llx, %08x\n",
5849586fb038935723146cb6950b38911aeb9fc12765cerion             name, double_to_bits(src), offs,
5850586fb038935723146cb6950b38911aeb9fc12765cerion             double_to_bits(*p_dst), r15);
5851586fb038935723146cb6950b38911aeb9fc12765cerion#endif
5852c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   }
5853c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   free(fargs_priv);
5854c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
5855c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5856c08c8c576fc16d32e6e572927d06b6dfae476e4dcerionstatic void test_float_st_three_regs (const char* name,
5857c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion                                      test_func_t func,
5858c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion                                      unused uint32_t test_flags)
5859c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion{
5860c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   volatile uint32_t base, flags, xer, tmpcr, tmpxer;
5861c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   double src, *p_dst;
5862c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   int i, offs;
5863c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   double *fargs_priv;
5864586fb038935723146cb6950b38911aeb9fc12765cerion   int nb_tmp_fargs = nb_fargs;
5865586fb038935723146cb6950b38911aeb9fc12765cerion
5866586fb038935723146cb6950b38911aeb9fc12765cerion   /* if we're storing an fp single-precision, don't want nans
5867586fb038935723146cb6950b38911aeb9fc12765cerion      - the vex implementation doesn't like them (yet)
5868586fb038935723146cb6950b38911aeb9fc12765cerion      Note: This is actually a bigger problem: the vex implementation
5869586fb038935723146cb6950b38911aeb9fc12765cerion      rounds these insns twice.  This leads to many rounding errors.
5870586fb038935723146cb6950b38911aeb9fc12765cerion      For the small fargs set, however, this doesn't show up.
5871586fb038935723146cb6950b38911aeb9fc12765cerion   */
5872586fb038935723146cb6950b38911aeb9fc12765cerion   if (strstr(name, "stfs"))  // stfs(u)(x)
5873586fb038935723146cb6950b38911aeb9fc12765cerion      nb_tmp_fargs = nb_normal_fargs;
5874586fb038935723146cb6950b38911aeb9fc12765cerion
5875c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5876c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   // private fargs table to store to
5877586fb038935723146cb6950b38911aeb9fc12765cerion   fargs_priv = malloc(nb_tmp_fargs * sizeof(double));
5878c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5879586fb038935723146cb6950b38911aeb9fc12765cerion   //   /* offset within [1-nb_tmp_fargs:nb_tmp_fargs] */
5880586fb038935723146cb6950b38911aeb9fc12765cerion   //   for (i=1-nb_tmp_fargs; i<nb_tmp_fargs; i++) {
5881586fb038935723146cb6950b38911aeb9fc12765cerion   for (i=0; i<nb_tmp_fargs; i++) {
5882c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      offs = i * 8;    // offset = i * sizeof(double)
5883c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      if (i < 0) {
5884586fb038935723146cb6950b38911aeb9fc12765cerion         src   =  fargs     [nb_tmp_fargs-1 + i];
5885586fb038935723146cb6950b38911aeb9fc12765cerion         p_dst = &fargs_priv[nb_tmp_fargs-1 + i];
5886586fb038935723146cb6950b38911aeb9fc12765cerion         base  = (uint32_t)&fargs_priv[nb_tmp_fargs-1];
5887c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      } else {
5888c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         src   =  fargs     [i];
5889c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         p_dst = &fargs_priv[i];
5890c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion         base  = (uint32_t)&fargs_priv[0];
5891c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      }
5892c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      *p_dst = 0;  // clear dst
5893c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5894c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      f14  = src;    // read from fargs
5895c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r15  = base;   // store to r15 + offs
5896c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r16  = offs;
5897c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5898c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Save flags */
5899c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfcr 18");
5900c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      tmpcr = r18;
5901c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfxer 18");
5902c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      tmpxer = r18;
5903c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5904c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion     /* Set up flags for test */
5905c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = 0;
5906c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtcr 18");
5907c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtxer 18");
5908c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      (*func)();
5909c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfcr 18");
5910c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      flags = r18;
5911c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mfxer 18");
5912c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      xer = r18;
5913c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5914c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      /* Restore flags */
5915c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = tmpcr;
5916c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtcr 18");
5917c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      r18 = tmpxer;
5918c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      __asm__ __volatile__ ("mtxer 18");
5919c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5920586fb038935723146cb6950b38911aeb9fc12765cerion#if defined TEST_FLOAT_FLAGS
5921586fb038935723146cb6950b38911aeb9fc12765cerion      printf("%s %016llx, %4d => %016llx, %08x (%08x %08x)\n",
5922586fb038935723146cb6950b38911aeb9fc12765cerion             name, double_to_bits(src), offs,
5923586fb038935723146cb6950b38911aeb9fc12765cerion             double_to_bits(*p_dst), r15, flags, xer);
5924586fb038935723146cb6950b38911aeb9fc12765cerion#else
5925586fb038935723146cb6950b38911aeb9fc12765cerion      printf("%s %016llx, %4d => %016llx, %08x\n",
5926586fb038935723146cb6950b38911aeb9fc12765cerion             name, double_to_bits(src), offs,
5927586fb038935723146cb6950b38911aeb9fc12765cerion             double_to_bits(*p_dst), r15);
5928586fb038935723146cb6950b38911aeb9fc12765cerion#endif
5929586fb038935723146cb6950b38911aeb9fc12765cerion
5930586fb038935723146cb6950b38911aeb9fc12765cerion
5931586fb038935723146cb6950b38911aeb9fc12765cerion#if 0
5932586fb038935723146cb6950b38911aeb9fc12765cerion      // print double precision result
5933c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      printf("%s %016llx (%014e), %4d => %016llx (%014e), %08x (%08x %08x)\n",
5934c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             name, double_to_bits(src), src, offs,
5935c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             double_to_bits(*p_dst), *p_dst, r15, flags, xer);
5936586fb038935723146cb6950b38911aeb9fc12765cerion
5937c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      // print single precision result
5938c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion      printf("%s %016llx (%014e), %4d => %08x (%f), %08x (%08x %08x)\n",
5939c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             name, double_to_bits(src), src, offs,
5940c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             (uint32_t)(double_to_bits(*p_dst) >> 32),
5941c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             bits_to_float( (uint32_t)(double_to_bits(*p_dst) >> 32) ),
5942c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion             r15, flags, xer);
5943c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion#endif
5944c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   }
5945c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   free(fargs_priv);
5946c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion}
5947c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5948c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion
5949a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* Used in do_tests, indexed by flags->nb_args
5950a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   Elements correspond to enum test_flags::num args
5951a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj*/
5952a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_loop_t float_loops[] = {
5953a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_float_one_arg,
5954a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_float_two_args,
5955a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_float_three_args,
5956a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_float_two_args,
5957a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
5958a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
5959a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_float_special,
5960c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   &test_float_ld_one_reg_imm16,
5961c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   &test_float_ld_two_regs,
5962c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   &test_float_st_two_regs_imm16,
5963c08c8c576fc16d32e6e572927d06b6dfae476e4dcerion   &test_float_st_three_regs,
5964a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
5965a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
5966a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5967a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5968a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
5969a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5970a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* Ref: vector insns to test setting CR, VSCR:
5971a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         volatile vector unsigned int v1 =
5972a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            //            (vector unsigned int){ 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF };
5973a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (vector unsigned int){ 0x80808080,0x80808080,0x80808080,0x80808080 };
5974a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         volatile vector unsigned int v2 =
5975a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            //            (vector unsigned int){ 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF };
5976a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (vector unsigned int){ 0x01010101,0x01010101,0x01010101,0x01010101 };
5977a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         //__asm__ __volatile__ ("vcmpequw. 31,%0,%1" : : "vr" (v1), "vr" (v2));   // sets CR[6]
5978a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         //__asm__ __volatile__ ("vpkswss 31,%0,%1" : : "vr" (v1), "vr" (v2));     // sets VSCR[SAT]
5979a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vsubsbs 31,%0,%1" : : "vr" (v1), "vr" (v2));       // sets VSCR[SAT]
5980a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj*/
5981a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
59821b6b2b3e62549edc02744bbc149c74bcc043835ecerion//#define DEFAULT_VSCR 0x00010000
59831b6b2b3e62549edc02744bbc149c74bcc043835ecerion#define DEFAULT_VSCR 0x0
5984a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5985530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_av_int_one_arg (const char* name, test_func_t func,
5986a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                 unused uint32_t test_flags)
5987a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
5988a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
5989a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
5990f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in, vec_out, vscr;
5991f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src, *dst;
5992a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
5993f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
5994f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
5995f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
5996a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
5997a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_viargs; i++) {
5998a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
5999a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6000a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6001a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6002f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_in  = (vector unsigned int)viargs[i];
6003f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_out = (vector unsigned int){ 0,0,0,0 };
6004a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6005a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // reset VSCR and CR
6006f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6007a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = 0;
6008a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6009a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6010a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6011a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // load input -> r14
6012a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in));
6013a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6014a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // do stuff
6015a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
6016a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6017a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // retrieve output <- r17
6018a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6019a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6020a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // get CR,VSCR flags
6021a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6022a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6023a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6024a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
6025a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6026a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6027a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6028f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      src = (unsigned int*)&vec_in;
6029f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      dst = (unsigned int*)&vec_out;
6030a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s: %08x %08x %08x %08x\n", name,
6031a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             src[0], src[1], src[2], src[3]);
6032a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s:  => %08x %08x %08x %08x ", name,
6033a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             dst[0], dst[1], dst[2], dst[3]);
6034a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6035f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      p_vscr = (unsigned int*)&vscr;
6036a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("(%08x, %08x)\n", flags, p_vscr[3]);
6037a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6038a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("(%08x)\n", flags);
6039a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6040a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6041a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6042a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6043530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_av_int_two_args (const char* name, test_func_t func,
6044a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                  unused uint32_t test_flags)
6045a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6046a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6047a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6048f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in1, vec_in2, vec_out, vscr;
6049f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src1, *src2, *dst;
6050a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i,j;
6051f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6052f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6053f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6054a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6055a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_viargs; i++) {
6056f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_in1 = (vector unsigned int)viargs[i];
6057a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_viargs; j++) {
6058f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_in2 = (vector unsigned int)viargs[j];
6059f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_out = (vector unsigned int){ 0,0,0,0 };
6060a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6061a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
6062a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6063a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6064a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6065a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // reset VSCR and CR
6066f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6067a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = 0;
6068a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6069a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6070a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6071a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // load inputs -> r14,r15
6072a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in1));
6073a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor 15,%0,%0" : : "vr" (vec_in2));
6074a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6075a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // do stuff
6076a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
6077a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6078a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // retrieve output <- r17
6079a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6080a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6081a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // get CR,VSCR flags
6082a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6083a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6084a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6085a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
6086a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6087a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6088a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6089f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src1 = (unsigned int*)&vec_in1;
6090f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src2 = (unsigned int*)&vec_in2;
6091f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         dst  = (unsigned int*)&vec_out;
6092a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s: ", name);
6093a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%08x%08x%08x%08x, ", src1[0], src1[1], src1[2], src1[3]);
6094a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%08x%08x%08x%08x\n", src2[0], src2[1], src2[2], src2[3]);
6095a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s:  => %08x %08x %08x %08x ", name,
6096a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                dst[0], dst[1], dst[2], dst[3]);
6097a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6098f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         p_vscr = (unsigned int*)&vscr;
6099a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("(%08x, %08x)\n", flags, p_vscr[3]);
6100a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6101a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("(%08x)\n", flags);
6102a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6103a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
6104a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
6105a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6106a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6107a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6108530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_av_int_three_args (const char* name, test_func_t func,
6109a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                    unused uint32_t test_flags)
6110a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6111a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6112a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6113f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in1, vec_in2, vec_in3, vec_out, vscr;
6114f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src1, *src2, *src3, *dst;
6115a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i,j,k;
6116f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6117f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6118f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6119a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6120a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_viargs; i++) {
6121f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_in1 = (vector unsigned int)viargs[i];
6122a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_viargs; j++) {
6123f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_in2 = (vector unsigned int)viargs[j];
6124a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (k=0; k<nb_viargs; k++) {
6125f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vec_in3 = (vector unsigned int)viargs[k];
6126f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vec_out = (vector unsigned int){ 0,0,0,0 };
6127a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6128a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Save flags */
6129a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6130a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6131a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6132a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // reset VSCR and CR
6133f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6134a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags = 0;
6135a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6136a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6137a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6138a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // load inputs -> r14,r15,r16
6139a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in1));
6140a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor 15,%0,%0" : : "vr" (vec_in2));
6141a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor 16,%0,%0" : : "vr" (vec_in3));
6142a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6143a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // do stuff
6144a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (*func)();
6145a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6146a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // retrieve output <- r17
6147a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6148a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6149a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // get CR,VSCR flags
6150a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6151a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6152a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6153a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Restore flags */
6154a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6155a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6156a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6157f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            src1 = (unsigned int*)&vec_in1;
6158f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            src2 = (unsigned int*)&vec_in2;
6159f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            src3 = (unsigned int*)&vec_in3;
6160f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            dst  = (unsigned int*)&vec_out;
6161a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s: %08x%08x%08x%08x, %08x%08x%08x%08x, %08x%08x%08x%08x\n", name,
6162a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   src1[0], src1[1], src1[2], src1[3],
6163a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   src2[0], src2[1], src2[2], src2[3],
6164a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   src3[0], src3[1], src3[2], src3[3]);
6165a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6166a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s:  => %08x%08x%08x%08x ", name,
6167a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   dst[0], dst[1], dst[2], dst[3]);
6168a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6169f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            p_vscr = (unsigned int*)&vscr;
6170a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("(%08x, %08x)\n", flags, p_vscr[3]);
6171a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6172a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("(%08x)\n", flags);
6173a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6174a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
6175a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (verbose) printf("\n");
6176a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
6177a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6178a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6179a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6180a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6181530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void vs128_cb (const char* name, test_func_t func,
6182a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
6183a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6184a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6185a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6186f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned char vec_shft;
6187f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in1, vec_out, vscr;
6188f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src1, *src2, *dst;
6189a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i,j;
6190f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6191f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6192f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6193a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6194a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_viargs; i++) {
6195f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_in1 = (vector unsigned int)viargs[i];
6196a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<8; j++) {
6197a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* low-order 3bits of every byte must be the same for the shift vector */
6198f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_shft = (vector unsigned char) { j,j,j,j, j,j,j,j, j,j,j,j, j,j,j,j };
6199f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_out  = (vector unsigned int){ 0,0,0,0 };
6200a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6201a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
6202a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6203a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6204a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6205a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // reset VSCR and CR
6206f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6207a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = 0;
6208a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6209a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6210a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6211a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // load inputs -> r14,r15
6212a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in1));
6213a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor 15,%0,%0" : : "vr" (vec_shft));
6214a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6215a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // do stuff
6216a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
6217a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6218a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // retrieve output <- r17
6219a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6220a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6221a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // get CR,VSCR flags
6222a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6223a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6224a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6225a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
6226a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6227a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6228a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6229f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src1 = (unsigned int*)&vec_in1;
6230f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src2 = (unsigned int*)&vec_shft;
6231f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         dst  = (unsigned int*)&vec_out;
6232a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s: ", name);
6233a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%08x%08x%08x%08x, ", src1[0], src1[1], src1[2], src1[3]);
6234a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%08x%08x%08x%08x\n", src2[0], src2[1], src2[2], src2[3]);
6235a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6236a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s:  => %08x %08x %08x %08x ", name,
6237a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                dst[0], dst[1], dst[2], dst[3]);
6238a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6239f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         p_vscr = (unsigned int*)&vscr;
6240f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         printf("(%08x, %08x)\n", flags, p_vscr[3]);
6241a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6242f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         printf("(%08x)\n", flags);
6243a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6244a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
6245a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
6246a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6247a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6248a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6249530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void vsplt_cb (const char* name, test_func_t func,
6250a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
6251a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6252a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6253a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6254f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in1, vec_out, vscr;
6255a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
6256f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src1, *dst;
6257a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i,j;
6258f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6259f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6260f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6261a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6262a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_viargs; i++) {
6263f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_in1 = (vector unsigned int)viargs[i];
6264a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6265a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<16; j+=3) {
6266f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_out = (vector unsigned int){ 0,0,0,0 };
6267a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6268a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Patch up the instruction */
6269a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         p = (void *)func;
6270a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func_buf[1] = p[1];
6271a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         patch_op_imm(func_buf, p, j, 16, 5);
6272a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         func = (void *)func_buf;
6273a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6274a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
6275a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6276a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6277a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6278a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // reset VSCR and CR
6279f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6280a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = 0;
6281a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6282a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6283a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6284a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // load input -> r14
6285a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in1));
6286a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6287a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // do stuff
6288a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
6289a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6290a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // retrieve output <- r17
6291a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6292a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6293a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // get CR,VSCR flags
6294a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6295a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6296a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6297a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
6298a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6299a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6300a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6301f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src1 = (unsigned int*)&vec_in1;
6302f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         dst  = (unsigned int*)&vec_out;
6303a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s: ", name);
6304a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%08x %08x %08x %08x, %u\n", src1[0], src1[1], src1[2], src1[3], j);
6305a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6306a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s:  => %08x %08x %08x %08x ", name,
6307a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                dst[0], dst[1], dst[2], dst[3]);
6308a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6309f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         p_vscr = (unsigned int*)&vscr;
6310f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         printf("(%08x, %08x)\n", flags, p_vscr[3]);
6311a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6312f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         printf("(%08x)\n", flags);
6313a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6314a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
6315a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
6316a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6317a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6318a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6319530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void vspltis_cb (const char* name, test_func_t func,
6320a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                      unused uint32_t test_flags)
6321a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6322a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6323a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6324f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_out, vscr;
6325a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
6326f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *dst;
6327a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
6328f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6329f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6330f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6331a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6332a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<32; i++) {
6333f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_out = (vector unsigned int){ 0,0,0,0 };
6334a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6335a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Patch up the instruction */
6336a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      p = (void *)func;
6337a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func_buf[1] = p[1];
6338a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      patch_op_imm(func_buf, p, i, 16, 5);
6339a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      func = (void *)func_buf;
6340a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6341a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
6342a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6343a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6344a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6345a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // reset VSCR and CR
6346f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6347a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = 0;
6348a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6349a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6350a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6351a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // do stuff
6352a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
6353a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6354a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // retrieve output <- r17
6355a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6356a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6357a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // get CR,VSCR flags
6358a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6359a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6360a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6361a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
6362a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6363a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6364a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6365f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      dst = (unsigned int*)&vec_out;
6366a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s: %2d => ", name, i);
6367a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6368a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%08x %08x %08x %08x ", dst[0], dst[1], dst[2], dst[3]);
6369a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6370f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      p_vscr = (unsigned int*)&vscr;
6371a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("(%08x, %08x)\n", flags, p_vscr[3]);
6372a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6373a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("(%08x)\n", flags);
6374a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6375a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6376a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6377a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6378530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void vsldoi_cb (const char* name, test_func_t func,
6379a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                       unused uint32_t test_flags)
6380a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6381a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6382a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6383f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in1, vec_in2, vec_out, vscr;
6384a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   uint32_t func_buf[2], *p;
6385f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src1, *src2, *dst;
6386a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i,j,k;
6387f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6388f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6389f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6390a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6391a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_viargs; i++) {
6392f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_in1 = (vector unsigned int)viargs[i];
6393a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_viargs; j++) {
6394f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_in2 = (vector unsigned int)viargs[j];
6395a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (k=0; k<16; k+=14) {
6396f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vec_out = (vector unsigned int){ 0,0,0,0 };
6397a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6398a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Patch up the instruction */
6399a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            p = (void *)func;
6400a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            func_buf[1] = p[1];
6401a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            patch_op_imm(func_buf, p, k, 6, 4);
6402a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            func = (void *)func_buf;
6403a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6404a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Save flags */
6405a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6406a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6407a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6408a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // reset VSCR and CR
6409f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6410a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags = 0;
6411a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6412a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6413a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6414a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // load inputs -> r14,r15
6415a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in1));
6416a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor 15,%0,%0" : : "vr" (vec_in2));
6417a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6418a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // do stuff
6419a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (*func)();
6420a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6421a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // retrieve output <- r17
6422a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6423a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6424a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // get CR,VSCR flags
6425a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6426a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6427a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6428a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Restore flags */
6429a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6430a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6431a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6432f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            src1   = (unsigned int*)&vec_in1;
6433f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            src2   = (unsigned int*)&vec_in2;
6434f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            dst    = (unsigned int*)&vec_out;
6435a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s: ", name);
6436a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%08x%08x%08x%08x, %08x%08x%08x%08x, %u\n",
6437a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   src1[0], src1[1], src1[2], src1[3],
6438a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   src2[0], src2[1], src2[2], src2[3], k);
6439a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6440a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s:  => %08x %08x %08x %08x] ", name,
6441a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   dst[0], dst[1], dst[2], dst[3]);
6442a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6443f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            p_vscr = (unsigned int*)&vscr;
6444a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("(%08x, %08x)\n", flags, p_vscr[3]);
6445a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6446a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("(%08x)\n", flags);
6447a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6448a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
6449a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (verbose) printf("\n");
6450a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
6451a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6452a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6453a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
645405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion/* lvsl, lvsr */
645505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void lvs_cb (const char *name, test_func_t func,
645605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion                    unused uint32_t test_flags)
645705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
645805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   volatile uint32_t flags, tmpcr;
645905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   volatile vector unsigned int tmpvscr;
6460f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_out, vscr;
6461f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *dst;
646205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   int i;
6463f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6464f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6465f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
646605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
646705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   for (i=-1; i<17; i++) {
6468f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_out = (vector unsigned int){ 0,0,0,0 };
646905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
647005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      // make sure start address is 16 aligned - use viargs[0]
647105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      r15 = (uint32_t)&viargs[0];
647205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      r14 = i;
647305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
647405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      /* Save flags */
647505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
647605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
647705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
647805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      // reset VSCR and CR
6479f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
648005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      flags = 0;
648105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
648205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
648305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
648405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      // do stuff
648505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      (*func)();
648605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
648705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      // retrieve output <- r17
648805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
648905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
649005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      // get CR,VSCR flags
649105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
649205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
649305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
649405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      /* Restore flags */
649505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
649605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
649705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
6498f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      dst = (unsigned int*)&vec_out;
649905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      printf("%s %3d, %3d", name, i, 0);
650005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      printf(" => %08x %08x %08x %08x ", dst[0], dst[1], dst[2], dst[3]);
650105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      printf("(%08x)\n", flags);
650205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   }
650305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   if (verbose) printf("\n");
650405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
650505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
6506a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic special_t special_av_int_ops[] = {
6507a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6508a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vsr", /* Two registers arguments */
6509a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vs128_cb,
6510a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
6511a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6512a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vsl", /* Two registers arguments */
6513a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vs128_cb,
6514a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
6515a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6516a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vspltb", /* One reg, one 5-bit uimm arguments */
6517a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vsplt_cb,
6518a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
6519a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6520a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vsplth", /* One reg, one 5-bit uimm arguments */
6521a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vsplt_cb,
6522a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
6523a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6524a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vspltw", /* One reg, one 5-bit uimm arguments */
6525a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vsplt_cb,
6526a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
6527a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6528a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vspltisb", /* One reg, one 5-bit uimm arguments */
6529a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vspltis_cb,
6530a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
6531a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6532a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vspltish", /* One reg, one 5-bit uimm arguments */
6533a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vspltis_cb,
6534a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
6535a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6536a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vspltisw", /* One reg, one 5-bit uimm arguments */
6537a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vspltis_cb,
6538a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
6539a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   {
6540a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      "vsldoi", /* Two regs, one 4-bit uimm arguments */
6541a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      &vsldoi_cb,
6542a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   },
654305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   {
654405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      "lvsl", /* Two regs */
654505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      &lvs_cb,
654605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   },
654705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   {
654805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      "lvsr", /* Two regs */
654905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      &lvs_cb,
655005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   },
655105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   {
655205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      NULL,
655305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      NULL,
655405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   },
6555a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
6556a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6557530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_av_int_special (const char* name, test_func_t func,
6558a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                 uint32_t test_flags)
6559a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6560a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   test_special(special_av_int_ops, name, func, test_flags);
6561a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6562a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
656305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_av_int_ld_two_regs (const char *name,
656405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion                                  test_func_t func,
656505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion                                  unused uint32_t test_flags)
656605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
656705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   volatile uint32_t flags, tmpcr;
656805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   volatile vector unsigned int tmpvscr;
6569f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in, vec_out, vscr;
6570f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src, *dst;
657181aab3c751b11fcfa6629b449c92bd7e3f459567sewardj   int i,j, k, do_mask;
657281aab3c751b11fcfa6629b449c92bd7e3f459567sewardj
657381aab3c751b11fcfa6629b449c92bd7e3f459567sewardj   do_mask = 0;
657481aab3c751b11fcfa6629b449c92bd7e3f459567sewardj   if (strstr(name, "lvebx")) do_mask = 1;
657581aab3c751b11fcfa6629b449c92bd7e3f459567sewardj   if (strstr(name, "lvehx")) do_mask = 2;
657681aab3c751b11fcfa6629b449c92bd7e3f459567sewardj   if (strstr(name, "lvewx")) do_mask = 4;
657705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
657805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   for (i=0; i<nb_viargs; i++) {
657905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      for (j=0; j<16; j+=7) {
6580f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_out = (vector unsigned int){ 0,0,0,0 };
658105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
658205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // load from viargs array + some dis-alignment
658305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         r15 = (uint32_t)&viargs[0];
658405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         r14 = i*16 + j;
658505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
658605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         /* Save flags */
658705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
658805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
658905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
659005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // reset VSCR and CR
6591f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
659205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         flags = 0;
659305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
659405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
659581aab3c751b11fcfa6629b449c92bd7e3f459567sewardj
659605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // do stuff
659705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         (*func)();
659805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
659905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // retrieve output <- r17
660005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
660105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
660205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // get CR,VSCR flags
660305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
660405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
660505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
660605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         /* Restore flags */
660705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
660805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
660905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
6610f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_in = (vector unsigned int)viargs[i];
6611f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src = (unsigned int*)&vec_in;
6612f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         dst = (unsigned int*)&vec_out;
661381aab3c751b11fcfa6629b449c92bd7e3f459567sewardj
661481aab3c751b11fcfa6629b449c92bd7e3f459567sewardj         /* For lvebx/lvehx/lvewx, as per the documentation, all of
661581aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            the dest reg except the loaded bits are undefined
661681aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            afterwards.  And different CPUs really do produce
661781aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            different results.  So mask out bits of the result that
661881aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            are undefined so as to make the test work reliably. */
661981aab3c751b11fcfa6629b449c92bd7e3f459567sewardj         if (do_mask == 1) {
662081aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            char* p = (char*)dst;
662181aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            for (k = 0; k < 16; k++)
662281aab3c751b11fcfa6629b449c92bd7e3f459567sewardj               if (k != j)
662381aab3c751b11fcfa6629b449c92bd7e3f459567sewardj                  p[k] = (char)0;
6624f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         }
662581aab3c751b11fcfa6629b449c92bd7e3f459567sewardj         if (do_mask == 2) {
662681aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            short* p = (short*)dst;
662781aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            for (k = 0; k < 8; k++)
662881aab3c751b11fcfa6629b449c92bd7e3f459567sewardj               if (k != (j>>1))
662981aab3c751b11fcfa6629b449c92bd7e3f459567sewardj                  p[k] = (short)0;
6630f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         }
663181aab3c751b11fcfa6629b449c92bd7e3f459567sewardj         if (do_mask == 4) {
663281aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            int* p = (int*)dst;
663381aab3c751b11fcfa6629b449c92bd7e3f459567sewardj            for (k = 0; k < 4; k++)
663481aab3c751b11fcfa6629b449c92bd7e3f459567sewardj               if (k != (j>>2))
663581aab3c751b11fcfa6629b449c92bd7e3f459567sewardj                  p[k] = (int)0;
6636f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         }
663781aab3c751b11fcfa6629b449c92bd7e3f459567sewardj
663805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         printf("%s %3d, %08x %08x %08x %08x", name, j, src[0], src[1], src[2], src[3]);
663905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         printf(" => %08x %08x %08x %08x ", dst[0], dst[1], dst[2], dst[3]);
664005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         printf("(%08x)\n", flags);
664105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      }
664205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      if (verbose) printf("\n");
664305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   }
664405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
664505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
664605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
664705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerionstatic void test_av_int_st_three_regs (const char *name,
664805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion                                       test_func_t func,
664905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion                                       unused uint32_t test_flags)
665005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion{
665105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   volatile uint32_t flags, tmpcr;
665205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   volatile vector unsigned int tmpvscr;
6653f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in, vec_out, vscr;
6654f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src, *dst;
665505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   int i,j;
665605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   vector unsigned int* viargs_priv;
665705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
665805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   // private viargs table to store to
665981aab3c751b11fcfa6629b449c92bd7e3f459567sewardj   viargs_priv = memalign(16,(nb_viargs * sizeof(vector unsigned int)));
666005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   for (i=0; i<nb_viargs; i++)
666105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      viargs_priv[i] = (vector unsigned int) { 0,0,0,0 };
666205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
666305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   for (i=0; i<nb_viargs; i++) {
666405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      for (j=0; j<16; j+=7) {
666505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // read from viargs
6666f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_in = (vector unsigned int)viargs[i];
666705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
666805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // store to viargs_priv[0] + some dis-alignment
666905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         r16 = (uint32_t)&viargs_priv[0];
667005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         r15 = i*16 + j;
667105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
667205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         /* Save flags */
667305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
667405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
667505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
667605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // reset VSCR and CR
6677f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
667805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         flags = 0;
667905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
668005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
668105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
668205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // load inputs -> r14
668305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in));
668405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
668505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // do stuff
668605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         (*func)();
668705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
668805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // Output stored in viargs_priv
668905cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
669005cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         // get CR,VSCR flags
669105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
669205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
669305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
669405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         /* Restore flags */
669505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
669605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
669705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
6698f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_out = (vector unsigned int)viargs_priv[i];
6699f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src = (unsigned int*)&vec_in;
6700f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         dst = (unsigned int*)&vec_out;
670105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         printf("%s %3d, %08x %08x %08x %08x", name, j, src[0], src[1], src[2], src[3]);
670205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         printf(" => %08x %08x %08x %08x ", dst[0], dst[1], dst[2], dst[3]);
670305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         printf("(%08x)\n", flags);
670405cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      }
670505cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion      if (verbose) printf("\n");
670605cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   }
670705cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion}
670805cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion
6709a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* Used in do_tests, indexed by flags->nb_args
6710a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   Elements correspond to enum test_flags::num args
6711a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj*/
6712a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_loop_t altivec_int_loops[] = {
6713a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_int_one_arg,
6714a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_int_two_args,
6715a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_int_three_args,
6716a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_int_two_args,
6717a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
6718a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
6719a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_int_special,
6720a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
672105cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   &test_av_int_ld_two_regs,
6722a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
672305cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion   test_av_int_st_three_regs,
6724a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
6725a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6726a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6727530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_av_float_one_arg (const char* name, test_func_t func,
6728a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                   unused uint32_t test_flags)
6729a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6730a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6731a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6732f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector float vec_in, vec_out;
6733f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vscr;
6734f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src, *dst;
6735a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i;
6736f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6737f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6738f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6739a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6740e70e7c28cdbc784bc1d2eec15513fd56af0f780dsewardj   /* if we're doing an estimation operation, arrange to zap the
6741e70e7c28cdbc784bc1d2eec15513fd56af0f780dsewardj      bottom byte of the result as it's basically garbage, and differs
6742e70e7c28cdbc784bc1d2eec15513fd56af0f780dsewardj      between cpus */
6743e70e7c28cdbc784bc1d2eec15513fd56af0f780dsewardj   unsigned int mask
6744e70e7c28cdbc784bc1d2eec15513fd56af0f780dsewardj      = (strstr(name,"vrsqrtefp") || strstr(name,"vrefp"))
6745e70e7c28cdbc784bc1d2eec15513fd56af0f780dsewardj           ? 0xFFFFFF00 : 0xFFFFFFFF;
6746e70e7c28cdbc784bc1d2eec15513fd56af0f780dsewardj
6747a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_vfargs; i++) {
6748f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_in  = (vector float)vfargs[i];
6749f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_out = (vector float){ 0.0, 0.0, 0.0, 0.0 };
6750a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6751a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Save flags */
6752a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6753a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6754a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6755a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // reset VSCR and CR
6756f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6757a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags = 0;
6758a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6759a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6760a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6761a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // load input -> r14
6762a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in));
6763a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6764a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // do stuff
6765a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      (*func)();
6766a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6767a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // retrieve output <- r17
6768a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6769a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6770a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      // get CR,VSCR flags
6771a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6772a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6773a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6774a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Restore flags */
6775a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6776a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6777a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6778f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      src = (unsigned int*)&vec_in;
6779f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      dst = (unsigned int*)&vec_out;
6780a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s: %08x %08x %08x %08x\n", name,
6781a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             src[0], src[1], src[2], src[3]);
6782a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6783a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("%s:  => %08x %08x %08x %08x ", name,
6784e70e7c28cdbc784bc1d2eec15513fd56af0f780dsewardj             dst[0] & mask, dst[1] & mask, dst[2] & mask, dst[3] & mask);
6785a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6786f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      p_vscr = (unsigned int*)&vscr;
6787a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("(%08x, %08x)\n", flags, p_vscr[3]);
6788a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6789a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("(%08x)\n", flags);
6790a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6791a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6792a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6793a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6794530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_av_float_two_args (const char* name, test_func_t func,
6795a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                    unused uint32_t test_flags)
6796a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6797a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6798a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6799f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector float vec_in1, vec_in2, vec_out;
6800f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vscr;
6801f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src1, *src2, *dst;
6802a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i,j;
6803f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6804f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6805f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6806a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6807a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_vfargs; i++) {
6808a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_vfargs; j+=3) {
6809f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_in1 = (vector float)vfargs[i];
6810f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_in2 = (vector float)vfargs[j];
6811f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_out = (vector float){ 0.0, 0.0, 0.0, 0.0 };
6812a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6813a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Save flags */
6814a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6815a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6816a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6817a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // reset VSCR and CR
6818f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6819a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags = 0;
6820a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6821a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6822a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6823a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // load inputs -> r14,r15
6824a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in1));
6825a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor 15,%0,%0" : : "vr" (vec_in2));
6826a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6827a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // do stuff
6828a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         (*func)();
6829a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6830a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // retrieve output <- r17
6831a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6832a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6833a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         // get CR,VSCR flags
6834a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6835a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6836a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6837a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         /* Restore flags */
6838a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6839a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6840a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6841f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src1 = (unsigned int*)&vec_in1;
6842f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src2 = (unsigned int*)&vec_in2;
6843f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         dst  = (unsigned int*)&vec_out;
6844a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s: %08x%08x%08x%08x, %08x%08x%08x%08x\n", name,
6845a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                src1[0], src1[1], src1[2], src1[3],
6846a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                src2[0], src2[1], src2[2], src2[3]);
6847a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6848a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s:  => %08x %08x %08x %08x ", name,
6849a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                dst[0], dst[1], dst[2], dst[3]);
6850a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6851f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         p_vscr = (unsigned int*)&vscr;
6852a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("(%08x, %08x)\n", flags, p_vscr[3]);
6853a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6854a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("(%08x)\n", flags);
6855a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6856a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
6857a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
6858a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6859a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6860a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6861530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_av_float_three_args (const char* name, test_func_t func,
6862a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                                      unused uint32_t test_flags)
6863a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
6864a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t flags, tmpcr;
6865a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile vector unsigned int tmpvscr;
6866f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector float vec_in1, vec_in2, vec_in3, vec_out;
6867f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vscr;
6868f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src1, *src2, *src3, *dst;
6869a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i,j,k;
6870f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6871f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6872f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
6873a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6874a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_vfargs; i++) {
6875a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_vfargs; j+=3) {
6876a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (k=0; k<nb_vfargs; k+=5) {
6877f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vec_in1 = (vector float)vfargs[i];
6878f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vec_in2 = (vector float)vfargs[j];
6879f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vec_in3 = (vector float)vfargs[k];
6880f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vec_out = (vector float){ 0.0, 0.0, 0.0, 0.0 };
6881a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6882a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Save flags */
6883a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6884a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6885a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6886a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // reset VSCR and CR
6887f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6888a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags = 0;
6889a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
6890a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6891a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6892a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // load inputs -> r14,r15,r16
6893a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in1));
6894a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor 15,%0,%0" : : "vr" (vec_in2));
6895a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor 16,%0,%0" : : "vr" (vec_in3));
6896a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6897a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // do stuff
6898a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (*func)();
6899a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6900a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // retrieve output <- r17
6901a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6902a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6903a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            // get CR,VSCR flags
6904a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6905a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6906a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6907a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Restore flags */
6908a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6909a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
6910a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6911f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            src1 = (unsigned int*)&vec_in1;
6912f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            src2 = (unsigned int*)&vec_in2;
6913f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            src3 = (unsigned int*)&vec_in3;
6914f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            dst  = (unsigned int*)&vec_out;
6915a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s: %08x%08x%08x%08x, %08x%08x%08x%08x, %08x%08x%08x%08x\n", name,
6916a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   src1[0], src1[1], src1[2], src1[3],
6917a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   src2[0], src2[1], src2[2], src2[3],
6918a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   src3[0], src3[1], src3[2], src3[3]);
6919a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
6920a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s:  => %08x %08x %08x %08x ", name,
6921a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   dst[0], dst[1], dst[2], dst[3]);
6922a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined TEST_VSCR_SAT
6923f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            p_vscr = (unsigned int*)&vscr;
6924a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("(%08x, %08x)\n", flags, p_vscr[3]);
6925a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
6926a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("(%08x)\n", flags);
6927a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
6928a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
6929a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (verbose) printf("\n");
6930a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
6931a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
6932a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
6933a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
69348f5fc19da719edcd8dfca920837bde7ce1d3accacerionstatic void vcvt_cb (const char* name, test_func_t func,
69358f5fc19da719edcd8dfca920837bde7ce1d3accacerion                     unused uint32_t test_flags)
69368f5fc19da719edcd8dfca920837bde7ce1d3accacerion{
69378f5fc19da719edcd8dfca920837bde7ce1d3accacerion   volatile uint32_t flags, tmpcr;
69388f5fc19da719edcd8dfca920837bde7ce1d3accacerion   volatile vector unsigned int tmpvscr;
6939f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   volatile vector unsigned int vec_in, vec_out, vscr;
69408f5fc19da719edcd8dfca920837bde7ce1d3accacerion   uint32_t func_buf[2], *p;
6941f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int *src, *dst;
69428f5fc19da719edcd8dfca920837bde7ce1d3accacerion   int i,j;
6943f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#if defined TEST_VSCR_SAT
6944f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion   unsigned int* p_vscr;
6945f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion#endif
69468f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69478f5fc19da719edcd8dfca920837bde7ce1d3accacerion   for (i=0; i<nb_vfargs; i++) {
6948f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion      vec_in = (vector unsigned int)vfargs[i];
69498f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69508f5fc19da719edcd8dfca920837bde7ce1d3accacerion      for (j=0; j<32; j+=9) {
6951f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vec_out = (vector unsigned int){ 0,0,0,0 };
69528f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69538f5fc19da719edcd8dfca920837bde7ce1d3accacerion         /* Patch up the instruction */
69548f5fc19da719edcd8dfca920837bde7ce1d3accacerion         p = (void *)func;
69558f5fc19da719edcd8dfca920837bde7ce1d3accacerion         func_buf[1] = p[1];
69568f5fc19da719edcd8dfca920837bde7ce1d3accacerion         patch_op_imm(func_buf, p, j, 16, 5);
69578f5fc19da719edcd8dfca920837bde7ce1d3accacerion         func = (void *)func_buf;
69588f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69598f5fc19da719edcd8dfca920837bde7ce1d3accacerion         /* Save flags */
69608f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
69618f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
69628f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69638f5fc19da719edcd8dfca920837bde7ce1d3accacerion         // reset VSCR and CR
6964f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
69658f5fc19da719edcd8dfca920837bde7ce1d3accacerion         flags = 0;
69668f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("mtvscr %0" : : "vr" (vscr) );
69678f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
69688f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69698f5fc19da719edcd8dfca920837bde7ce1d3accacerion         // load input -> r14
6970f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         __asm__ __volatile__ ("vor 14,%0,%0" : : "vr" (vec_in));
69718f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69728f5fc19da719edcd8dfca920837bde7ce1d3accacerion         // do stuff
69738f5fc19da719edcd8dfca920837bde7ce1d3accacerion         (*func)();
69748f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69758f5fc19da719edcd8dfca920837bde7ce1d3accacerion         // retrieve output <- r17
69768f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
69778f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69788f5fc19da719edcd8dfca920837bde7ce1d3accacerion         // get CR,VSCR flags
69798f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
69808f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
69818f5fc19da719edcd8dfca920837bde7ce1d3accacerion
69828f5fc19da719edcd8dfca920837bde7ce1d3accacerion         /* Restore flags */
69838f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
69848f5fc19da719edcd8dfca920837bde7ce1d3accacerion         __asm__ __volatile__ ("mtvscr %0" : : "vr" (tmpvscr));
69858f5fc19da719edcd8dfca920837bde7ce1d3accacerion
6986f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         src = (unsigned int*)&vec_in;
6987f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         dst = (unsigned int*)&vec_out;
6988f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion         printf("%s: %08x (%13e), %2u", name, src[0], *(float*)(&src[0]), j);
69898f5fc19da719edcd8dfca920837bde7ce1d3accacerion         printf(" => %08x (%13e) ", dst[0], *(float*)(&dst[0]));
69908f5fc19da719edcd8dfca920837bde7ce1d3accacerion//         printf(" => %08x ", dst[0]);
69918f5fc19da719edcd8dfca920837bde7ce1d3accacerion#if defined TEST_VSCR_SAT
6992f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion            p_vscr = (unsigned int*)&vscr;
69938f5fc19da719edcd8dfca920837bde7ce1d3accacerion            printf("(%08x, %08x)\n", flags, p_vscr[3]);
69948f5fc19da719edcd8dfca920837bde7ce1d3accacerion#else
69958f5fc19da719edcd8dfca920837bde7ce1d3accacerion            printf("(%08x)\n", flags);
69968f5fc19da719edcd8dfca920837bde7ce1d3accacerion#endif
69978f5fc19da719edcd8dfca920837bde7ce1d3accacerion      }
69988f5fc19da719edcd8dfca920837bde7ce1d3accacerion      if (verbose) printf("\n");
69998f5fc19da719edcd8dfca920837bde7ce1d3accacerion   }
70008f5fc19da719edcd8dfca920837bde7ce1d3accacerion}
70018f5fc19da719edcd8dfca920837bde7ce1d3accacerion
70028f5fc19da719edcd8dfca920837bde7ce1d3accacerionstatic special_t special_av_float_ops[] = {
70038f5fc19da719edcd8dfca920837bde7ce1d3accacerion   {
70048f5fc19da719edcd8dfca920837bde7ce1d3accacerion      "vcfux", /* One reg, one 5-bit uimm argument */
70058f5fc19da719edcd8dfca920837bde7ce1d3accacerion      &vcvt_cb,
70068f5fc19da719edcd8dfca920837bde7ce1d3accacerion   },
70078f5fc19da719edcd8dfca920837bde7ce1d3accacerion   {
70088f5fc19da719edcd8dfca920837bde7ce1d3accacerion      "vcfsx", /* One reg, one 5-bit uimm argument */
70098f5fc19da719edcd8dfca920837bde7ce1d3accacerion      &vcvt_cb,
70108f5fc19da719edcd8dfca920837bde7ce1d3accacerion   },
70118f5fc19da719edcd8dfca920837bde7ce1d3accacerion   {
70128f5fc19da719edcd8dfca920837bde7ce1d3accacerion      "vctuxs", /* One reg, one 5-bit uimm argument */
70138f5fc19da719edcd8dfca920837bde7ce1d3accacerion      &vcvt_cb,
70148f5fc19da719edcd8dfca920837bde7ce1d3accacerion   },
70158f5fc19da719edcd8dfca920837bde7ce1d3accacerion   {
70168f5fc19da719edcd8dfca920837bde7ce1d3accacerion      "vcfux", /* One reg, one 5-bit uimm argument */
70178f5fc19da719edcd8dfca920837bde7ce1d3accacerion      &vcvt_cb,
70188f5fc19da719edcd8dfca920837bde7ce1d3accacerion   },
70198f5fc19da719edcd8dfca920837bde7ce1d3accacerion   {
70208f5fc19da719edcd8dfca920837bde7ce1d3accacerion      "vctsxs", /* One reg, one 5-bit uimm argument */
70218f5fc19da719edcd8dfca920837bde7ce1d3accacerion      &vcvt_cb,
70228f5fc19da719edcd8dfca920837bde7ce1d3accacerion   },
70238f5fc19da719edcd8dfca920837bde7ce1d3accacerion   {
70248f5fc19da719edcd8dfca920837bde7ce1d3accacerion      NULL,
70258f5fc19da719edcd8dfca920837bde7ce1d3accacerion      NULL,
70268f5fc19da719edcd8dfca920837bde7ce1d3accacerion   },
70278f5fc19da719edcd8dfca920837bde7ce1d3accacerion};
70288f5fc19da719edcd8dfca920837bde7ce1d3accacerion
70298f5fc19da719edcd8dfca920837bde7ce1d3accacerionstatic void test_av_float_special (const char* name, test_func_t func,
70308f5fc19da719edcd8dfca920837bde7ce1d3accacerion                                   uint32_t test_flags)
70318f5fc19da719edcd8dfca920837bde7ce1d3accacerion{
70328f5fc19da719edcd8dfca920837bde7ce1d3accacerion   test_special(special_av_float_ops, name, func, test_flags);
70338f5fc19da719edcd8dfca920837bde7ce1d3accacerion}
70348f5fc19da719edcd8dfca920837bde7ce1d3accacerion
7035a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj/* Used in do_tests, indexed by flags->nb_args
7036a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   Elements correspond to enum test_flags::num args
7037a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj*/
7038a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic test_loop_t altivec_float_loops[] = {
7039a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_float_one_arg,
7040a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_float_two_args,
7041a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_float_three_args,
7042a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   &test_av_float_two_args,
7043a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
7044a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
70458f5fc19da719edcd8dfca920837bde7ce1d3accacerion   &test_av_float_special,
7046a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
7047a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
7048a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
7049a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   NULL,
7050a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj};
7051a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7052a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (HAS_ALTIVEC) */
7053a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7054a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7055a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (IS_PPC405)
7056530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic void test_ppc405 (const char* name, test_func_t func,
7057a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                         unused uint32_t test_flags)
7058a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
7059a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
7060a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j, k;
7061a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7062a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; i<nb_iargs; i++) {
7063a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; j<nb_iargs; j++) {
7064a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         for (k=0; k<nb_iargs; k++) {
7065a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r14 = iargs[i];
7066a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r15 = iargs[j];
7067a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Beware: the third argument and the result
7068a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             * are in the same register
7069a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj             */
7070a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r17 = iargs[k];
7071a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Save flags */
7072a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr 18");
7073a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmpcr = r18;
7074a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfxer 18");
7075a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            tmpxer = r18;
7076a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Set up flags for test */
7077a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = 0;
7078a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr 18");
7079a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtxer 18");
7080a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (*func)();
7081a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfcr 18");
7082a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags = r18;
7083a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mfxer 18");
7084a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            xer = r18;
7085a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            res = r17;
7086a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            /* Restore flags */
7087a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = tmpcr;
7088a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtcr 18");
7089a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            r18 = tmpxer;
7090a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            __asm__ __volatile__ ("mtxer 18");
7091a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("%s %08x, %08x, %08x => %08x (%08x %08x)\n",
7092a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                   name, iargs[i], iargs[j], iargs[k], res, flags, xer);
7093a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
7094a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (verbose) printf("\n");
7095a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
7096a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7097a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
7098a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (IS_PPC405) */
7099a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7100530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic int check_filter (char *filter)
7101a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
7102530f73578552bc876a51fbf90cb6be29769bb362sewardj   char *c;
7103a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int ret = 1;
7104a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7105a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (filter != NULL) {
7106a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      c = strchr(filter, '*');
7107a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (c != NULL) {
7108a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         *c = '\0';
7109a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         ret = 0;
7110a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
7111a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7112a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7113a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   return ret;
7114a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
7115a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7116530f73578552bc876a51fbf90cb6be29769bb362sewardjstatic int check_name (const char* name, const char *filter,
7117a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                       int exact)
7118a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
7119a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int nlen, flen;
7120a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int ret = 0;
7121a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7122a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (filter != NULL) {
7123a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (; isspace(*name); name++)
7124a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7125a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      FDPRINTF("Check '%s' againt '%s' (%s match)\n",
7126a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               name, filter, exact ? "exact" : "starting");
7127a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      nlen = strlen(name);
7128a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flen = strlen(filter);
7129a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (exact) {
7130a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (nlen == flen && memcmp(name, filter, flen) == 0)
7131a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            ret = 1;
7132a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      } else {
7133a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (flen <= nlen && memcmp(name, filter, flen) == 0)
7134a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            ret = 1;
7135a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
7136a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   } else {
7137a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      ret = 1;
7138a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7139a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   return ret;
7140a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
7141a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7142a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7143a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7144a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjtypedef struct insn_sel_flags_t_struct {
7145a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int one_arg, two_args, three_args;
7146a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int arith, logical, compare, ldst;
7147a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int integer, floats, p405, altivec, faltivec;
7148a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int cr;
7149a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj} insn_sel_flags_t;
7150a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7151a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void do_tests ( insn_sel_flags_t seln_flags,
7152530f73578552bc876a51fbf90cb6be29769bb362sewardj                       char *filter)
7153a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
7154a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (IS_PPC405)
7155a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   test_loop_t tmpl;
7156a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
7157a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   test_loop_t *loop;
7158a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   test_t *tests;
7159a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int nb_args, type, family;
7160a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int i, j, n;
7161a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int exact;
7162a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7163a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   exact = check_filter(filter);
7164a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   n = 0;
7165a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   for (i=0; all_tests[i].name != NULL; i++) {
7166a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      nb_args = all_tests[i].flags & PPC_NB_ARGS;
7167a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Check number of arguments */
7168a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if ((nb_args == 1 && !seln_flags.one_arg) ||
7169a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (nb_args == 2 && !seln_flags.two_args) ||
7170a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (nb_args == 3 && !seln_flags.three_args))
7171a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7172a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Check instruction type */
7173a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      type = all_tests[i].flags & PPC_TYPE;
7174a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if ((type == PPC_ARITH   && !seln_flags.arith) ||
7175a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (type == PPC_LOGICAL && !seln_flags.logical) ||
7176a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (type == PPC_COMPARE && !seln_flags.compare) ||
7177a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (type == PPC_LDST && !seln_flags.ldst))
7178a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7179a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Check instruction family */
7180a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      family = all_tests[i].flags & PPC_FAMILY;
7181a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if ((family == PPC_INTEGER  && !seln_flags.integer) ||
7182a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (family == PPC_FLOAT    && !seln_flags.floats) ||
7183a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (family == PPC_405      && !seln_flags.p405) ||
7184a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (family == PPC_ALTIVEC  && !seln_flags.altivec) ||
7185a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (family == PPC_FALTIVEC && !seln_flags.faltivec))
7186a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7187a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Check flags update */
7188a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (((all_tests[i].flags & PPC_CR)  && seln_flags.cr == 0) ||
7189a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj          (!(all_tests[i].flags & PPC_CR) && seln_flags.cr == 1))
7190a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7191a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* All passed, do the tests */
7192a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      tests = all_tests[i].tests;
7193a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      /* Select the test loop */
7194a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      switch (family) {
7195a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case PPC_INTEGER:
7196a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         loop = &int_loops[nb_args - 1];
7197a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7198a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case PPC_FLOAT:
7199a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (NO_FLOAT)
7200a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         loop = &float_loops[nb_args - 1];
7201a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7202a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
7203a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         fprintf(stderr, "Sorry. "
7204a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                 "PPC floating point instructions tests "
7205a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                 "are disabled on your host\n");
7206a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* !defined (NO_FLOAT) */
7207a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7208a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case PPC_405:
7209a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (IS_PPC405)
7210a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmpl = &test_ppc405;
7211a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         loop = &tmpl;
7212a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7213a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
7214a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         fprintf(stderr, "Sorry. "
7215a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                 "PPC405 instructions tests are disabled on your host\n");
7216a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7217a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif /* defined (IS_PPC405) */
7218a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case PPC_ALTIVEC:
7219a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
7220a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         loop = &altivec_int_loops[nb_args - 1];
7221a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7222a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
7223a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         fprintf(stderr, "Sorry. "
7224a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                 "Altivec instructions tests are disabled on your host\n");
7225a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7226a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
7227a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case PPC_FALTIVEC:
7228a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
7229a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         loop = &altivec_float_loops[nb_args - 1];
7230a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7231a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
7232a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         fprintf(stderr, "Sorry. "
7233a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                 "Altivec float instructions tests "
7234a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj                 "are disabled on your host\n");
7235a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
7236a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7237a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      default:
7238a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("ERROR: unknown insn family %08x\n", family);
7239a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         continue;
7240a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
7241a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (1 || verbose > 0)
7242a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         printf("%s:\n", all_tests[i].name);
7243a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      for (j=0; tests[j].name != NULL; j++) {
7244a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (check_name(tests[j].name, filter, exact)) {
7245a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            if (verbose > 1)
7246a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj               printf("Test instruction %s\n", tests[j].name);
7247a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            (*loop)(tests[j].name, tests[j].func, all_tests[i].flags);
7248a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            printf("\n");
7249a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            n++;
7250a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
7251a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj        }
7252a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      if (verbose) printf("\n");
7253a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7254a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   printf("All done. Tested %d different instructions\n", n);
7255a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
7256a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7257a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7258a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjstatic void usage (void)
7259a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
7260a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (USAGE_SIMPLE)
7261a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   fprintf(stderr,
7262f811097dbc6be6e2f38b314ea8b41932e82dcbdecerion           "jm-insns [-1] [-2] [-3] [-*] [-t <type>] [-f <family>] [-u] "
7263a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "[-n <filter>] [-r <test_rigour>] [-h]\n"
7264a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-1: test opcodes with one argument\n"
7265a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-2: test opcodes with two arguments\n"
7266a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-3: test opcodes with three arguments\n"
7267a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-*: launch test without checking the number of arguments\n"
7268a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-t: launch test for instructions of type <type>\n"
7269a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t    recognized types:\n"
7270a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tarith (or a)\n"
7271a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tlogical (or l)\n"
7272a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tcompare (or c)\n"
7273a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tstoreload (or s)\n"
7274a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-f: launch test for instructions of family <family>\n"
7275a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t    recognized families:\n"
7276a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tinteger (or i)\n"
7277a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tfloat (or f)\n"
7278a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tppc405 (or mac)\n"
7279a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\taltivec (or a)\n"
7280a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-u: test instructions that update flags\n"
7281a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-n: filter instructions with <filter>\n"
7282a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t    <filter> can be in two forms:\n"
7283a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tname  : filter functions that exactly match <name>\n"
7284a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tname* : filter functions that start with <name>\n"
7285a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-r: set size of arg tables to use to define <test_rigour>\n"
7286a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t    recognized types:\n"
7287a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tlarge (or l)\n"
7288a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t\tsmall (or s) - default\n"
7289a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-v: verbose (-v -v for more)\n"
7290a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           "\t-h: print this help\n"
7291a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           );
7292a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
7293a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   fprintf(stderr,
729457c3e5d80627eb327f15e059f85ecef735159ab5cerion           "Usage: jm-insns [OPTION]\n"
729557c3e5d80627eb327f15e059f85ecef735159ab5cerion           "\t-i: test integer instructions (default)\n"
729657c3e5d80627eb327f15e059f85ecef735159ab5cerion           "\t-f: test floating point instructions\n"
729757c3e5d80627eb327f15e059f85ecef735159ab5cerion           "\t-a: test altivec instructions\n"
729857c3e5d80627eb327f15e059f85ecef735159ab5cerion           "\t-v: be verbose\n"
729957c3e5d80627eb327f15e059f85ecef735159ab5cerion           "\t-h: display this help and exit\n"
7300a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj           );
7301a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
7302a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
7303a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
730457c3e5d80627eb327f15e059f85ecef735159ab5cerion
7305a29a9081631d4af1d07e5e66cdfc870e971f998fsewardjint main (int argc, char **argv)
7306a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj{
7307a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if !defined (USAGE_SIMPLE)
730857c3e5d80627eb327f15e059f85ecef735159ab5cerion////////////////////////////////////////////////////////////////////////
7309a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   unsigned char *tmp, *filter = NULL;
7310a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   insn_sel_flags_t flags;
7311a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int c;
7312a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7313a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.one_arg    = 0;
7314a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.two_args   = 0;
7315a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.three_args = 0;
7316a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.arith      = 0;
7317a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.logical    = 0;
7318a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.compare    = 0;
7319a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.ldst       = 0;
7320a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.integer    = 0;
7321a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.floats     = 0;
7322a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.p405       = 0;
7323a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.altivec    = 0;
7324a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.faltivec   = 0;
7325a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.cr         = -1;
7326a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7327a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   while ((c = getopt(argc, argv, "123t:f:n:r:uvh")) != -1) {
7328a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      switch (c) {
7329a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case '1':
7330a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags.one_arg = 1;
7331a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7332a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case '2':
7333a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags.two_args = 1;
7334a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7335a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case '3':
7336a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags.three_args = 1;
7337a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7338a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 't':
7339a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmp = optarg;
7340a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (strcmp(tmp, "arith") == 0 || strcmp(tmp, "a") == 0) {
7341a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.arith = 1;
7342a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else if (strcmp(tmp, "logical") == 0 || strcmp(tmp, "l") == 0) {
7343a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.logical = 1;
7344a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else if (strcmp(tmp, "compare") == 0 || strcmp(tmp, "c") == 0) {
7345a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.compare = 1;
7346a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else if (strcmp(tmp, "storeload") == 0 || strcmp(tmp, "s") == 0) {
7347a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.ldst = 1;
7348a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else {
7349a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            goto bad_arg;
7350a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
7351a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7352a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'f':
7353a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmp = optarg;
7354a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (strcmp(tmp, "integer") == 0 || strcmp(tmp, "i") == 0) {
7355a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.integer = 1;
7356a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else if (strcmp(tmp, "float") == 0 || strcmp(tmp, "f") == 0) {
7357a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.floats = 1;
7358a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else if (strcmp(tmp, "ppc405") == 0 || strcmp(tmp, "mac") == 0) {
7359a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.p405 = 1;
7360a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else if (strcmp(tmp, "altivec") == 0 || strcmp(tmp, "a") == 0) {
7361a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.altivec = 1;
7362a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            flags.faltivec = 1;
7363a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else {
7364a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            goto bad_arg;
7365a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
7366a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7367a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'n':
7368a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         filter = optarg;
7369a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7370a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'r':
7371a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         tmp = optarg;
7372a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         if (strcmp(tmp, "large") == 0 || strcmp(tmp, "l") == 0) {
7373a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            arg_list_size = 1;
7374a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else if (strcmp(tmp, "small") == 0 || strcmp(tmp, "s") == 0) {
7375a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            arg_list_size = 0;
7376a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         } else {
7377a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj            goto bad_arg;
7378a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         }
7379a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7380a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7381a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'u':
7382a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags.cr = 1;
7383a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7384a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'h':
7385a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         usage();
7386a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         return 0;
7387a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'v':
7388a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         verbose++;
7389a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7390a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      default:
7391a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         usage();
7392a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         fprintf(stderr, "Unknown argument: '%c'\n", c);
7393a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         return 1;
7394a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      bad_arg:
7395a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         usage();
7396a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         fprintf(stderr, "Bad argument for '%c': '%s'\n", c, tmp);
7397a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         return 1;
7398a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
7399a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7400a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (argc != optind) {
7401a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      usage();
7402a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      fprintf(stderr, "Bad number of arguments\n");
7403a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      return 1;
7404a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7405a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7406a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Default n_args
7407a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (flags.one_arg == 0 && flags.two_args == 0 && flags.three_args == 0) {
7408a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.one_arg = 1;
7409a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.two_args = 1;
7410a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.three_args = 1;
7411a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7412a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Default type
7413a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (flags.arith == 0 && flags.logical == 0 &&
7414a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj       flags.compare == 0 && flags.ldst == 0) {
7415a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.arith   = 1;
7416a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.logical = 1;
7417a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.compare = 1;
7418a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.ldst    = 1;
7419a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7420a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Default family
7421a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (flags.integer == 0 && flags.floats == 0 &&
7422a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj       flags.p405 == 0 && flags.altivec == 0 && flags.faltivec == 0) {
7423a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.integer  = 1;
7424a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.floats   = 1;
7425a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.p405     = 1;
7426a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.altivec  = 1;
7427a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.faltivec = 1;
7428a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7429a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Default cr update
7430a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (flags.cr == -1)
7431a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      flags.cr = 2;       // both
7432a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7433a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#else
743457c3e5d80627eb327f15e059f85ecef735159ab5cerion////////////////////////////////////////////////////////////////////////
7435a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   /* Simple usage:
743657c3e5d80627eb327f15e059f85ecef735159ab5cerion      ./jm-insns -i   => int insns
743757c3e5d80627eb327f15e059f85ecef735159ab5cerion      ./jm-insns -f   => fp  insns
743857c3e5d80627eb327f15e059f85ecef735159ab5cerion      ./jm-insns -a   => av  insns
7439a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   */
7440530f73578552bc876a51fbf90cb6be29769bb362sewardj   char *filter = NULL;
7441a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   insn_sel_flags_t flags;
7442a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   int c;
7443a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7444a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Args
7445a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.one_arg    = 1;
7446a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.two_args   = 1;
7447a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.three_args = 1;
7448a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Type
7449a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.arith      = 1;
7450a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.logical    = 1;
7451a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.compare    = 1;
7452a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.ldst       = 1;
7453a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Family
745457c3e5d80627eb327f15e059f85ecef735159ab5cerion   flags.integer    = 0;
7455a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.floats     = 0;
7456a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.p405       = 0;
7457a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.altivec    = 0;
7458a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.faltivec   = 0;
7459a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // Flags
7460a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   flags.cr         = 2;
7461a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
746257c3e5d80627eb327f15e059f85ecef735159ab5cerion   while ((c = getopt(argc, argv, "ifahv")) != -1) {
7463a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      switch (c) {
746457c3e5d80627eb327f15e059f85ecef735159ab5cerion      case 'i':
746557c3e5d80627eb327f15e059f85ecef735159ab5cerion         flags.integer  = 1;
746657c3e5d80627eb327f15e059f85ecef735159ab5cerion         break;
746757c3e5d80627eb327f15e059f85ecef735159ab5cerion      case 'f':
746857c3e5d80627eb327f15e059f85ecef735159ab5cerion         flags.floats   = 1;
746957c3e5d80627eb327f15e059f85ecef735159ab5cerion         break;
7470a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'a':
7471a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         flags.altivec  = 1;
747205cf1ebf06561a8b59adae508e7c4bf6c028ee5bcerion         flags.faltivec = 1;
7473a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7474a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'h':
7475a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         usage();
7476a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         return 0;
7477a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      case 'v':
7478a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         verbose++;
7479a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         break;
7480a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      default:
7481a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         usage();
7482a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         fprintf(stderr, "Unknown argument: '%c'\n", c);
7483a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj         return 1;
7484a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      }
7485a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7486a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7487a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   arg_list_size = 0;
7488a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
7489a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7490a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7491a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   build_iargs_table();
7492a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   build_fargs_table();
7493a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   build_ii16_table();
7494a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
7495a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   build_viargs_table();
7496a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   build_vfargs_table();
7497a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
7498a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // dump_iargs();
7499a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // dump_iargs16();
7500a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   // dump_vfargs();
7501a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7502a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   if (verbose > 1) {
7503a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("\nInstruction Selection:\n");
7504a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("  n_args: \n");
7505a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    one_arg    = %d\n", flags.one_arg);
7506a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    two_args   = %d\n", flags.two_args);
7507a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    three_args = %d\n", flags.three_args);
7508a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("  type: \n");
7509a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    arith      = %d\n", flags.arith);
7510a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    logical    = %d\n", flags.logical);
7511a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    compare    = %d\n", flags.compare);
7512a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    ldst       = %d\n", flags.ldst);
7513a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("  family: \n");
7514a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    integer    = %d\n", flags.integer);
7515a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    floats     = %d\n", flags.floats);
7516a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    p405       = %d\n", flags.p405);
7517a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    altivec    = %d\n", flags.altivec);
7518a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    faltivec   = %d\n", flags.faltivec);
7519a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("  cr update: \n");
7520a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    cr         = %d\n", flags.cr);
7521a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("\n");
7522a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("  num args: \n");
7523a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    iargs      - %d\n", nb_iargs);
7524a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    fargs      - %d\n", nb_fargs);
7525a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#if defined (HAS_ALTIVEC)
7526a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    viargs     - %d\n", nb_viargs);
7527a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("    vfargs     - %d\n", nb_vfargs);
7528a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj#endif
7529a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj      printf("\n");
7530a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   }
7531a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7532a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   do_tests( flags, filter );
7533a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj
7534a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj   return 0;
7535a29a9081631d4af1d07e5e66cdfc870e971f998fsewardj}
7536