1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* HOW TO COMPILE:
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown* 32bit build:
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   gcc -Winline -Wall -g -O -mregnames -maltivec
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown* 64bit build:
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   gcc -Winline -Wall -g -O -mregnames -maltivec -m64
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownThis program is useful, but the register usage conventions in
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownit are a complete dog.  In particular, _patch_op_imm has to
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbe inlined, else you wind up with it segfaulting in
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncompletely different places due to corruption (of r20 in the
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncase I chased).
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * test-ppc.c:
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * PPC tests for qemu-PPC CPU emulation checks
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Copyright (c) 2005 Jocelyn Mayer
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   This program is free software; you can redistribute it and/or
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   modify it under the terms of the GNU General Public License V2
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   as published by the Free Software Foundation
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   This program is distributed in the hope that it will be useful,
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   but WITHOUT ANY WARRANTY; without even the implied warranty of
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   GNU General Public License for more details.
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   You should have received a copy of the GNU General Public License
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   along with this program; if not, write to the Free Software
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Theory of operations:
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a few registers are reserved for the test program:
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * r14 => r18
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * f14 => f18
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * I do preload test values in r14 thru r17 (or less, depending on the number
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * of register operands needed), patch the test opcode if any immediate
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * operands are required, execute the tested opcode.
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * XER, CCR and FPSCR are cleared before every test.
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * I always get the result in r17 and also save XER and CCR for fixed-point
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * operations. I also check FPSCR for floating points operations.
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Improvments:
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a more clever FPSCR management is needed: for now, I always test
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the round-to-zero case. Other rounding modes also need to be tested.
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Operation details
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * -----------------
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * The 'test' functions (via all_tests[]) are wrappers of single asm instns
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * The 'loops' (e.g. int_loops) do the actual work:
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *  - loops over as many arguments as the instn needs (regs | imms)
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     - sets up the environment (reset cr,xer, assign src regs...)
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     - maybe modifies the asm instn to test different imm args
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     - calls the test function
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     - retrieves relevant register data (rD,cr,xer,...)
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     - prints argument and result data.
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * More specifically...
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * all_tests[i] holds insn tests
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *  - of which each holds: {instn_test_arr[], description, flags}
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * flags hold 3 instn classifiers: {family, type, arg_type}
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * // The main test loop:
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * do_tests( user_ctl_flags ) {
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *    foreach(curr_test = all_test[i]) {
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       // flags are used to control what tests are run:
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       if (curr_test->flags && !user_ctl_flags)
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *          continue;
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       // a 'loop_family_arr' is chosen based on the 'family' flag...
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       switch(curr_test->flags->family) {
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       case x: loop_family_arr = int_loops;
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *      ...
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       }
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       // ...and the actual test_loop to run is found by indexing into
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       // the loop_family_arr with the 'arg_type' flag:
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       test_loop = loop_family[curr_test->flags->arg_type]
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       // finally, loop over all instn tests for this test:
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       foreach (instn_test = curr_test->instn_test_arr[i]) {
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *          // and call the test_loop with the current instn_test function,name
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *          test_loop( instn_test->func, instn_test->name )
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *       }
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *    }
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * }
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Details of intruction patching for immediate operands
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * -----------------------------------------------------
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * All the immediate insn test functions are of the form {imm_insn, blr}
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * In order to patch one of these functions, we simply copy both insns
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * to a stack buffer, and rewrite the immediate part of imm_insn.
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * We then execute our stack buffer.
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * All ppc instructions are 32bits wide, which makes this fairly easy.
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Example:
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * extern void test_addi (void);
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * asm(".section \".text\"\n"
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     "    .align 2\n"
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     "    .type test_addi,@function\n"
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     "test_addi:\n"
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     "    addi\n"
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     "    blr\n"
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     "    .previous\n"
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *     );
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * We are interested only in:
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *      "    addi         17, 14, 0\n"
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *      "    blr\n"
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * In a loop test, we may see:
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * uint32_t func_buf[2];               // our new stack based 'function'
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * for imm...                          // loop over imm
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   init_function( &func, func_buf );   // copy insns, set func ptr
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   patch_op_imm16(&func_buf[0], imm);  // patch 'addi' insn
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   ...
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   (*func)();                              // exec our rewritten code
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * patch_op_imm16() itself simply takes the uint32_t insn and overwrites
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the immediate field with the new value (which, for 'addi', is the
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * low 16 bits).
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * So in the loop test, if 'imm' is currently 9, and p[0] is:
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   0x3A2E0000   => addi 17, 14, 0
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * after patch_op_imm16(), func_buf[0] becomes:
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   0x3A2E0009   => addi 17, 14, 9
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Note: init_function() needs to be called on every iteration
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *  - don't ask me why!
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**********************************************************************/
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Uncomment to enable many arguments for altivec insns */
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define USAGE_SIMPLE
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Uncomment to enable many arguments for altivec insns */
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define ALTIVEC_ARGS_LARGE
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Uncomment to enable output of CR flags for float tests */
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define TEST_FLOAT_FLAGS
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Uncomment to enable debug output */
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define DEBUG_ARGS_BUILD
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define DEBUG_FILTER
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* These should be set at build time */
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define NO_FLOAT
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define HAS_ALTIVEC  // CFLAGS += -maltivec
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define IS_PPC405
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/**********************************************************************/
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdint.h>
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "tests/sys_mman.h"
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "tests/malloc.h"       // memalign16
171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "./opcodes.h"
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define STATIC_ASSERT(e) sizeof(struct { int:-!(e); })
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Something of the same size as void*, so can be safely be coerced
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * to/from a pointer type. Also same size as the host's gp registers.
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * According to the AltiVec section of the GCC manual, the syntax does
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * not allow the use of a typedef name as a type specifier in conjunction
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * with the vector keyword, so typedefs uint[32|64]_t are #undef'ed here
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * and redefined using #define.
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef uint32_t
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef uint64_t
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define uint32_t unsigned int
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define uint64_t unsigned long long int
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef uint32_t  HWord_t;
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef uint64_t  HWord_t;
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* __powerpc64__ */
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownenum {
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    compile_time_test1 = STATIC_ASSERT(sizeof(uint32_t) == 4),
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    compile_time_test2 = STATIC_ASSERT(sizeof(uint64_t) == 8),
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SET_CR(_arg) \
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr  %0" : : "b"(_arg) : ALLCR );
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SET_XER(_arg) \
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" );
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GET_CR(_lval) \
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr %0"  : "=b"(_lval) )
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GET_XER(_lval) \
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) )
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GET_CR_XER(_lval_cr,_lval_xer) \
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0)
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SET_CR_ZERO \
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR(0)
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SET_XER_ZERO \
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_XER(0)
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SET_CR_XER_ZERO \
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { SET_CR_ZERO; SET_XER_ZERO; } while (0)
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SET_FPSCR_ZERO \
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { double _d = 0.0; \
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0)
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* XXXX these must all be callee-save regs! */
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownregister double f14 __asm__ ("fr14");
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownregister double f15 __asm__ ("fr15");
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownregister double f16 __asm__ ("fr16");
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownregister double f17 __asm__ ("fr17");
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownregister HWord_t r14 __asm__ ("r14");
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownregister HWord_t r15 __asm__ ("r15");
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownregister HWord_t r16 __asm__ ("r16");
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownregister HWord_t r17 __asm__ ("r17");
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "config.h"         // HAS_ALTIVEC
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#   include <altivec.h>
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <ctype.h>     // isspace
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h>
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h>    // getopt
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ASSEMBLY_FUNC(__fname, __insn)     \
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm(".section \".text\"\n"                 \
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.align 2\n"                         \
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.type "__fname",@function\n"        \
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __fname":\n"                           \
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t"__insn"\n"                         \
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tblr\n"                              \
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.previous\n"                        \
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    )
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ASSEMBLY_FUNC(__fname, __insn)     \
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm(".section  \".text\"\n"                \
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.align 2\n"                         \
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.global "__fname"\n"                \
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.section \".opd\",\"aw\"\n"         \
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.align 3\n"                         \
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ""__fname":\n"                         \
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.quad ."__fname",.TOC.@tocbase,0\n" \
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.previous\n"                        \
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.type ."__fname",@function\n"       \
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t.global  ."__fname"\n"              \
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "."__fname":\n"                        \
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\t"__insn"\n"                         \
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tblr\n"                              \
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    )
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifndef __powerpc64__
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Return a pointer to a 1-page area where is is safe to both write
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   and execute instructions.  Area is filled with 'trap' insns. */
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownuint32_t* get_rwx_area ( void )
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static uint32_t* p = NULL;
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (p == NULL) {
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC,
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(p != MAP_FAILED);
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 4096/sizeof(uint32_t); i++)
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p[i] = 0x7fe00008; /* trap */
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* -------------- BEGIN #include "test-ppc.h" -------------- */
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * test-ppc.h:
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * PPC tests for qemu-PPC CPU emulation checks - definitions
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Copyright (c) 2005 Jocelyn Mayer
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   This program is free software; you can redistribute it and/or
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   modify it under the terms of the GNU General Public License V2
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   as published by the Free Software Foundation
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   This program is distributed in the hope that it will be useful,
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   but WITHOUT ANY WARRANTY; without even the implied warranty of
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   GNU General Public License for more details.
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   You should have received a copy of the GNU General Public License
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   along with this program; if not, write to the Free Software
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (__TEST_PPC_H__)
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __TEST_PPC_H__
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdint.h>
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef void (*test_func_t) (void);
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct test_t test_t;
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct test_table_t test_table_t;
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct test_t {
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    test_func_t func;
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    const char *name;
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct test_table_t {
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    test_t *tests;
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    const char *name;
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    uint32_t flags;
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef void (*test_loop_t) (const char *name, test_func_t func,
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             uint32_t flags);
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownenum test_flags {
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /* Nb arguments */
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_ONE_ARG    = 0x00000001,
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_TWO_ARGS   = 0x00000002,
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_THREE_ARGS = 0x00000003,
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_CMP_ARGS   = 0x00000004,  // family: compare
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_CMPI_ARGS  = 0x00000005,  // family: compare
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_TWO_I16    = 0x00000006,  // family: arith/logical
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_SPECIAL    = 0x00000007,  // family: logical
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_LD_ARGS    = 0x00000008,  // family: ldst
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_LDX_ARGS   = 0x00000009,  // family: ldst
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_ST_ARGS    = 0x0000000A,  // family: ldst
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_STX_ARGS   = 0x0000000B,  // family: ldst
357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    PPC_ONE_IMM    = 0x0000000C,  // PPC_MISC family
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_NB_ARGS    = 0x0000000F,
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /* Type */
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_ARITH      = 0x00000100,
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_LOGICAL    = 0x00000200,
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_COMPARE    = 0x00000300,
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_CROP       = 0x00000400,
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_LDST       = 0x00000500,
365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    PPC_POPCNT     = 0x00000600,
366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    PPC_ANY        = 0x00000700,
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_TYPE       = 0x00000F00,
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /* Family */
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_INTEGER    = 0x00010000,
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_FLOAT      = 0x00020000,
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_405        = 0x00030000,
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_ALTIVEC    = 0x00040000,
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_FALTIVEC   = 0x00050000,
374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    PPC_MISC       = 0x00060000,
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_FAMILY     = 0x000F0000,
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /* Flags: these may be combined, so use separate bitfields. */
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_CR         = 0x01000000,
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    PPC_XER_CA     = 0x02000000,
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (__TEST_PPC_H__) */
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* -------------- END #include "test-ppc.h" -------------- */
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (DEBUG_ARGS_BUILD)
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define AB_DPRINTF(fmt, args...) do { } while (0)
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (DEBUG_FILTER)
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define FDPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define FDPRINTF(fmt, args...) do { } while (0)
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Produce the 64-bit pattern corresponding to the supplied double. */
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic uint64_t double_to_bits ( double d )
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   union { uint64_t i; double d; } u;
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(8 == sizeof(uint64_t));
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(8 == sizeof(double));
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(8 == sizeof(u));
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   u.d = d;
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return u.i;
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic float bits_to_float ( uint32_t i )
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   union { uint32_t i; float f; } u;
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(4 == sizeof(uint32_t));
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(4 == sizeof(float));
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(4 == sizeof(u));
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   u.i = i;
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return u.f;
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void AB_DPRINTF_VEC32x4 ( vector unsigned int v )
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (DEBUG_ARGS_BUILD)
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_int = (unsigned int*)&v;
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("val");
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<4; i++) {
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      AB_DPRINTF(" %08x", p_int[i]);
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("\n");
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define unused __attribute__ (( unused ))
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* -------------- BEGIN #include "ops-ppc.c" -------------- */
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* #include "test-ppc.h" */
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_add (void)
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("add          17, 14, 15");
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addo (void)
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addo         17, 14, 15");
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addc (void)
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addc         17, 14, 15");
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addco (void)
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addco        17, 14, 15");
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divw (void)
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divw         17, 14, 15");
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divwo (void)
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divwo        17, 14, 15");
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divwu (void)
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divwu        17, 14, 15");
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divwuo (void)
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divwuo       17, 14, 15");
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhw (void)
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhw        17, 14, 15");
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhwu (void)
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhwu       17, 14, 15");
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mullw (void)
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mullw        17, 14, 15");
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mullwo (void)
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mullwo       17, 14, 15");
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subf (void)
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subf         17, 14, 15");
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfo (void)
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfo        17, 14, 15");
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfc (void)
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfc        17, 14, 15");
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfco (void)
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfco       17, 14, 15");
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulld (void)
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulld        17, 14, 15");
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_mulldo (void)
535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    __asm__ __volatile__ ("mulldo        17, 14, 15");
537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhd (void)
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhd        17, 14, 15");
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhdu (void)
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhdu       17, 14, 15");
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divd (void)
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divd         17, 14, 15");
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divdu (void)
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divdu        17, 14, 15");
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_divdo (void)
560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    __asm__ __volatile__ ("divdo        17, 14, 15");
562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_divduo (void)
565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    __asm__ __volatile__ ("divduo        17, 14, 15");
567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ia_ops_two[] = {
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_add             , "         add", },
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addo            , "        addo", },
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addc            , "        addc", },
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addco           , "       addco", },
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divw            , "        divw", },
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divwo           , "       divwo", },
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divwu           , "       divwu", },
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divwuo          , "      divwuo", },
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhw           , "       mulhw", },
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhwu          , "      mulhwu", },
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mullw           , "       mullw", },
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mullwo          , "      mullwo", },
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subf            , "        subf", },
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfo           , "       subfo", },
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfc           , "       subfc", },
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfco          , "      subfco", },
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhd           , "       mulhd", },
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhdu          , "      mulhdu", },
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulld           , "       mulld", },
591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_mulldo          , "      mulldo", },
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divd            , "        divd", },
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divdu           , "       divdu", },
594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_divdo           , "       divdo", },
595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_divduo          , "      divduo", },
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_add_ (void)
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("add.         17, 14, 15");
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addo_ (void)
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addo.        17, 14, 15");
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addc_ (void)
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addc.        17, 14, 15");
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addco_ (void)
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addco.       17, 14, 15");
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divw_ (void)
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divw.        17, 14, 15");
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divwo_ (void)
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divwo.       17, 14, 15");
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divwu_ (void)
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divwu.       17, 14, 15");
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divwuo_ (void)
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divwuo.      17, 14, 15");
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhw_ (void)
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhw.       17, 14, 15");
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhwu_ (void)
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhwu.      17, 14, 15");
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mullw_ (void)
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mullw.       17, 14, 15");
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mullwo_ (void)
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mullwo.      17, 14, 15");
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subf_ (void)
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subf.        17, 14, 15");
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfo_ (void)
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfo.       17, 14, 15");
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfc_ (void)
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfc.       17, 14, 15");
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfco_ (void)
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfco.      17, 14, 15");
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhd_ (void)
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhd.       17, 14, 15");
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhdu_ (void)
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhdu.      17, 14, 15");
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulld_ (void)
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulld.       17, 14, 15");
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_mulldo_ (void)
697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    __asm__ __volatile__ ("mulldo.       17, 14, 15");
699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divd_ (void)
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divd.        17, 14, 15");
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_divdu_ (void)
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("divdu.       17, 14, 15");
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_divdo_ (void)
712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    __asm__ __volatile__ ("divdo.        17, 14, 15");
714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_divduo_ (void)
717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    __asm__ __volatile__ ("divduo.       17, 14, 15");
719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_iar_ops_two[] = {
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_add_            , "        add.", },
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addo_           , "       addo.", },
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addc_           , "       addc.", },
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addco_          , "      addco.", },
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divw_           , "       divw.", },
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divwo_          , "      divwo.", },
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divwu_          , "      divwu.", },
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divwuo_         , "     divwuo.", },
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhw_          , "      mulhw.", },
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhwu_         , "     mulhwu.", },
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mullw_          , "      mullw.", },
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mullwo_         , "     mullwo.", },
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subf_           , "       subf.", },
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfo_          , "      subfo.", },
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfc_          , "      subfc.", },
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfco_         , "     subfco.", },
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhd_          , "      mulhd.", },
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhdu_         , "     mulhdu.", },
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulld_          , "      mulld.", },
743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_mulldo_          , "    mulldo.", },
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divd_           , "       divd.", },
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_divdu_          , "      divdu.", },
746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_divdo_          , "      divdo.", },
747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_divduo_         , "     divduo.", },
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_adde (void)
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("adde         17, 14, 15");
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addeo (void)
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addeo        17, 14, 15");
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfe (void)
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfe        17, 14, 15");
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfeo (void)
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfeo       17, 14, 15");
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_iac_ops_two[] = {
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_adde            , "        adde", },
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addeo           , "       addeo", },
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfe           , "       subfe", },
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfeo          , "      subfeo", },
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_adde_ (void)
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("adde.        17, 14, 15");
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addeo_ (void)
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addeo.       17, 14, 15");
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfe_ (void)
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfe.       17, 14, 15");
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfeo_ (void)
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfeo.      17, 14, 15");
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_iacr_ops_two[] = {
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_adde_           , "       adde.", },
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addeo_          , "      addeo.", },
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfe_          , "      subfe.", },
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfeo_         , "     subfeo.", },
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_and (void)
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("and          17, 14, 15");
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_andc (void)
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("andc         17, 14, 15");
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_eqv (void)
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("eqv          17, 14, 15");
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nand (void)
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nand         17, 14, 15");
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nor (void)
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nor          17, 14, 15");
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_or (void)
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("or           17, 14, 15");
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_orc (void)
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("orc          17, 14, 15");
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_xor (void)
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("xor          17, 14, 15");
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_slw (void)
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("slw          17, 14, 15");
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_sraw (void)
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("sraw         17, 14, 15");
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_srw (void)
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("srw          17, 14, 15");
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_sld (void)
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("sld          17, 14, 15");
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_srad (void)
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("srad         17, 14, 15");
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_srd (void)
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("srd          17, 14, 15");
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_il_ops_two[] = {
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_and             , "         and", },
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_andc            , "        andc", },
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_eqv             , "         eqv", },
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nand            , "        nand", },
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nor             , "         nor", },
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_or              , "          or", },
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_orc             , "         orc", },
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_xor             , "         xor", },
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_slw             , "         slw", },
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sraw            , "        sraw", },
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_srw             , "         srw", },
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sld             , "         sld", },
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_srad            , "        srad", },
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_srd             , "         srd", },
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_and_ (void)
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("and.         17, 14, 15");
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_andc_ (void)
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("andc.        17, 14, 15");
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_eqv_ (void)
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("eqv.         17, 14, 15");
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nand_ (void)
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nand.        17, 14, 15");
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nor_ (void)
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nor.         17, 14, 15");
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_or_ (void)
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("or.          17, 14, 15");
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_orc_ (void)
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("orc.         17, 14, 15");
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_xor_ (void)
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("xor.         17, 14, 15");
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_slw_ (void)
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("slw.         17, 14, 15");
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_sraw_ (void)
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("sraw.        17, 14, 15");
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_srw_ (void)
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("srw.         17, 14, 15");
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_sld_ (void)
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("sld.         17, 14, 15");
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_srad_ (void)
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("srad.        17, 14, 15");
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_srd_ (void)
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("srd.         17, 14, 15");
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ilr_ops_two[] = {
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_and_            , "        and.", },
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_andc_           , "       andc.", },
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_eqv_            , "        eqv.", },
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nand_           , "       nand.", },
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nor_            , "        nor.", },
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_or_             , "         or.", },
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_orc_            , "        orc.", },
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_xor_            , "        xor.", },
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_slw_            , "        slw.", },
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sraw_           , "       sraw.", },
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_srw_            , "        srw.", },
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sld_            , "        sld.", },
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_srad_           , "       srad.", },
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_srd_            , "        srd.", },
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cmpw (void)
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cmpw         2, 14, 15");
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cmplw (void)
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cmplw        2, 14, 15");
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cmpd (void)
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cmpd         2, 14, 15");
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cmpld (void)
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cmpld        2, 14, 15");
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_icr_ops_two[] = {
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cmpw            , "        cmpw", },
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cmplw           , "       cmplw", },
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cmpd            , "        cmpd", },
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cmpld           , "       cmpld", },
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_cmpwi (void);
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_cmpwi", "cmpwi         2, 14, 0");
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_cmplwi (void);
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_cmplwi", "cmplwi        2, 14, 0");
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_cmpdi (void);
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_cmpdi", "cmpdi        2, 14, 0");
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_cmpldi (void);
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_cmpldi", "cmpldi       2, 14, 0");
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_icr_ops_two_i16[] = {
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cmpwi           , "       cmpwi", },
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cmplwi          , "      cmplwi", },
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cmpdi           , "       cmpdi", },
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cmpldi          , "      cmpldi", },
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_addi (void);
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_addi", "addi         17, 14, 0");
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_addic (void);
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_addic", "addic        17, 14, 0");
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_addis (void);
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_addis", "addis        17, 14, 0");
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_mulli (void);
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_mulli", "mulli        17, 14, 0");
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_subfic (void);
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_subfic", "subfic       17, 14, 0");
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ia_ops_two_i16[] = {
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addi            , "        addi", },
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addic           , "       addic", },
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addis           , "       addis", },
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulli           , "       mulli", },
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfic          , "      subfic", },
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_addic_ (void);
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_addic_", "addic.       17, 14, 0");
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_iar_ops_two_i16[] = {
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addic_          , "      addic.", },
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_ori (void);
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_ori", "ori       17, 14, 0");
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_oris (void);
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_oris", "oris       17, 14, 0");
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_xori (void);
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_xori", "xori       17, 14, 0");
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_xoris (void);
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_xoris", "xoris       17, 14, 0");
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_il_ops_two_i16[] = {
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_ori             , "         ori", },
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_oris            , "        oris", },
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_xori            , "        xori", },
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_xoris           , "       xoris", },
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_andi_ (void);
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_andi_", "andi.       17, 14, 0");
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_andis_ (void);
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_andis_", "andis.      17, 14, 0");
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ilr_ops_two_i16[] = {
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_andi_           , "       andi.", },
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_andis_          , "      andis.", },
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_crand (void)
1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("crand        17, 14, 15");
1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_crandc (void)
1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("crandc       17, 14, 15");
1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_creqv (void)
1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("creqv        17, 14, 15");
1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_crnand (void)
1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("crnand       17, 14, 15");
1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_crnor (void)
1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("crnor        17, 14, 15");
1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cror (void)
1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cror         17, 14, 15");
1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_crorc (void)
1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("crorc        17, 14, 15");
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_crxor (void)
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("crxor        17, 14, 15");
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_crl_ops_two[] = {
1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_crand           , "       crand", },
1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_crandc          , "      crandc", },
1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_creqv           , "       creqv", },
1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_crnand          , "      crnand", },
1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_crnor           , "       crnor", },
1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cror            , "        cror", },
1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_crorc           , "       crorc", },
1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_crxor           , "       crxor", },
1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addme (void)
1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addme        17, 14");
1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addmeo (void)
1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addmeo       17, 14");
1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addze (void)
1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addze        17, 14");
1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addzeo (void)
1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addzeo       17, 14");
1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfme (void)
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfme       17, 14");
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfmeo (void)
1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfmeo      17, 14");
1192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfze (void)
1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfze       17, 14");
1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfzeo (void)
1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfzeo      17, 14");
1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_iac_ops_one[] = {
1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addme           , "       addme", },
1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addmeo          , "      addmeo", },
1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addze           , "       addze", },
1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addzeo          , "      addzeo", },
1209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfme          , "      subfme", },
1210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfmeo         , "     subfmeo", },
1211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfze          , "      subfze", },
1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfzeo         , "     subfzeo", },
1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addme_ (void)
1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addme.       17, 14");
1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addmeo_ (void)
1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addmeo.      17, 14");
1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addze_ (void)
1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addze.       17, 14");
1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_addzeo_ (void)
1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("addzeo.      17, 14");
1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfme_ (void)
1237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfme.      17, 14");
1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfmeo_ (void)
1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfmeo.     17, 14");
1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfze_ (void)
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfze.      17, 14");
1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_subfzeo_ (void)
1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("subfzeo.     17, 14");
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_iacr_ops_one[] = {
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addme_          , "      addme.", },
1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addmeo_         , "     addmeo.", },
1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addze_          , "      addze.", },
1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_addzeo_         , "     addzeo.", },
1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfme_         , "     subfme.", },
1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfmeo_        , "    subfmeo.", },
1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfze_         , "     subfze.", },
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_subfzeo_        , "    subfzeo.", },
1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cntlzw (void)
1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cntlzw       17, 14");
1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_extsb (void)
1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("extsb        17, 14");
1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_extsh (void)
1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("extsh        17, 14");
1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_neg (void)
1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("neg          17, 14");
1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nego (void)
1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nego         17, 14");
1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cntlzd (void)
1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cntlzd       17, 14");
1297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_extsw (void)
1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("extsw        17, 14");
1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_il_ops_one[] = {
1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cntlzw          , "      cntlzw", },
1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_extsb           , "       extsb", },
1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_extsh           , "       extsh", },
1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_neg             , "         neg", },
1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nego            , "        nego", },
1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cntlzd          , "      cntlzd", },
1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_extsw           , "       extsw", },
1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cntlzw_ (void)
1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cntlzw.      17, 14");
1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_extsb_ (void)
1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("extsb.       17, 14");
1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_extsh_ (void)
1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("extsh.       17, 14");
1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_neg_ (void)
1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("neg.         17, 14");
1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nego_ (void)
1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nego.        17, 14");
1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_cntlzd_ (void)
1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("cntlzd.      17, 14");
1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_extsw_ (void)
1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("extsw.       17, 14");
1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ilr_ops_one[] = {
1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cntlzw_         , "     cntlzw.", },
1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_extsb_          , "      extsb.", },
1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_extsh_          , "      extsh.", },
1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_neg_            , "        neg.", },
1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nego_           , "       nego.", },
1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_cntlzd_         , "     cntlzd.", },
1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_extsw_          , "      extsw.", },
1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rlwimi (void);
1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rlwimi", "rlwimi      17, 14, 0, 0, 0");
1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rlwinm (void);
1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rlwinm", "rlwinm      17, 14, 0, 0, 0");
1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rlwnm (void);
1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rlwnm", "rlwnm      17, 14, 15, 0, 0");
1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_srawi (void);
1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_srawi", "srawi      17, 14, 0");
1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mfcr (void)
1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mfcr         17");
1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mfspr (void)
1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mfspr        17, 1");
1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mtspr (void)
1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mtspr        1, 14");
1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldcl (void);
1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldcl", "rldcl       17, 14, 15, 0");
1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldcr (void);
1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldcr", "rldcr       17, 14, 15, 0");
1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldic (void);
1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldic", "rldic       17, 14, 0, 0");
1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldicl (void);
1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldicl", "rldicl      17, 14, 0, 0");
1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldicr (void);
1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldicr", "rldicr      17, 14, 0, 0");
1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldimi (void);
1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldimi", "rldimi      17, 14, 0, 0");
1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_sradi (void);
1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_sradi", "sradi      17, 14, 0");
1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_il_ops_spe[] = {
1419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rlwimi          , "      rlwimi", },
1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rlwinm          , "      rlwinm", },
1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rlwnm           , "       rlwnm", },
1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_srawi           , "       srawi", },
1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mfcr            , "        mfcr", },
1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mfspr           , "       mfspr", },
1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mtspr           , "       mtspr", },
1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldcl           , "       rldcl", },
1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldcr           , "       rldcr", },
1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldic           , "       rldic", },
1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldicl          , "      rldicl", },
1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldicr          , "      rldicr", },
1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldimi          , "      rldimi", },
1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sradi           , "       sradi", },
1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rlwimi_ (void);
1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rlwimi_", "rlwimi.      17, 14, 0, 0, 0");
1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rlwinm_ (void);
1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rlwinm_", "rlwinm.      17, 14, 0, 0, 0");
1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rlwnm_ (void);
1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rlwnm_", "rlwnm.      17, 14, 15, 0, 0");
1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_srawi_ (void);
1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_srawi_", "srawi.      17, 14, 0");
1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_mcrf (void);
1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_mcrf", "mcrf      0, 0");
1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_mcrxr (void);
1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_mcrxr", "mcrxr      0");
1455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_mtcrf (void);
1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_mtcrf", "mtcrf      0, 14");
1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldcl_ (void);
1461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldcl_", "rldcl.      17, 14, 15, 0");
1462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldcr_ (void);
1464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldcr_", "rldcr.      17, 14, 15, 0");
1465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldic_ (void);
1467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldic_", "rldic.      17, 14, 0, 0");
1468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldicl_ (void);
1470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldicl_", "rldicl.     17, 14, 0, 0");
1471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldicr_ (void);
1473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldicr_", "rldicr.     17, 14, 0, 0");
1474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_rldimi_ (void);
1476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_rldimi_", "rldimi.     17, 14, 0, 0");
1477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_sradi_ (void);
1479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_sradi_", "sradi.      17, 14, 0");
1480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ilr_ops_spe[] = {
1483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rlwimi_         , "     rlwimi.", },
1484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rlwinm_         , "     rlwinm.", },
1485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rlwnm_          , "      rlwnm.", },
1486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_srawi_          , "      srawi.", },
1487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mcrf            , "        mcrf", },
1488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mcrxr           , "       mcrxr", },
1489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mtcrf           , "       mtcrf", },
1490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldcl_          , "      rldcl.", },
1492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldcr_          , "      rldcr.", },
1493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldic_          , "      rldic.", },
1494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldicl_         , "     rldicl.", },
1495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldicr_         , "     rldicr.", },
1496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_rldimi_         , "     rldimi.", },
1497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sradi_          , "      sradi.", },
1498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lbz (void);
1503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lbz", "lbz          17,0(14)");
1504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lbzu (void);
1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lbzu", "lbzu          17,0(14)");
1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lha (void);
1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lha", "lha          17,0(14)");
1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lhau (void);
1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lhau", "lhau          17,0(14)");
1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lhz (void);
1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lhz", "lhz          17,0(14)");
1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lhzu (void);
1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lhzu", "lhzu         17,0(14)");
1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lwz (void);
1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lwz", "lwz          17,0(14)");
1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lwzu (void);
1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lwzu", "lwzu          17,0(14)");
1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_ld (void);
1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_ld", "ld            17,0(14)");
1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_ldu (void);
1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_ldu", "ldu           17,0(14)");
1532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lwa (void);
1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lwa", "lwa           17,0(14)");
1535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ild_ops_two_i16[] = {
1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lbz             , "         lbz", },
1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lbzu            , "        lbzu", },
1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lha             , "         lha", },
1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lhau            , "        lhau", },
1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lhz             , "         lhz", },
1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lhzu            , "        lhzu", },
1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lwz             , "         lwz", },
1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lwzu            , "        lwzu", },
1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_ld              , "          ld", },
1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_ldu             , "         ldu", },
1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lwa             , "         lwa", },
1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lbzx (void)
1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lbzx         17,14,15");
1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lbzux (void)
1560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lbzux        17,14,15");
1562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lhax (void)
1565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lhax         17,14,15");
1567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lhaux (void)
1570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lhaux        17,14,15");
1572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lhzx (void)
1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lhzx         17,14,15");
1577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lhzux (void)
1580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lhzux        17,14,15");
1582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lwzx (void)
1585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lwzx         17,14,15");
1587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lwzux (void)
1590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lwzux        17,14,15");
1592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_ldx (void)
1596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("ldx         17,14,15");
1598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_ldux (void)
1601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("ldux        17,14,15");
1603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lwax (void)
1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lwax        17,14,15");
1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lwaux (void)
1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lwaux        17,14,15");
1613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ild_ops_two[] = {
1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lbzx            , "        lbzx", },
1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lbzux           , "       lbzux", },
1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lhax            , "        lhax", },
1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lhaux           , "       lhaux", },
1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lhzx            , "        lhzx", },
1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lhzux           , "       lhzux", },
1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lwzx            , "        lwzx", },
1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lwzux           , "       lwzux", },
1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_ldx             , "         ldx", },
1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_ldux            , "        ldux", },
1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lwax            , "        lwax", },
1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lwaux           , "       lwaux", },
1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stb (void);
1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stb", "stb          14,0(15)");
1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stbu (void);
1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stbu", "stbu          14,0(15)");
1639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_sth (void);
1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_sth", "sth          14,0(15)");
1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_sthu (void);
1644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_sthu", "sthu         14,0(15)");
1645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stw (void);
1647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stw", "stw          14,0(15)");
1648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stwu (void);
1650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stwu", "stwu          14,0(15)");
1651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_std (void);
1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_std", "std          14,0(15)");
1655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stdu (void);
1657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stdu", "stdu          14,0(15)");
1658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ist_ops_three_i16[] = {
1661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stb             , "         stb", },
1662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stbu            , "        stbu", },
1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sth             , "         sth", },
1664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sthu            , "        sthu", },
1665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stw             , "         stw", },
1666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stwu            , "        stwu", },
1667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_std             , "         std", },
1669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stdu            , "        stdu", },
1670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stbx (void)
1675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stbx         14,15,16");
1677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stbux (void)
1680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stbux        14,15,16");
1682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_sthx (void)
1685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("sthx         14,15,16");
1687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_sthux (void)
1690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("sthux        14,15,16");
1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stwx (void)
1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stwx         14,15,16");
1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stwux (void)
1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stwux        14,15,16");
1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stdx (void)
1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stdx         14,15,16");
1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stdux (void)
1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stdux        14,15,16");
1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ist_ops_three[] = {
1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stbx            , "        stbx", },
1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stbux           , "       stbux", },
1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sthx            , "        sthx", },
1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_sthux           , "       sthux", },
1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stwx            , "        stwx", },
1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stwux           , "       stwux", },
1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stdx            , "        stdx", },
1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stdux           , "       stdux", },
1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
1731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtests_popcnt_one(void)
1732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("popcntb      17, 14");
1734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic test_t tests_popcnt_ops_one[] = {
1737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    { &tests_popcnt_one            , "        popcntb", },
1738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    { NULL,                   NULL,           },
1739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
1740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fsel (void)
1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fsel         17, 14, 15, 16");
1745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmadd (void)
1748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmadd        17, 14, 15, 16");
1750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmadds (void)
1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmadds       17, 14, 15, 16");
1755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmsub (void)
1758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmsub        17, 14, 15, 16");
1760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmsubs (void)
1763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmsubs       17, 14, 15, 16");
1765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnmadd (void)
1768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnmadd       17, 14, 15, 16");
1770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnmadds (void)
1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnmadds      17, 14, 15, 16");
1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnmsub (void)
1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnmsub       17, 14, 15, 16");
1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnmsubs (void)
1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnmsubs      17, 14, 15, 16");
1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fa_ops_three[] = {
1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fsel            , "        fsel", },
1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmadd           , "       fmadd", },
1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmadds          , "      fmadds", },
1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmsub           , "       fmsub", },
1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmsubs          , "      fmsubs", },
1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnmadd          , "      fnmadd", },
1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnmadds         , "     fnmadds", },
1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnmsub          , "      fnmsub", },
1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnmsubs         , "     fnmsubs", },
1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
1800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fsel_ (void)
1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fsel.        17, 14, 15, 16");
1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmadd_ (void)
1808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmadd.       17, 14, 15, 16");
1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmadds_ (void)
1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmadds.      17, 14, 15, 16");
1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmsub_ (void)
1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmsub.       17, 14, 15, 16");
1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmsubs_ (void)
1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmsubs.      17, 14, 15, 16");
1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnmadd_ (void)
1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnmadd.      17, 14, 15, 16");
1830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnmadds_ (void)
1833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnmadds.     17, 14, 15, 16");
1835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnmsub_ (void)
1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnmsub.      17, 14, 15, 16");
1840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnmsubs_ (void)
1843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnmsubs.     17, 14, 15, 16");
1845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_far_ops_three[] = {
1848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fsel_           , "       fsel.", },
1849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmadd_          , "      fmadd.", },
1850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmadds_         , "     fmadds.", },
1851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmsub_          , "      fmsub.", },
1852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmsubs_         , "     fmsubs.", },
1853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnmadd_         , "     fnmadd.", },
1854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnmadds_        , "    fnmadds.", },
1855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnmsub_         , "     fnmsub.", },
1856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnmsubs_        , "    fnmsubs.", },
1857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
1860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
1862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fadd (void)
1863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fadd         17, 14, 15");
1865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fadds (void)
1868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fadds        17, 14, 15");
1870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fsub (void)
1873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fsub         17, 14, 15");
1875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fsubs (void)
1878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fsubs        17, 14, 15");
1880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmul (void)
1883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmul         17, 14, 15");
1885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmuls (void)
1888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmuls        17, 14, 15");
1890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fdiv (void)
1893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fdiv         17, 14, 15");
1895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fdivs (void)
1898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fdivs        17, 14, 15");
1900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fa_ops_two[] = {
1903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fadd            , "        fadd", },
1904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fadds           , "       fadds", },
1905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fsub            , "        fsub", },
1906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fsubs           , "       fsubs", },
1907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmul            , "        fmul", },
1908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmuls           , "       fmuls", },
1909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fdiv            , "        fdiv", },
1910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fdivs           , "       fdivs", },
1911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
1914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
1916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fadd_ (void)
1917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fadd.        17, 14, 15");
1919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fadds_ (void)
1922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fadds.       17, 14, 15");
1924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fsub_ (void)
1927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fsub.        17, 14, 15");
1929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fsubs_ (void)
1932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fsubs.       17, 14, 15");
1934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmul_ (void)
1937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmul.        17, 14, 15");
1939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmuls_ (void)
1942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmuls.       17, 14, 15");
1944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fdiv_ (void)
1947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fdiv.        17, 14, 15");
1949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fdivs_ (void)
1952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fdivs.       17, 14, 15");
1954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_far_ops_two[] = {
1957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fadd_           , "       fadd.", },
1958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fadds_          , "      fadds.", },
1959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fsub_           , "       fsub.", },
1960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fsubs_          , "      fsubs.", },
1961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmul_           , "       fmul.", },
1962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmuls_          , "      fmuls.", },
1963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fdiv_           , "       fdiv.", },
1964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fdivs_          , "      fdivs.", },
1965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
1968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
1970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fcmpo (void)
1971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fcmpo        2, 14, 15");
1973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fcmpu (void)
1976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fcmpu        2, 14, 15");
1978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fcr_ops_two[] = {
1981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fcmpo           , "       fcmpo", },
1982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fcmpu           , "       fcmpu", },
1983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
1984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
1985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
1986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
1988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fres (void)
1990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fres         17, 14");
1992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_frsqrte (void)
1995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("frsqrte      17, 14");
1997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_frsp (void)
2000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("frsp         17, 14");
2002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fctiw (void)
2005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fctiw        17, 14");
2007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fctiwz (void)
2010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fctiwz       17, 14");
2012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmr (void)
2015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmr          17, 14");
2017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fneg (void)
2020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fneg         17, 14");
2022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fabs (void)
2025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fabs         17, 14");
2027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnabs (void)
2030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnabs        17, 14");
2032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fsqrt (void)
2035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fsqrt        17, 14");
2037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
2040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fcfid (void)
2041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fcfid        17, 14");
2043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fctid (void)
2046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fctid        17, 14");
2048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fctidz (void)
2051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fctidz       17, 14");
2053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
2055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fa_ops_one[] = {
2057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    { &test_fres            , "        fres", },
2058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    { &test_frsqrte         , "     frsqrte", },
2059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_frsp            , "        frsp", },
2060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fctiw           , "       fctiw", },
2061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fctiwz          , "      fctiwz", },
2062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmr             , "         fmr", },
2063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fneg            , "        fneg", },
2064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fabs            , "        fabs", },
2065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnabs           , "       fnabs", },
2066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fsqrt           , "       fsqrt", },
2067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
2068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fcfid           , "       fcfid", },
2069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fctid           , "       fctid", },
2070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fctidz          , "      fctidz", },
2071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
2072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
2075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
2077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fres_ (void)
2079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fres.        17, 14");
2081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_frsqrte_ (void)
2084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     __asm__ __volatile__ ("frsqrte.     17, 14");
2086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_frsp_ (void)
2089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("frsp.        17, 14");
2091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fctiw_ (void)
2094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fctiw.       17, 14");
2096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fctiwz_ (void)
2099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fctiwz.      17, 14");
2101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fmr_ (void)
2104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fmr.         17, 14");
2106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fneg_ (void)
2109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fneg.        17, 14");
2111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fabs_ (void)
2114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fabs.        17, 14");
2116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fnabs_ (void)
2119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fnabs.       17, 14");
2121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
2124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fcfid_ (void)
2125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fcfid.       17, 14");
2127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fctid_ (void)
2130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fctid.       17, 14");
2132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_fctidz_ (void)
2135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("fctidz.      17, 14");
2137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
2139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_far_ops_one[] = {
2141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    { &test_fres_           , "       fres.", },
2142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    { &test_frsqrte_        , "    frsqrte.", },
2143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_frsp_           , "       frsp.", },
2144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fctiw_          , "      fctiw.", },
2145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fctiwz_         , "     fctiwz.", },
2146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fmr_            , "        fmr.", },
2147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fneg_           , "       fneg.", },
2148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fabs_           , "       fabs.", },
2149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fnabs_          , "      fnabs.", },
2150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
2151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fcfid_          , "      fcfid.", },
2152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fctid_          , "      fctid.", },
2153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_fctidz_         , "     fctidz.", },
2154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
2155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
2158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
2160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fl_ops_spe[] = {
2161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
2164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
2166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_flr_ops_spe[] = {
2167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
2170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
2173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lfs (void);
2174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lfs", "lfs          17,0(14)");
2175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lfsu (void);
2177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lfsu", "lfsu          17,0(14)");
2178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lfd (void);
2180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lfd", "lfd          17,0(14)");
2181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_lfdu (void);
2183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_lfdu", "lfdu          17,0(14)");
2184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fld_ops_two_i16[] = {
2186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lfs             , "         lfs", },
2187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lfsu            , "        lfsu", },
2188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lfd             , "         lfd", },
2189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lfdu            , "        lfdu", },
2190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
2193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
2195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lfsx (void)
2196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lfsx         17,14,15");
2198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lfsux (void)
2201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lfsux        17,14,15");
2203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lfdx (void)
2206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lfdx         17,14,15");
2208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lfdux (void)
2211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lfdux        17,14,15");
2213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fld_ops_two[] = {
2216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lfsx            , "        lfsx", },
2217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lfsux           , "       lfsux", },
2218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lfdx            , "        lfdx", },
2219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lfdux           , "       lfdux", },
2220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
2223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
2225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stfs (void);
2226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stfs", "stfs          14,0(15)");
2227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stfsu (void);
2229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stfsu", "stfsu          14,0(15)");
2230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stfd (void);
2232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stfd", "stfd          14,0(15)");
2233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_stfdu (void);
2235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_stfdu", "stfdu         14,0(15)");
2236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fst_ops_three_i16[] = {
2238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stfs             , "         stfs", },
2239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stfsu            , "        stfsu", },
2240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stfd             , "         stfd", },
2241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stfdu            , "        stfdu", },
2242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
2245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
2247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stfsx (void)
2248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stfsx         14,15,16");
2250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stfsux (void)
2253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stfsux        14,15,16");
2255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stfdx (void)
2258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stfdx         14,15,16");
2260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stfdux (void)
2263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stfdux        14,15,16");
2265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_fst_ops_three[] = {
2268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stfsx            , "        stfsx", },
2269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stfsux           , "       stfsux", },
2270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stfdx            , "        stfdx", },
2271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stfdux           , "       stfdux", },
2272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
2275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
2278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmhaddshs (void)
2279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmhaddshs    17, 14, 15, 16");
2281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmhraddshs (void)
2284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmhraddshs   17, 14, 15, 16");
2286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmladduhm (void)
2289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmladduhm    17, 14, 15, 16");
2291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmsumubm (void)
2294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmsumubm     17, 14, 15, 16");
2296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmsumuhm (void)
2299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmsumuhm     17, 14, 15, 16");
2301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmsumshs (void)
2304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmsumshs     17, 14, 15, 16");
2306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmsumuhs (void)
2309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmsumuhs     17, 14, 15, 16");
2311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmsummbm (void)
2314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmsummbm     17, 14, 15, 16");
2316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmsumshm (void)
2319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmsumshm     17, 14, 15, 16");
2321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_aa_ops_three[] = {
2324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmhaddshs       , "   vmhaddshs", },
2325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmhraddshs      , "  vmhraddshs", },
2326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmladduhm       , "   vmladduhm", },
2327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmsumubm        , "    vmsumubm", },
2328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmsumuhm        , "    vmsumuhm", },
2329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmsumshs        , "    vmsumshs", },
2330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmsumuhs        , "    vmsumuhs", },
2331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmsummbm        , "    vmsummbm", },
2332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmsumshm        , "    vmsumshm", },
2333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
2336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
2338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vperm (void)
2339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vperm        17, 14, 15, 16");
2341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsel (void)
2344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsel         17, 14, 15, 16");
2346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_al_ops_three[] = {
2349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vperm           , "       vperm", },
2350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsel            , "        vsel", },
2351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
2354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
2356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vaddubm (void)
2357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vaddubm      17, 14, 15");
2359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vadduhm (void)
2362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vadduhm      17, 14, 15");
2364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vadduwm (void)
2367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vadduwm      17, 14, 15");
2369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vaddubs (void)
2372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vaddubs      17, 14, 15");
2374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vadduhs (void)
2377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vadduhs      17, 14, 15");
2379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vadduws (void)
2382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vadduws      17, 14, 15");
2384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vaddsbs (void)
2387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vaddsbs      17, 14, 15");
2389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vaddshs (void)
2392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vaddshs      17, 14, 15");
2394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vaddsws (void)
2397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vaddsws      17, 14, 15");
2399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vaddcuw (void)
2402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vaddcuw      17, 14, 15");
2404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsububm (void)
2407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsububm      17, 14, 15");
2409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubuhm (void)
2412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubuhm      17, 14, 15");
2414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubuwm (void)
2417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubuwm      17, 14, 15");
2419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsububs (void)
2422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsububs      17, 14, 15");
2424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubuhs (void)
2427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubuhs      17, 14, 15");
2429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubuws (void)
2432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubuws      17, 14, 15");
2434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubsbs (void)
2437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubsbs      17, 14, 15");
2439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubshs (void)
2442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubshs      17, 14, 15");
2444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubsws (void)
2447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubsws      17, 14, 15");
2449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubcuw (void)
2452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubcuw      17, 14, 15");
2454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmuloub (void)
2457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmuloub      17, 14, 15");
2459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmulouh (void)
2462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmulouh      17, 14, 15");
2464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmulosb (void)
2467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmulosb      17, 14, 15");
2469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmulosh (void)
2472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmulosh      17, 14, 15");
2474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmuleub (void)
2477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmuleub      17, 14, 15");
2479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmuleuh (void)
2482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmuleuh      17, 14, 15");
2484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmulesb (void)
2487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmulesb      17, 14, 15");
2489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmulesh (void)
2492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmulesh      17, 14, 15");
2494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsumsws (void)
2497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsumsws      17, 14, 15");
2499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsum2sws (void)
2502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsum2sws     17, 14, 15");
2504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsum4ubs (void)
2507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsum4ubs     17, 14, 15");
2509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsum4sbs (void)
2512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsum4sbs     17, 14, 15");
2514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsum4shs (void)
2517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsum4shs     17, 14, 15");
2519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vavgub (void)
2522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vavgub       17, 14, 15");
2524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vavguh (void)
2527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vavguh       17, 14, 15");
2529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vavguw (void)
2532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vavguw       17, 14, 15");
2534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vavgsb (void)
2537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vavgsb       17, 14, 15");
2539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vavgsh (void)
2542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vavgsh       17, 14, 15");
2544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vavgsw (void)
2547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vavgsw       17, 14, 15");
2549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmaxub (void)
2552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmaxub       17, 14, 15");
2554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmaxuh (void)
2557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmaxuh       17, 14, 15");
2559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmaxuw (void)
2562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmaxuw       17, 14, 15");
2564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmaxsb (void)
2567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmaxsb       17, 14, 15");
2569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmaxsh (void)
2572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmaxsh       17, 14, 15");
2574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmaxsw (void)
2577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmaxsw       17, 14, 15");
2579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vminub (void)
2582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vminub       17, 14, 15");
2584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vminuh (void)
2587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vminuh       17, 14, 15");
2589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vminuw (void)
2592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vminuw       17, 14, 15");
2594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vminsb (void)
2597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vminsb       17, 14, 15");
2599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vminsh (void)
2602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vminsh       17, 14, 15");
2604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vminsw (void)
2607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vminsw       17, 14, 15");
2609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_aa_ops_two[] = {
2612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vaddubm         , "     vaddubm", },
2613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vadduhm         , "     vadduhm", },
2614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vadduwm         , "     vadduwm", },
2615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vaddubs         , "     vaddubs", },
2616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vadduhs         , "     vadduhs", },
2617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vadduws         , "     vadduws", },
2618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vaddsbs         , "     vaddsbs", },
2619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vaddshs         , "     vaddshs", },
2620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vaddsws         , "     vaddsws", },
2621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vaddcuw         , "     vaddcuw", },
2622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsububm         , "     vsububm", },
2623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubuhm         , "     vsubuhm", },
2624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubuwm         , "     vsubuwm", },
2625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsububs         , "     vsububs", },
2626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubuhs         , "     vsubuhs", },
2627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubuws         , "     vsubuws", },
2628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubsbs         , "     vsubsbs", },
2629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubshs         , "     vsubshs", },
2630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubsws         , "     vsubsws", },
2631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubcuw         , "     vsubcuw", },
2632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmuloub         , "     vmuloub", },
2633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmulouh         , "     vmulouh", },
2634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmulosb         , "     vmulosb", },
2635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmulosh         , "     vmulosh", },
2636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmuleub         , "     vmuleub", },
2637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmuleuh         , "     vmuleuh", },
2638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmulesb         , "     vmulesb", },
2639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmulesh         , "     vmulesh", },
2640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsumsws         , "     vsumsws", },
2641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsum2sws        , "    vsum2sws", },
2642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsum4ubs        , "    vsum4ubs", },
2643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsum4sbs        , "    vsum4sbs", },
2644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsum4shs        , "    vsum4shs", },
2645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vavgub          , "      vavgub", },
2646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vavguh          , "      vavguh", },
2647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vavguw          , "      vavguw", },
2648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vavgsb          , "      vavgsb", },
2649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vavgsh          , "      vavgsh", },
2650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vavgsw          , "      vavgsw", },
2651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmaxub          , "      vmaxub", },
2652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmaxuh          , "      vmaxuh", },
2653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmaxuw          , "      vmaxuw", },
2654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmaxsb          , "      vmaxsb", },
2655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmaxsh          , "      vmaxsh", },
2656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmaxsw          , "      vmaxsw", },
2657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vminub          , "      vminub", },
2658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vminuh          , "      vminuh", },
2659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vminuw          , "      vminuw", },
2660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vminsb          , "      vminsb", },
2661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vminsh          , "      vminsh", },
2662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vminsw          , "      vminsw", },
2663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
2666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
2668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vand (void)
2669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vand         17, 14, 15");
2671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vor (void)
2674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vor          17, 14, 15");
2676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vxor (void)
2679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vxor         17, 14, 15");
2681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vandc (void)
2684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vandc        17, 14, 15");
2686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vnor (void)
2689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vnor         17, 14, 15");
2691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrlb (void)
2694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrlb         17, 14, 15");
2696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrlh (void)
2699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrlh         17, 14, 15");
2701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrlw (void)
2704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrlw         17, 14, 15");
2706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vslb (void)
2709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vslb         17, 14, 15");
2711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vslh (void)
2714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vslh         17, 14, 15");
2716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vslw (void)
2719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vslw         17, 14, 15");
2721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsrb (void)
2724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsrb         17, 14, 15");
2726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsrh (void)
2729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsrh         17, 14, 15");
2731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsrw (void)
2734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsrw         17, 14, 15");
2736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsrab (void)
2739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsrab        17, 14, 15");
2741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsrah (void)
2744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsrah        17, 14, 15");
2746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsraw (void)
2749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsraw        17, 14, 15");
2751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkuhum (void)
2754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkuhum      17, 14, 15");
2756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkuwum (void)
2759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkuwum      17, 14, 15");
2761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkuhus (void)
2764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkuhus      17, 14, 15");
2766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkuwus (void)
2769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkuwus      17, 14, 15");
2771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkshus (void)
2774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkshus      17, 14, 15");
2776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkswus (void)
2779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkswus      17, 14, 15");
2781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkshss (void)
2784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkshss      17, 14, 15");
2786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkswss (void)
2789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkswss      17, 14, 15");
2791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vpkpx (void)
2794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vpkpx        17, 14, 15");
2796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmrghb (void)
2799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmrghb       17, 14, 15");
2801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmrghh (void)
2804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmrghh       17, 14, 15");
2806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmrghw (void)
2809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmrghw       17, 14, 15");
2811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmrglb (void)
2814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmrglb       17, 14, 15");
2816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmrglh (void)
2819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmrglh       17, 14, 15");
2821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmrglw (void)
2824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmrglw       17, 14, 15");
2826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vslo (void)
2829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vslo         17, 14, 15");
2831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsro (void)
2834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsro         17, 14, 15");
2836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_al_ops_two[] = {
2839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vand            , "        vand", },
2840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vor             , "         vor", },
2841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vxor            , "        vxor", },
2842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vandc           , "       vandc", },
2843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vnor            , "        vnor", },
2844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrlb            , "        vrlb", },
2845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrlh            , "        vrlh", },
2846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrlw            , "        vrlw", },
2847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vslb            , "        vslb", },
2848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vslh            , "        vslh", },
2849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vslw            , "        vslw", },
2850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsrb            , "        vsrb", },
2851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsrh            , "        vsrh", },
2852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsrw            , "        vsrw", },
2853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsrab           , "       vsrab", },
2854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsrah           , "       vsrah", },
2855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsraw           , "       vsraw", },
2856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkuhum         , "     vpkuhum", },
2857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkuwum         , "     vpkuwum", },
2858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkuhus         , "     vpkuhus", },
2859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkuwus         , "     vpkuwus", },
2860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkshus         , "     vpkshus", },
2861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkswus         , "     vpkswus", },
2862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkshss         , "     vpkshss", },
2863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkswss         , "     vpkswss", },
2864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vpkpx           , "       vpkpx", },
2865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmrghb          , "      vmrghb", },
2866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmrghh          , "      vmrghh", },
2867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmrghw          , "      vmrghw", },
2868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmrglb          , "      vmrglb", },
2869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmrglh          , "      vmrglh", },
2870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmrglw          , "      vmrglw", },
2871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vslo            , "        vslo", },
2872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsro            , "        vsro", },
2873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
2876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
2878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vupkhsb (void)
2879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vupkhsb      17, 14");
2881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vupkhsh (void)
2884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vupkhsh      17, 14");
2886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vupkhpx (void)
2889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vupkhpx      17, 14");
2891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vupklsb (void)
2894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vupklsb      17, 14");
2896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vupklsh (void)
2899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vupklsh      17, 14");
2901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vupklpx (void)
2904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vupklpx      17, 14");
2906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_al_ops_one[] = {
2909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vupkhsb         , "     vupkhsb", },
2910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vupkhsh         , "     vupkhsh", },
2911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vupkhpx         , "     vupkhpx", },
2912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vupklsb         , "     vupklsb", },
2913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vupklsh         , "     vupklsh", },
2914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vupklpx         , "     vupklpx", },
2915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
2918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
2920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtub (void)
2921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtub     17, 14, 15");
2923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtuh (void)
2926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtuh     17, 14, 15");
2928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtuw (void)
2931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtuw     17, 14, 15");
2933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtsb (void)
2936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtsb     17, 14, 15");
2938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtsh (void)
2941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtsh     17, 14, 15");
2943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtsw (void)
2946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtsw     17, 14, 15");
2948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpequb (void)
2951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpequb     17, 14, 15");
2953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpequh (void)
2956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpequh     17, 14, 15");
2958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpequw (void)
2961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpequw     17, 14, 15");
2963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ac_ops_two[] = {
2966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtub        , "    vcmpgtub", },
2967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtuh        , "    vcmpgtuh", },
2968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtuw        , "    vcmpgtuw", },
2969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtsb        , "    vcmpgtsb", },
2970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtsh        , "    vcmpgtsh", },
2971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtsw        , "    vcmpgtsw", },
2972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpequb        , "    vcmpequb", },
2973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpequh        , "    vcmpequh", },
2974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpequw        , "    vcmpequw", },
2975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
2976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
2977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
2978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
2980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtub_ (void)
2981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtub.    17, 14, 15");
2983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtuh_ (void)
2986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtuh.    17, 14, 15");
2988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtuw_ (void)
2991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtuw.    17, 14, 15");
2993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtsb_ (void)
2996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtsb.    17, 14, 15");
2998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtsh_ (void)
3001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtsh.    17, 14, 15");
3003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtsw_ (void)
3006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtsw.    17, 14, 15");
3008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpequb_ (void)
3011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpequb.    17, 14, 15");
3013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpequh_ (void)
3016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpequh.    17, 14, 15");
3018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpequw_ (void)
3021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpequw.    17, 14, 15");
3023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_acr_ops_two[] = {
3026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtub_       , "   vcmpgtub.", },
3027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtuh_       , "   vcmpgtuh.", },
3028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtuw_       , "   vcmpgtuw.", },
3029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtsb_       , "   vcmpgtsb.", },
3030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtsh_       , "   vcmpgtsh.", },
3031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtsw_       , "   vcmpgtsw.", },
3032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpequb_       , "   vcmpequb.", },
3033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpequh_       , "   vcmpequh.", },
3034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpequw_       , "   vcmpequw.", },
3035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsl (void)
3041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsl          17, 14, 15");
3043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsr (void)
3046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsr          17, 14, 15");
3048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vspltb (void);
3051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vspltb", "vspltb       17, 14, 0");
3052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vsplth (void);
3054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vsplth", "vsplth       17, 14, 0");
3055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vspltw (void);
3057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vspltw", "vspltw       17, 14, 0");
3058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vspltisb (void);
3060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vspltisb", "vspltisb       17, 0");
3061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vspltish (void);
3063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vspltish", "vspltish       17, 0");
3064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vspltisw (void);
3066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vspltisw", "vspltisw       17, 0");
3067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vsldoi (void);
3069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vsldoi", "vsldoi       17, 14, 15, 0");
3070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lvsl (void)
3072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lvsl         17, 14, 15");
3074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lvsr (void)
3077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lvsr         17, 14, 15");
3079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_av_int_ops_spe[] = {
3082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsl             , "         vsl", },
3083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsr             , "         vsr", },
3084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vspltb          , "      vspltb", },
3085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsplth          , "      vsplth", },
3086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vspltw          , "      vspltw", },
3087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vspltisb        , "    vspltisb", },
3088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vspltish        , "    vspltish", },
3089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vspltisw        , "    vspltisw", },
3090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsldoi          , "      vsldoi", },
3091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lvsl            , "        lvsl", },
3092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lvsr            , "        lvsr", },
3093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lvebx (void)
3099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lvebx        17,14,15");
3101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lvehx (void)
3104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lvehx        17,14,15");
3106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lvewx (void)
3109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lvewx        17,14,15");
3111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lvx (void)
3114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lvx          17,14,15");
3116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_lvxl (void)
3119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("lvxl         17,14,15");
3121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ald_ops_two[] = {
3124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lvebx           , "       lvebx", },
3125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lvehx           , "       lvehx", },
3126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lvewx           , "       lvewx", },
3127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lvx             , "         lvx", },
3128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_lvxl            , "        lvxl", },
3129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stvebx (void)
3135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stvebx       14,15,16");
3137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stvehx (void)
3140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stvehx       14,15,16");
3142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stvewx (void)
3145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stvewx       14,15,16");
3147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stvx (void)
3150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stvx         14,15,16");
3152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_stvxl (void)
3155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("stvxl        14,15,16");
3157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_ast_ops_three[] = {
3160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stvebx          , "      stvebx", },
3161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stvehx          , "      stvehx", },
3162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stvewx          , "      stvewx", },
3163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stvx            , "        stvx", },
3164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_stvxl           , "       stvxl", },
3165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if 1
3171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmaddfp (void)
3172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmaddfp      17, 14, 15, 16");
3174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vnmsubfp (void)
3177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vnmsubfp     17, 14, 15, 16");
3179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_afa_ops_three[] = {
3183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    { &test_vmaddfp         , "     vmaddfp", },
3184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    { &test_vnmsubfp        , "    vnmsubfp", },
3185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vaddfp (void)
3191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vaddfp       17, 14, 15");
3193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vsubfp (void)
3196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vsubfp       17, 14, 15");
3198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vmaxfp (void)
3201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vmaxfp       17, 14, 15");
3203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vminfp (void)
3206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vminfp       17, 14, 15");
3208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_afa_ops_two[] = {
3211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vaddfp          , "      vaddfp", },
3212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vsubfp          , "      vsubfp", },
3213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vmaxfp          , "      vmaxfp", },
3214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vminfp          , "      vminfp", },
3215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrfin (void)
3221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrfin        17, 14");
3223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrfiz (void)
3226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrfiz        17, 14");
3228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrfip (void)
3231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrfip        17, 14");
3233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrfim (void)
3236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrfim        17, 14");
3238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrefp (void)
3241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrefp        17, 14");
3243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vrsqrtefp (void)
3246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vrsqrtefp    17, 14");
3248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0   // TODO: Not yet supported
3251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vlogefp (void)
3252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vlogefp      17, 14");
3254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vexptefp (void)
3257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vexptefp     17, 14");
3259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_afa_ops_one[] = {
3263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrfin           , "       vrfin", },
3264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrfiz           , "       vrfiz", },
3265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrfip           , "       vrfip", },
3266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrfim           , "       vrfim", },
3267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrefp           , "       vrefp", },
3268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vrsqrtefp       , "   vrsqrtefp", },
3269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //    { &test_vlogefp         , "     vlogefp", },   // TODO: Not yet supported
3270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //    { &test_vexptefp        , "    vexptefp", },   // TODO: Not yet supported
3271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtfp (void)
3277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtfp     17, 14, 15");
3279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpeqfp (void)
3282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpeqfp     17, 14, 15");
3284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgefp (void)
3287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgefp     17, 14, 15");
3289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpbfp (void)
3292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpbfp      17, 14, 15");
3294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_afc_ops_two[] = {
3297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtfp        , "    vcmpgtfp", },
3298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpeqfp        , "    vcmpeqfp", },
3299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgefp        , "    vcmpgefp", },
3300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpbfp         , "     vcmpbfp", },
3301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgtfp_ (void)
3307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgtfp.    17, 14, 15");
3309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpeqfp_ (void)
3312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpeqfp.    17, 14, 15");
3314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpgefp_ (void)
3317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpgefp.    17, 14, 15");
3319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_vcmpbfp_ (void)
3322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("vcmpbfp.     17, 14, 15");
3324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_afcr_ops_two[] = {
3327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgtfp_       , "   vcmpgtfp.", },
3328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpeqfp_       , "   vcmpeqfp.", },
3329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpgefp_       , "   vcmpgefp.", },
3330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcmpbfp_        , "    vcmpbfp.", },
3331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
3336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vcfux (void);
3337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vcfux", "vcfux        17, 14, 0");
3338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vcfsx (void);
3340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vcfsx", "vcfsx        17, 14, 0");
3341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vctuxs (void);
3343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vctuxs", "vctuxs        17, 14, 0");
3344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void test_vctsxs (void);
3346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownASSEMBLY_FUNC("test_vctsxs", "vctsxs        17, 14, 0");
3347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_av_float_ops_spe[] = {
3349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcfux           , "       vcfux", },
3350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vcfsx           , "       vcfsx", },
3351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vctuxs          , "      vctuxs", },
3352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_vctsxs          , "      vctsxs", },
3353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
3356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Power ISA 2.03 support dcbtct and dcbtstct with valid hint values b00000 - 0b00111.
3358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * The ISA 2.06 added support for more valid hint values, but rather than tie ourselves
3359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * in knots trying to test all permuations of ISAs and valid hint values, we'll just
3360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * verify some of the base hint values from ISA 2.03.
3361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *
3362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * In a similar vein, in ISA 2.03, dcbtds had valid values of 0b01000 - 0b01010, whereas
3363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * ISA 2.06 expanded the range of valid hint values to 0b01000 - 0b01111.  We just test
3364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * one of the ISA 2.03-supported values for dcbtds.
3365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */
3366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_dcbtct (void)
3367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /*  dcbt RA, RB, TH */
3369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ASM_DCBT(17, 14, 1);
3370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ASM_DCBT(17, 14, 7);
3371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_dcbtds (void)
3374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /*  dcbt RA, RB, TH */
3376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ASM_DCBT(17, 14, 10);
3377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ASM_DCBT(17, 14, 0);
3378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ASM_DCBT(17, 14, 16);
3379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_dcbtst (void)
3382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
3383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /*  dcbtst RA, RB, TH */
3384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ASM_DCBTST(17, 14, 6);
3385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ASM_DCBTST(17, 14, 15);
3386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
3387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic test_t tests_dcbt[] = {
3390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_dcbtct       , "   dcbtct", },
3391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_dcbtds       , "   dcbtds", },
3392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { &test_dcbtst       , "   dcbtst", },
3393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    { NULL,                   NULL,           },
3394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
3395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (IS_PPC405)
3398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchw (void)
3399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchw       17, 14, 15");
3401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwo (void)
3404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwo      17, 14, 15");
3406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchws (void)
3409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchws      17, 14, 15");
3411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwso (void)
3414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwso     17, 14, 15");
3416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwsu (void)
3419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwsu     17, 14, 15");
3421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwsuo (void)
3424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwsuo    17, 14, 15");
3426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwu (void)
3429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwu      17, 14, 15");
3431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwuo (void)
3434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwuo     17, 14, 15");
3436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhw (void)
3439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhw       17, 14, 15");
3441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwo (void)
3444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwo      17, 14, 15");
3446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhws (void)
3449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhws      17, 14, 15");
3451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwso (void)
3454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwso     17, 14, 15");
3456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwsu (void)
3459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwsu     17, 14, 15");
3461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwsuo (void)
3464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwsuo    17, 14, 15");
3466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwu (void)
3469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwu      17, 14, 15");
3471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwuo (void)
3474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwuo     17, 14, 15");
3476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhw (void)
3479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhw       17, 14, 15");
3481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwo (void)
3484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwo      17, 14, 15");
3486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhws (void)
3489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhws      17, 14, 15");
3491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwso (void)
3494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwso     17, 14, 15");
3496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwsu (void)
3499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwsu     17, 14, 15");
3501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwsuo (void)
3504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwsuo    17, 14, 15");
3506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwu (void)
3509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwu      17, 14, 15");
3511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwuo (void)
3514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwuo     17, 14, 15");
3516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulchw (void)
3519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulchw       17, 14, 15");
3521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulchwu (void)
3524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulchwu      17, 14, 15");
3526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhhw (void)
3529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhhw       17, 14, 15");
3531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhhwu (void)
3534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhhwu      17, 14, 15");
3536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mullhw (void)
3539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mullhw       17, 14, 15");
3541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mullhwu (void)
3544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mullhwu      17, 14, 15");
3546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmacchw (void)
3549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmacchw      17, 14, 15");
3551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmacchwo (void)
3554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmacchwo     17, 14, 15");
3556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmacchws (void)
3559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmacchws     17, 14, 15");
3561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmacchwso (void)
3564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmacchwso    17, 14, 15");
3566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmachhw (void)
3569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmachhw      17, 14, 15");
3571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmachhwo (void)
3574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmachhwo     17, 14, 15");
3576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmachhws (void)
3579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmachhws     17, 14, 15");
3581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmachhwso (void)
3584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmachhwso    17, 14, 15");
3586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmaclhw (void)
3589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmaclhw      17, 14, 15");
3591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmaclhwo (void)
3594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmaclhwo     17, 14, 15");
3596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmaclhws (void)
3599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmaclhws     17, 14, 15");
3601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmaclhwso (void)
3604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmaclhwso    17, 14, 15");
3606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_p4m_ops_two[] = {
3609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchw          , "      macchw", },
3610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwo         , "     macchwo", },
3611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchws         , "     macchws", },
3612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwso        , "    macchwso", },
3613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwsu        , "    macchwsu", },
3614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwsuo       , "   macchwsuo", },
3615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwu         , "     macchwu", },
3616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwuo        , "    macchwuo", },
3617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhw          , "      machhw", },
3618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwo         , "     machhwo", },
3619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhws         , "     machhws", },
3620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwso        , "    machhwso", },
3621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwsu        , "    machhwsu", },
3622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwsuo       , "   machhwsuo", },
3623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwu         , "     machhwu", },
3624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwuo        , "    machhwuo", },
3625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhw          , "      maclhw", },
3626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwo         , "     maclhwo", },
3627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhws         , "     maclhws", },
3628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwso        , "    maclhwso", },
3629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwsu        , "    maclhwsu", },
3630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwsuo       , "   maclhwsuo", },
3631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwu         , "     maclhwu", },
3632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwuo        , "    maclhwuo", },
3633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulchw          , "      mulchw", },
3634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulchwu         , "     mulchwu", },
3635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhhw          , "      mulhhw", },
3636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhhwu         , "     mulhhwu", },
3637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mullhw          , "      mullhw", },
3638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mullhwu         , "     mullhwu", },
3639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmacchw         , "     nmacchw", },
3640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmacchwo        , "    nmacchwo", },
3641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmacchws        , "    nmacchws", },
3642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmacchwso       , "   nmacchwso", },
3643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmachhw         , "     nmachhw", },
3644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmachhwo        , "    nmachhwo", },
3645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmachhws        , "    nmachhws", },
3646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmachhwso       , "   nmachhwso", },
3647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmaclhw         , "     nmaclhw", },
3648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmaclhwo        , "    nmaclhwo", },
3649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmaclhws        , "    nmaclhws", },
3650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmaclhwso       , "   nmaclhwso", },
3651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (IS_PPC405) */
3654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (IS_PPC405)
3656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchw_ (void)
3657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchw.      17, 14, 15");
3659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwo_ (void)
3662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwo.     17, 14, 15");
3664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchws_ (void)
3667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchws.     17, 14, 15");
3669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwso_ (void)
3672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwso.    17, 14, 15");
3674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwsu_ (void)
3677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwsu.    17, 14, 15");
3679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwsuo_ (void)
3682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwsuo.   17, 14, 15");
3684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwu_ (void)
3687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwu.     17, 14, 15");
3689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_macchwuo_ (void)
3692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("macchwuo.    17, 14, 15");
3694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhw_ (void)
3697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhw.      17, 14, 15");
3699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwo_ (void)
3702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwo.     17, 14, 15");
3704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhws_ (void)
3707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhws.     17, 14, 15");
3709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwso_ (void)
3712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwso.    17, 14, 15");
3714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwsu_ (void)
3717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwsu.    17, 14, 15");
3719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwsuo_ (void)
3722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwsuo.   17, 14, 15");
3724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwu_ (void)
3727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwu.     17, 14, 15");
3729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_machhwuo_ (void)
3732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("machhwuo.    17, 14, 15");
3734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhw_ (void)
3737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhw.      17, 14, 15");
3739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwo_ (void)
3742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwo.     17, 14, 15");
3744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhws_ (void)
3747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhws.     17, 14, 15");
3749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwso_ (void)
3752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwso.    17, 14, 15");
3754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwsu_ (void)
3757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwsu.    17, 14, 15");
3759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwsuo_ (void)
3762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwsuo.   17, 14, 15");
3764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwu_ (void)
3767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwu.     17, 14, 15");
3769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_maclhwuo_ (void)
3772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("maclhwuo.    17, 14, 15");
3774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulchw_ (void)
3777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulchw.      17, 14, 15");
3779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulchwu_ (void)
3782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulchwu.     17, 14, 15");
3784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhhw_ (void)
3787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhhw.      17, 14, 15");
3789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mulhhwu_ (void)
3792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mulhhwu.     17, 14, 15");
3794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mullhw_ (void)
3797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mullhw.      17, 14, 15");
3799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_mullhwu_ (void)
3802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("mullhwu.     17, 14, 15");
3804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmacchw_ (void)
3807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmacchw.     17, 14, 15");
3809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmacchwo_ (void)
3812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmacchwo.    17, 14, 15");
3814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmacchws_ (void)
3817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmacchws.    17, 14, 15");
3819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmacchwso_ (void)
3822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmacchwso.   17, 14, 15");
3824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmachhw_ (void)
3827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmachhw.     17, 14, 15");
3829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmachhwo_ (void)
3832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmachhwo.    17, 14, 15");
3834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmachhws_ (void)
3837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmachhws.    17, 14, 15");
3839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmachhwso_ (void)
3842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmachhwso.   17, 14, 15");
3844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmaclhw_ (void)
3847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmaclhw.     17, 14, 15");
3849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmaclhwo_ (void)
3852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmaclhwo.    17, 14, 15");
3854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmaclhws_ (void)
3857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmaclhws.    17, 14, 15");
3859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_nmaclhwso_ (void)
3862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    __asm__ __volatile__ ("nmaclhwso.   17, 14, 15");
3864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_t tests_p4mc_ops_two[] = {
3867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchw_         , "     macchw.", },
3868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwo_        , "    macchwo.", },
3869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchws_        , "    macchws.", },
3870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwso_       , "   macchwso.", },
3871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwsu_       , "   macchwsu.", },
3872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwsuo_      , "  macchwsuo.", },
3873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwu_        , "    macchwu.", },
3874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_macchwuo_       , "   macchwuo.", },
3875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhw_         , "     machhw.", },
3876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwo_        , "    machhwo.", },
3877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhws_        , "    machhws.", },
3878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwso_       , "   machhwso.", },
3879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwsu_       , "   machhwsu.", },
3880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwsuo_      , "  machhwsuo.", },
3881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwu_        , "    machhwu.", },
3882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_machhwuo_       , "   machhwuo.", },
3883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhw_         , "     maclhw.", },
3884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwo_        , "    maclhwo.", },
3885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhws_        , "    maclhws.", },
3886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwso_       , "   maclhwso.", },
3887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwsu_       , "   maclhwsu.", },
3888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwsuo_      , "  maclhwsuo.", },
3889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwu_        , "    maclhwu.", },
3890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_maclhwuo_       , "   maclhwuo.", },
3891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulchw_         , "     mulchw.", },
3892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulchwu_        , "    mulchwu.", },
3893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhhw_         , "     mulhhw.", },
3894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mulhhwu_        , "    mulhhwu.", },
3895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mullhw_         , "     mullhw.", },
3896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_mullhwu_        , "    mullhwu.", },
3897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmacchw_        , "    nmacchw.", },
3898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmacchwo_       , "   nmacchwo.", },
3899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmacchws_       , "   nmacchws.", },
3900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmacchwso_      , "  nmacchwso.", },
3901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmachhw_        , "    nmachhw.", },
3902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmachhwo_       , "   nmachhwo.", },
3903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmachhws_       , "   nmachhws.", },
3904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmachhwso_      , "  nmachhwso.", },
3905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmaclhw_        , "    nmaclhw.", },
3906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmaclhwo_       , "   nmaclhwo.", },
3907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmaclhws_       , "   nmaclhws.", },
3908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { &test_nmaclhwso_      , "  nmaclhwso.", },
3909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,           },
3910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
3911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (IS_PPC405) */
3912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_table_t all_tests[] = {
3914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ia_ops_two      ,
3916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer arith insns with two args",
3917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00010102,
3918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_iar_ops_two     ,
3921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer arith insns with two args with flags update",
3922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010102,
3923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_iac_ops_two     ,
3926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer arith insns with two args and carry",
3927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x02010102,
3928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_iacr_ops_two    ,
3931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer arith insns with two args and carry with flags update",
3932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x03010102,
3933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_il_ops_two      ,
3936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer logical insns with two args",
3937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00010202,
3938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ilr_ops_two     ,
3941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer logical insns with two args with flags update",
3942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010202,
3943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_icr_ops_two     ,
3946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer compare insns (two args)",
3947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010304,
3948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_icr_ops_two_i16 ,
3951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer compare with immediate insns (two args)",
3952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010305,
3953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ia_ops_two_i16  ,
3956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer arith insns\n    with one register + one 16 bits immediate args",
3957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00010106,
3958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_iar_ops_two_i16 ,
3961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer arith insns\n    with one register + one 16 bits immediate args with flags update",
3962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010106,
3963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_il_ops_two_i16  ,
3966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer logical insns\n    with one register + one 16 bits immediate args",
3967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00010206,
3968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ilr_ops_two_i16 ,
3971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer logical insns\n    with one register + one 16 bits immediate args with flags update",
3972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010206,
3973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_crl_ops_two     ,
3976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC condition register logical insns - two operands",
3977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010202,
3978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_iac_ops_one     ,
3981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer arith insns with one arg and carry",
3982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x02010101,
3983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_iacr_ops_one    ,
3986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer arith insns with one arg and carry with flags update",
3987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x03010101,
3988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_il_ops_one      ,
3991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer logical insns with one arg",
3992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00010201,
3993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
3995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ilr_ops_one     ,
3996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer logical insns with one arg with flags update",
3997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010201,
3998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
3999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_il_ops_spe      ,
4001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC logical insns with special forms",
4002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00010207,
4003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ilr_ops_spe     ,
4006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC logical insns with special forms with flags update",
4007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01010207,
4008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ild_ops_two_i16 ,
4011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer load insns\n    with one register + one 16 bits immediate args with flags update",
4012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00010508,
4013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ild_ops_two     ,
4016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer load insns with two register args",
4017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00010509,
4018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ist_ops_three_i16,
4021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer store insns\n    with one register + one 16 bits immediate args with flags update",
4022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x0001050a,
4023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ist_ops_three   ,
4026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC integer store insns with three register args",
4027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x0001050b,
4028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
4030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        tests_popcnt_ops_one   ,
4031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        "PPC integer population count with one register args, no flags",
4032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        0x00010601,
4033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    },
4034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fa_ops_three    ,
4037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point arith insns with three args",
4038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00020103,
4039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_far_ops_three    ,
4044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point arith insns\n    with three args with flags update",
4045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01020103,
4046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fa_ops_two      ,
4051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point arith insns with two args",
4052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00020102,
4053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_far_ops_two     ,
4058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point arith insns\n    with two args with flags update",
4059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01020102,
4060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fcr_ops_two     ,
4065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point compare insns (two args)",
4066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01020304,
4067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fa_ops_one      ,
4072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point arith insns with one arg",
4073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00020101,
4074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_far_ops_one     ,
4079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point arith insns\n    with one arg with flags update",
4080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01020101,
4081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fl_ops_spe      ,
4086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point status register manipulation insns",
4087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00020207,
4088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_flr_ops_spe     ,
4093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC floating point status register manipulation insns\n  with flags update",
4094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01020207,
4095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fld_ops_two_i16 ,
4100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC float load insns\n    with one register + one 16 bits immediate args with flags update",
4101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00020508,
4102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fld_ops_two     ,
4107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC float load insns with two register args",
4108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00020509,
4109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fst_ops_three_i16,
4114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC float store insns\n    with one register + one 16 bits immediate args with flags update",
4115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x0002050a,
4116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
4119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_fst_ops_three   ,
4121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC float store insns with three register args",
4122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x0002050b,
4123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
4125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_aa_ops_three    ,
4128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC altivec integer arith insns with three args",
4129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00040103,
4130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_al_ops_three    ,
4135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC altivec integer logical insns with three args",
4136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00040203,
4137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_aa_ops_two      ,
4142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC altivec integer arith insns with two args",
4143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00040102,
4144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_al_ops_two      ,
4149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC altivec integer logical insns with two args",
4150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00040202,
4151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_al_ops_one      ,
4156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC altivec integer logical insns with one arg",
4157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00040201,
4158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ac_ops_two      ,
4163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec integer compare insns",
4164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00040302,
4165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_acr_ops_two     ,
4170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec integer compare insns with flags update",
4171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01040302,
4172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_av_int_ops_spe  ,
4177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec integer special insns",
4178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00040207,
4179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ald_ops_two     ,
4184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec load insns with two register args",
4185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00040509,
4186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_ast_ops_three   ,
4191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec store insns with three register args",
4192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x0004050b,
4193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        tests_afa_ops_two     ,
4198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        "Altivec floating point arith insns with two args",
4199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        0x00050102,
4200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        tests_afa_ops_three   ,
4205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        "Altivec floating point arith insns with three args",
4206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        0x00050103,
4207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_afa_ops_one     ,
4212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec floating point arith insns with one arg",
4213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00050101,
4214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_afc_ops_two     ,
4219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec floating point compare insns",
4220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00050302,
4221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_afcr_ops_two    ,
4226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec floating point compare insns with flags update",
4227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01050302,
4228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_av_float_ops_spe,
4233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "Altivec float special insns",
4234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00050207,
4235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
4237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    {
4238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        tests_dcbt,
4239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        "Miscellaneous test: Data cache insns",
4240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        0x0006070C,
4241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    },
4242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (IS_PPC405)
4243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_p4m_ops_two     ,
4245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC 405 mac insns with three args",
4246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x00030102,
4247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (IS_PPC405) */
4249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (IS_PPC405)
4250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
4251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        tests_p4mc_ops_two    ,
4252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        "PPC 405 mac insns with three args with flags update",
4253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x01030102,
4254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    },
4255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (IS_PPC405) */
4256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    { NULL,                   NULL,               0x00000000, },
4257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
4258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* -------------- END #include "ops-ppc.c" -------------- */
4260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int verbose = 0;
4262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int arg_list_size = 0;
4263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic double *fargs = NULL;
4265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int nb_fargs = 0;
4266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int nb_normal_fargs = 0;
4267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic HWord_t *iargs = NULL;
4268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int nb_iargs = 0;
4269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic uint16_t *ii16 = NULL;
4270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int nb_ii16 = 0;
4271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic vector unsigned int* viargs = NULL;
4274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int nb_viargs = 0;
4275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic vector float* vfargs = NULL;
4276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int nb_vfargs = 0;
4277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define TEST_VSCR_SAT
4279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void register_farg (void *farg,
4282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  int s, uint16_t _exp, uint64_t mant)
4283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint64_t tmp;
4285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant;
4287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *(uint64_t *)farg = tmp;
4288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
4289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("%d %03x %013llx => %016llx %0e\n",
4290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("%d %03x %013lx => %016lx %0e\n",
4292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              s, _exp, mant, *(uint64_t *)farg, *(double *)farg);
4294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void build_fargs_table (void)
4297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Double precision:
4299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Sign goes from zero to one               (1 bit)
4300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Exponent goes from 0 to ((1 << 12) - 1)  (11 bits)
4301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Mantissa goes from 1 to ((1 << 52) - 1)  (52 bits)
4302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * + special values:
4303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +0.0      : 0 0x000 0x0000000000000 => 0x0000000000000000
4304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -0.0      : 1 0x000 0x0000000000000 => 0x8000000000000000
4305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +infinity : 0 0x7FF 0x0000000000000 => 0x7FF0000000000000
4306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -infinity : 1 0x7FF 0x0000000000000 => 0xFFF0000000000000
4307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +QNaN     : 0 0x7FF 0x7FFFFFFFFFFFF => 0x7FF7FFFFFFFFFFFF
4308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -QNaN     : 1 0x7FF 0x7FFFFFFFFFFFF => 0xFFF7FFFFFFFFFFFF
4309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +SNaN     : 0 0x7FF 0x8000000000000 => 0x7FF8000000000000
4310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -SNaN     : 1 0x7FF 0x8000000000000 => 0xFFF8000000000000
4311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * (8 values)
4312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Ref only:
4314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Single precision
4315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Sign:     1 bit
4316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Exponent: 8 bits
4317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Mantissa: 23 bits
4318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +0.0      : 0 0x00 0x000000 => 0x00000000
4319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -0.0      : 1 0x00 0x000000 => 0x80000000
4320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +infinity : 0 0xFF 0x000000 => 0x7F800000
4321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -infinity : 1 0xFF 0x000000 => 0xFF800000
4322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +QNaN     : 0 0xFF 0x3FFFFF => 0x7FBFFFFF
4323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -QNaN     : 1 0xFF 0x3FFFFF => 0xFFBFFFFF
4324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +SNaN     : 0 0xFF 0x400000 => 0x7FC00000
4325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -SNaN     : 1 0xFF 0x400000 => 0xFFC00000
4326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    */
4327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint64_t mant;
4328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint16_t _exp, e0, e1;
4329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int s;
4330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i=0;
4331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Note: VEX isn't so hot with denormals, so don't bother
4333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      testing them: set _exp > 0
4334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
4335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ( arg_list_size == 1 ) {   // Large
4337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fargs = malloc(200 * sizeof(double));
4338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (s=0; s<2; s++) {
4339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (e0=0; e0<2; e0++) {
4340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (e1=0x001; ; e1 = ((e1 + 1) << 2) + 6) {
4341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (e1 >= 0x400)
4342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  e1 = 0x3fe;
4343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               _exp = (e0 << 10) | e1;
4344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               for (mant = 0x0000000000001ULL; mant < (1ULL << 52);
4345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    /* Add 'random' bits */
4346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    mant = ((mant + 0x4A6) << 13) + 0x359) {
4347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  register_farg(&fargs[i++], s, _exp, mant);
4348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               }
4349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (e1 == 0x3fe)
4350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  break;
4351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
4352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {                      // Default
4355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fargs = malloc(16 * sizeof(double));
4356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (s=0; s<2; s++) {                                // x2
4357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//       for (e0=0; e0<2; e0++) {
4358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (e1=0x001; ; e1 = ((e1 + 1) << 13) + 7) {  // x2
4359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//          for (e1=0x001; ; e1 = ((e1 + 1) << 5) + 7) {   // x3
4360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (e1 >= 0x400)
4361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  e1 = 0x3fe;
4362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//             _exp = (e0 << 10) | e1;
4363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               _exp = e1;
4364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               for (mant = 0x0000000000001ULL; mant < (1ULL << 52);
4365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    /* Add 'random' bits */
4366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    mant = ((mant + 0x4A6) << 29) + 0x359) {  // x2
4367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  register_farg(&fargs[i++], s, _exp, mant);
4368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               }
4369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (e1 == 0x3fe)
4370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  break;
4371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
4372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//       }
4373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* To iterate over non-special values only */
4377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nb_normal_fargs = i;
4378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Special values */
4381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* +0.0      : 0 0x000 0x0000000000000 */
4382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 0;
4383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x000;
4384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x0000000000000ULL;
4385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_farg(&fargs[i++], s, _exp, mant);
4386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* -0.0      : 1 0x000 0x0000000000000 */
4387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 1;
4388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x000;
4389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x0000000000000ULL;
4390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_farg(&fargs[i++], s, _exp, mant);
4391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* +infinity : 0 0x7FF 0x0000000000000  */
4392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 0;
4393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x7FF;
4394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x0000000000000ULL;
4395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_farg(&fargs[i++], s, _exp, mant);
4396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* -infinity : 1 0x7FF 0x0000000000000 */
4397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 1;
4398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x7FF;
4399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x0000000000000ULL;
4400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_farg(&fargs[i++], s, _exp, mant);
4401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* +QNaN     : 0 0x7FF 0x7FFFFFFFFFFFF */
4402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 0;
4403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x7FF;
4404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x7FFFFFFFFFFFFULL;
4405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_farg(&fargs[i++], s, _exp, mant);
4406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* -QNaN     : 1 0x7FF 0x7FFFFFFFFFFFF */
4407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 1;
4408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x7FF;
4409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x7FFFFFFFFFFFFULL;
4410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_farg(&fargs[i++], s, _exp, mant);
4411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* +SNaN     : 0 0x7FF 0x8000000000000 */
4412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 0;
4413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x7FF;
4414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x8000000000000ULL;
4415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_farg(&fargs[i++], s, _exp, mant);
4416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* -SNaN     : 1 0x7FF 0x8000000000000 */
4417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 1;
4418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x7FF;
4419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x8000000000000ULL;
4420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_farg(&fargs[i++], s, _exp, mant);
4421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("Registered %d fargs values\n", i);
4422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nb_fargs = i;
4424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void build_iargs_table (void)
4427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint64_t tmp;
4429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i=0;
4430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
4432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (arg_list_size == 1) {                   // Large
4433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      iargs = malloc(400 * sizeof(HWord_t));
4434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (tmp=0; ; tmp = tmp + 1 + (tmp >> 1)) {
4435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp >= 0x100000000ULL)
4436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tmp = 0xFFFFFFFF;
4437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         iargs[i++] = (HWord_t)tmp;
4438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         AB_DPRINTF("val %08x\n", (HWord_t)tmp);
4439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp == 0xFFFFFFFF)
4440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
4441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {                                    // Default
4443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      iargs = malloc(10 * sizeof(HWord_t));
4444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // for (tmp = 0; ; tmp = 71*tmp + 1 + (tmp>>1)) {  // gives 8
4445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // for (tmp = 0; ; tmp = 100000*tmp + 1 + (tmp>>1)) {  // gives 4
4446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (tmp=0; ; tmp = 999999*tmp + 999999) {  // gives 3
4447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp >= 0x100000000ULL)
4448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tmp = 0xFFFFFFFF;
4449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         iargs[i++] = (HWord_t)tmp;
4450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         AB_DPRINTF("val %08x\n", (HWord_t)tmp);
4451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp == 0xFFFFFFFF)
4452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
4453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (arg_list_size == 1) {                   // Large
4457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      iargs = malloc(800 * sizeof(HWord_t));
4458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (tmp=0; ; tmp = 2*tmp + 1 + (tmp >> 2)) {
4459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if ((long)tmp < 0 )
4460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tmp = 0xFFFFFFFFFFFFFFFFULL;
4461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         iargs[i++] = tmp;
4462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         AB_DPRINTF("val %016lx\n", tmp);
4463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp == 0xFFFFFFFFFFFFFFFFULL)
4464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
4465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {                                    // Default
4467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      iargs = malloc(20 * sizeof(HWord_t));
4468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // for (tmp=0; ; tmp = 9999*tmp + 999999) {  // gives 6
4469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (tmp = 0; ; tmp = 123456789*tmp + 123456789999) {  // gives 3
4470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if ((long)tmp < 0 )
4471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tmp = 0xFFFFFFFFFFFFFFFFULL;
4472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         iargs[i++] = tmp;
4473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         AB_DPRINTF("val %016lx\n", tmp);
4474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp == 0xFFFFFFFFFFFFFFFFULL)
4475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
4476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifndef __powerpc64__
4479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("Registered %d iargs values\n", i);
4481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nb_iargs = i;
4482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void build_ii16_table (void)
4485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t tmp;
4487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i=0;
4488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (arg_list_size == 1) {                   // Large
4490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ii16 = malloc(200 * sizeof(uint32_t));
4491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (tmp=0; ; tmp = tmp + 1 + (tmp >> 2)) {
4492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp >= 0x10000)
4493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tmp = 0xFFFF;
4494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ii16[i++] = tmp;
4495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         AB_DPRINTF("val %04x\n", tmp);
4496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp == 0xFFFF)
4497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
4498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {                                    // Default
4500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ii16 = malloc(10 * sizeof(uint32_t));
4501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (tmp=0; ; tmp = 999*tmp + 999) {  // gives 3
4502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp >= 0x10000)
4503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tmp = 0xFFFF;
4504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ii16[i++] = tmp;
4505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         AB_DPRINTF("val %04x\n", tmp);
4506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (tmp == 0xFFFF)
4507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
4508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("Registered %d ii16 values\n", i);
4511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nb_ii16 = i;
4512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
4515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void build_viargs_table (void)
4516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (ALTIVEC_ARGS_LARGE)
4518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int i=2;
4519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   viargs = memalign16(i * sizeof(vector unsigned int));
4520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   viargs[0] = (vector unsigned int) { 0x01020304,0x05060708,0x090A0B0C,0x0E0D0E0F };
4521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF_VEC32x4( viargs[0] );
4522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   viargs[1] = (vector unsigned int) { 0xF1F2F3F4,0xF5F6F7F8,0xF9FAFBFC,0xFEFDFEFF };
4523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF_VEC32x4( viargs[1] );
4524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int i,j;
4526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // build from iargs table (large/default already set)
4527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   viargs = malloc(nb_iargs * sizeof(vector unsigned int));
4528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
4529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      j = iargs[i];
4530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      viargs[i] = (vector unsigned int){ j, j*2, j*3, j*4 };
4531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      AB_DPRINTF_VEC32x4( viargs[i] );
4532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("Registered %d viargs values\n", i);
4536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nb_viargs = i;
4537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void register_vfarg (vector float* vfarg,
4540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  int s, uint8_t _exp, uint32_t mant)
4541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t tmp;
4543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vector uint32_t* vfargI = (vector uint32_t*)vfarg;
4544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   tmp = ((uint64_t)s << 31) | ((uint64_t)_exp << 23) | mant;
4546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *vfargI = (vector uint32_t){ tmp,tmp,tmp,tmp };
4547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("%d %02x %06x => %08x %0e\n",
4548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              s, _exp, mant, *((uint32_t*)&tmp), *(float*)&tmp);
4549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void build_vfargs_table (void)
4552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Sign goes from zero to one
4554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Exponent goes from 0 to ((1 << 9) - 1)
4555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * Mantissa goes from 1 to ((1 << 24) - 1)
4556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * + special values:
4557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +0.0      : 0 0x00 0x000000            => 0x00000000
4558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -0.0      : 1 0x00 0x000000            => 0x80000000
4559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +infinity : 0 0xFF 0x000000            => 0x7F800000
4560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -infinity : 1 0xFF 0x000000            => 0xFF800000
4561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +SNaN     : 0 0xFF 0x7FFFFF (non-zero) => 0x7FFFFFFF
4562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -SNaN     : 1 0xFF 0x7FFFFF (non-zero) => 0xFFFFFFFF
4563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * +QNaN     : 0 0xFF 0x3FFFFF (non-zero) => 0x7FBFFFFF
4564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * -QNaN     : 1 0xFF 0x3FFFFF (non-zero) => 0xFFBFFFFF
4565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    * (8 values)
4566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    */
4567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t mant;
4568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint16_t _exp;
4569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int s;
4570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i=0;
4571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (ALTIVEC_ARGS_LARGE)
4574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nb_vfargs = 12;
4575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vfargs = memalign16(nb_vfargs * sizeof(vector float));
4576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // 4 values:
4578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (s=0; s<2; s++) {
4579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (_exp=0x5; ; _exp += 0x9D ) {
4580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (_exp > 0xDF)
4581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
4582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (mant = 0x3FFFFF; mant < 0x7FFFFF;
4583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              mant = /* random */ ((mant + 0x1A6) << 31) + 0x159) {
4584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            register_vfarg(&vfargs[i++], s, (uint8_t)_exp, mant);
4585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nb_vfargs = 50;
4590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vfargs = memalign16(nb_vfargs * sizeof(vector float));
4591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (s=0; s<2; s++) {
4593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (_exp=0x0; ; _exp += 0x3F ) {
4594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         //      for (_exp=0; ; _exp = ((_exp + 1) << 1) + 3) {
4595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (_exp >= 0xFE)
4596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            _exp = 0xFE;
4597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (mant = 0x0; mant < 0x7FFFFF;
4598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              mant = /* random */ ((mant + 0x4A6) << 5) + 0x359) {
4599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            register_vfarg(&vfargs[i++], s, (uint8_t)_exp, mant);
4600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (_exp >= 0xFE)
4602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            break;
4603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Special values */
4608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* +0.0      : 0 0x00 0x000000 */
4609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 0;
4610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x00;
4611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x000000;
4612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_vfarg(&vfargs[i++], s, _exp, mant);
4613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* -0.0      : 1 0x00 0x000000 */
4614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 1;
4615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0x00;
4616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x000000;
4617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_vfarg(&vfargs[i++], s, _exp, mant);
4618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* +infinity : 0 0xFF 0x000000  */
4620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 0;
4621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0xFF;
4622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x000000;
4623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_vfarg(&vfargs[i++], s, _exp, mant);
4624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* -infinity : 1 0xFF 0x000000 */
4625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 1;
4626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0xFF;
4627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x000000;
4628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_vfarg(&vfargs[i++], s, _exp, mant);
4629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* NaN: _exponent all 1s, non-zero fraction */
4631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* SNaN is a NaN with the most significant fraction bit clear.*/
4632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* +SNaN     : 0 0xFF 0x7FFFFF */
4633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 0;
4634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0xFF;
4635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x7FFFFF;
4636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_vfarg(&vfargs[i++], s, _exp, mant);
4637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* -SNaN     : 1 0xFF 0x7FFFFF */
4638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 1;
4639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0xFF;
4640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x7FFFFF;
4641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_vfarg(&vfargs[i++], s, _exp, mant);
4642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* QNaN is a NaN with the most significant fraction bit set */
4644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* +QNaN     : 0 0xFF 0x3F0000 */
4645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 0;
4646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0xFF;
4647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x3FFFFF;
4648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_vfarg(&vfargs[i++], s, _exp, mant);
4649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* -QNaN     : 1 0xFF 0x3F0000 */
4650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   s = 1;
4651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _exp = 0xFF;
4652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mant = 0x3FFFFF;
4653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register_vfarg(&vfargs[i++], s, _exp, mant);
4654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   AB_DPRINTF("Registered %d vfargs values\n", i);
4655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(i <= nb_vfargs);
4657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nb_vfargs = i;
4658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
4662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void dump_iargs (void)
4663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
4665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < nb_iargs; i++) {
4666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("iarg %d: %08x %08x %08x\n", i, iargs[i],
4667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             (unsigned int)&iargs[i], (unsigned int)iargs);
4668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void dump_iargs16 (void)
4672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
4674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < nb_ii16; i++) {
4675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("iarg16 %d: %08x %08x %08x\n", i, ii16[i],
4676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             (unsigned int)&ii16[i], (unsigned int)ii16);
4677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void dump_vfargs (void)
4681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vector float vf;
4683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   float f;
4684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i=0;
4685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_vfargs; i++) {
4686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vf = (vector float)vfargs[i];
4687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      f  = ((float*)&vf)[0];
4688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("vfarg %3d: %24f : %08x\n", i, f, ((unsigned int*)&f)[0]);
4689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_three_args (const char* name, test_func_t func,
4694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 unused uint32_t test_flags)
4695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
4697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
4698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k;
4699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
4701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_iargs; j++) {
4702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<nb_iargs; k++) {
4703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r14 = iargs[i];
4704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r15 = iargs[j];
4705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r16 = iargs[k];
4706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    SET_CR_XER_ZERO;
4708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
4709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    GET_CR_XER(flags,xer);
4710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            res = r17;
4711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
4713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s %08x, %08x, %08x => %08x (%08x %08x)\n",
4714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            printf("%s %016llx, %016llx, %016llx => %016llx (%08x %08x)\n",
4716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   name, iargs[i], iargs[j], iargs[k], res, flags, xer);
4718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
4720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_two_args (const char* name, test_func_t func,
4725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               uint32_t test_flags)
4726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
4728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer, xer_orig;
4729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i, j, is_div;
4730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__
4731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int zap_hi32;
4732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
4733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // catches div, divwu, divo, divwu, divwuo, and . variants
4735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   is_div = strstr(name, "divw") != NULL;
4736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__
4738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   zap_hi32 = strstr(name, "mulhw") != NULL;
4739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
4740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   xer_orig = 0x00000000;
4742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown redo:
4743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
4744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_iargs; j++) {
4745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* result of division by zero is implementation dependent.
4747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            don't test it. */
4748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (is_div && iargs[j] == 0)
4749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            continue;
4750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r14 = iargs[i];
4752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r15 = iargs[j];
4753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_XER(xer_orig);
4755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_CR_ZERO;
4756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
4757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         GET_CR_XER(flags,xer);
4758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         res = r17;
4759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
4761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s %08x, %08x => %08x (%08x %08x)\n",
4762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (zap_hi32) res &= 0xFFFFFFFFULL;
4764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         printf("%s %016llx, %016llx => %016llx (%08x %08x)\n",
4765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                name, iargs[i], iargs[j], res, flags, xer);
4767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
4769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((test_flags & PPC_XER_CA) && xer_orig == 0x00000000) {
4771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      xer_orig = 0x20000000;
4772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto redo;
4773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_one_arg (const char* name, test_func_t func,
4777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               uint32_t test_flags)
4778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
4780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer, xer_orig;
4781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
4782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   xer_orig = 0x00000000;
4784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown redo:
4785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
4786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = iargs[i];
4787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_XER(xer_orig);
4788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_ZERO;
4789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
4790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = r17;
4791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
4792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
4794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %08x => %08x (%08x %08x)\n",
4795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx => %016llx (%08x %08x)\n",
4797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, iargs[i], res, flags, xer);
4799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((test_flags & PPC_XER_CA) && xer_orig == 0x00000000) {
4801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      xer_orig = 0x20000000;
4802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto redo;
4803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void invalidate_icache ( void *ptr, int nbytes )
4807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HWord_t startaddr = (HWord_t) ptr;
4809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HWord_t endaddr   = startaddr + nbytes;
4810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HWord_t cls       = 32; /*VG_(cache_line_size_ppc32);*/
4811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HWord_t addr;
4812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   startaddr &= ~(cls - 1);
4814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (addr = startaddr; addr < endaddr; addr += cls)
4815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      asm volatile("dcbst 0,%0" : : "r" (addr));
4816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm volatile("sync");
4817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (addr = startaddr; addr < endaddr; addr += cls)
4818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      asm volatile("icbi 0,%0" : : "r" (addr));
4819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm volatile("sync; isync");
4820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* for god knows what reason, if this isn't inlined, the
4823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   program segfaults. */
4824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline
4825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid _patch_op_imm (uint32_t *p_insn, uint16_t imm, int sh, int len)
4826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t mask = ((1 << len) - 1) << sh;
4828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p_insn = (*p_insn & ~mask) | ((imm<<sh) & mask);
4829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline
4832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid patch_op_imm (uint32_t* p_insn, uint16_t imm, int sh, int len)
4833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   _patch_op_imm(p_insn, imm, sh, len);
4835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   invalidate_icache(p_insn, 4);
4836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline
4839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid patch_op_imm16 (uint32_t *p_insn, uint16_t imm)
4840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   patch_op_imm(p_insn, imm, 0, 16);
4842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Copy the 2 insn function starting at p_func_F to func_buf[], and
4846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return a possibly different pointer, which, when called, runs the
4847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   copy in func_buf[]. */
4848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline
4849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_func_t init_function( test_func_t p_func_F, uint32_t func_buf[] )
4850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* p_func = (uint32_t*)p_func_F;
4852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
4853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   func_buf[0] = p_func[0];
4854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   func_buf[1] = p_func[1];
4855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return (test_func_t)&func_buf[0];
4856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* p_func points to a function descriptor, the first word of which
4858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      points to the real code.  Copy the code itself but not the
4859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      descriptor, and just swizzle the descriptor's entry pointer. */
4860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint64_t* descr = (uint64_t*)p_func;
4861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* entry = (uint32_t*)(descr[0]);
4862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   func_buf[0] = entry[0];
4863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   func_buf[1] = entry[1];
4864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   descr[0] = (uint64_t)&func_buf[0];
4865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return (test_func_t)descr;
4866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifndef __powerpc64__
4867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_one_reg_imm16 (const char* name,
4871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    test_func_t func_IN,
4872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    unused uint32_t test_flags)
4873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
4875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
4876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
4877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
4878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j;
4879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
4881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_ii16; j++) {
4882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Patch up the instruction */
4883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         func = init_function( func_IN, func_buf );
4884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm16(&func_buf[0], ii16[j]);
4885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r14 = iargs[i];
4887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_CR_XER_ZERO;
4889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
4890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         GET_CR_XER(flags,xer);
4891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         res = r17;
4892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
4894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s %08x, %08x => %08x (%08x %08x)\n",
4895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         printf("%s %016llx, %08x => %016llx (%08x %08x)\n",
4897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                name, iargs[i], ii16[j], res, flags, xer);
4899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
4901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Special test cases for:
4905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rlwimi
4906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rlwinm
4907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rlwnm
4908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * srawi
4909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mcrf
4910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mcrfs
4911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mcrxr_cb
4912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mfcr_cb
4913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mfspr_cb
4914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mftb_cb
4915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mtcrf_cb
4916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mtspr_cb
4917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __powerpc64__ only:
4919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rldcl       rA,rS,SH,MB
4920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rldcr       rA,rS,SH,ME
4921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rldic       rA,rS,SH,MB
4922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rldicl      rA,rS,SH,MB
4923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rldicr      rA,rS,SH,ME
4924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rldimi      rA,rS,SH,MB
4925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * sradi       rA,rS,SH
4926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
4927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void rlwi_cb (const char* name, test_func_t func_IN,
4929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     unused uint32_t test_flags)
4930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
4932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
4933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
4934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
4935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k, l, arg_step;
4936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = (arg_list_size == 0) ? 31 : 3;
4938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r17 = 0;  // rlwimi takes r17 as input: start with a clean slate.
4940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
4942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<32; j+=arg_step) {
4943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<32; k+=arg_step) {
4944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (l=0; l<32; l+=arg_step) {
4945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* Patch up the instruction */
4946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               func = init_function( func_IN, func_buf );
4947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               _patch_op_imm(&func_buf[0], j, 11, 5);
4948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               _patch_op_imm(&func_buf[0], k, 6, 5);
4949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               patch_op_imm(&func_buf[0], l, 1, 5);
4950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               r14 = iargs[i];
4952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               SET_CR_XER_ZERO;
4954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (*func)();
4955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               GET_CR_XER(flags,xer);
4956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               res = r17;
4957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
4959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               printf("%s %08x, %2d, %2d, %2d => %08x (%08x %08x)\n",
4960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
4961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               printf("%s %016llx, %2d, %2d, %2d => %016llx (%08x %08x)\n",
4962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
4963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      name, iargs[i], j, k, l, res, flags, xer);
4964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
4965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (verbose) printf("\n");
4966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
4970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void rlwnm_cb (const char* name, test_func_t func_IN,
4972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
4973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
4974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
4975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
4976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
4977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
4978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k, l, arg_step;
4979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = (arg_list_size == 0) ? 31 : 3;
4981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
4983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_iargs; j++) {
4984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<32; k+=arg_step) {
4985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (l=0; l<32; l+=arg_step) {
4986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* Patch up the instruction */
4987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               func = init_function( func_IN, func_buf );
4988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               _patch_op_imm(&func_buf[0], k, 6, 5);
4989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               patch_op_imm(&func_buf[0], l, 1, 5);
4990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               r14 = iargs[i];
4992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               r15 = iargs[j];
4993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               SET_CR_XER_ZERO;
4995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (*func)();
4996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               GET_CR_XER(flags,xer);
4997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               res = r17;
4998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               printf("%s %08x, %08x, %2d, %2d => %08x (%08x %08x)\n",
5001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               printf("%s %016llx, %016llx, %2d, %2d => %016llx (%08x %08x)\n",
5003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      name, iargs[i], iargs[j], k, l, res, flags, xer);
5005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
5006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (verbose) printf("\n");
5007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
5008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void srawi_cb (const char* name, test_func_t func_IN,
5013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
5014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
5018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, arg_step;
5020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = (arg_list_size == 0) ? 31 : 1;
5022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<32; j+=arg_step) {
5025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Patch up the instruction */
5026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         func = init_function( func_IN, func_buf );
5027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm(&func_buf[0], j, 11, 5);
5028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r14 = iargs[i];
5030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_CR_XER_ZERO;
5032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
5033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         GET_CR_XER(flags,xer);
5034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         res = r17;
5035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s %08x, %2d => %08x (%08x %08x)\n",
5038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         printf("%s %016llx, %2d => %016llx (%08x %08x)\n",
5040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                name, iargs[i], j, res, flags, xer);
5042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
5044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mcrf_cb (const char* name, test_func_t func_IN,
5048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
5049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k, arg_step;
5054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = (arg_list_size == 0) ? 7 : 1;
5056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<8; j+=arg_step) {
5059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<8; k+=arg_step) {
5060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Patch up the instruction */
5061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            func = init_function( func_IN, func_buf );
5062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            _patch_op_imm(&func_buf[0], j, 23, 3);
5063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            patch_op_imm(&func_buf[0], k, 18, 3);
5064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r14 = iargs[i];
5066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            SET_CR(r14);
5068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            SET_XER_ZERO;
5069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
5070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            GET_CR_XER(flags,xer);
5071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s %d, %d (%08x) => (%08x %08x)\n",
5074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            printf("%s %d, %d (%016llx) => (%08x %08x)\n",
5076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   name, j, k, iargs[i], flags, xer);
5078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
5079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
5080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mcrxr_cb (const char* name, test_func_t func_IN,
5085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
5086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k, arg_step;
5091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = 1; //(arg_list_size == 0) ? 7 : 1;
5093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<16; i+=arg_step) {
5095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      j = i << 28;
5096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (k=0; k<8; k+=arg_step) {
5097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Patch up the instruction */
5098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         func = init_function( func_IN, func_buf );
5099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm(&func_buf[0], k, 23, 3);
5100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r14 = j;
5102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 SET_CR_ZERO;
5104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 SET_XER(r14);
5105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
5106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         GET_CR_XER(flags,xer);
5107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s %d (%08x) => (%08x %08x)\n",
5109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                name, k, j, flags, xer);
5110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
5112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mfcr_cb (const char* name, test_func_t func,
5116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     unused uint32_t test_flags)
5117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
5119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
5121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = iargs[i];
5124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Set up flags for test */
5126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR(r14);
5127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_XER_ZERO;
5128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
5129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
5130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = r17;
5131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s (%08x) => %08x (%08x %08x)\n",
5134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s (%016llx) => %016llx (%08x %08x)\n",
5136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, iargs[i], res, flags, xer);
5138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// NOTE: Not using func: calling function kills lr
5142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mfspr_cb (const char* name, test_func_t func,
5143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
5144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //volatile uint32_t res, flags, xer, ctr, lr, tmpcr, tmpxer;
5146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
5147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int j, k;
5148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   func = func; // just to stop compiler complaining
5149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // mtxer followed by mfxer
5151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (k=0; k<nb_iargs; k++) {
5152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      j = iargs[k];
5153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(
5154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "mtxer %1\n"
5155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "\tmfxer %0"
5156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : /*out*/"=b"(res) : /*in*/"b"(j) : /*trashed*/"xer"
5157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );
5158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res &= 0xE000007F; /* rest of the bits are undefined */
5159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s 1 (%08x) -> mtxer -> mfxer => %08x\n",
5162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s 1 (%08x) -> mtxer -> mfxer => %016llx\n",
5164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, j, res);
5166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // mtlr followed by mflr
5169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (k=0; k<nb_iargs; k++) {
5170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      j = iargs[k];
5171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(
5172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "mtlr %1\n"
5173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "\tmflr %0"
5174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : /*out*/"=b"(res) : /*in*/"b"(j) : /*trashed*/"lr"
5175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );
5176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s 8 (%08x) ->  mtlr ->  mflr => %08x\n",
5179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s 8 (%08x) ->  mtlr ->  mflr => %016llx\n",
5181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, j, res);
5183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // mtctr followed by mfctr
5186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (k=0; k<nb_iargs; k++) {
5187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      j = iargs[k];
5188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(
5189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "mtctr %1\n"
5190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "\tmfctr %0"
5191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : /*out*/"=b"(res) : /*in*/"b"(j) : /*trashed*/"ctr"
5192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );
5193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s 9 (%08x) -> mtctr -> mfctr => %08x\n",
5196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s 9 (%08x) -> mtctr -> mfctr => %016llx\n",
5198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, j, res);
5200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mtcrf_cb (const char* name, test_func_t func_IN,
5204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
5205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, arg_step;
5210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = (arg_list_size == 0) ? 99 : 1;
5212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<256; j+=arg_step) {
5215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Patch up the instruction */
5216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         func = init_function( func_IN, func_buf );
5217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm(&func_buf[0], j, 12, 8);
5218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r14 = iargs[i];
5220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_CR_XER_ZERO;
5222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
5223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         GET_CR_XER(flags,xer);
5224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s %3d, %08x => (%08x %08x)\n",
5227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         printf("%s %3d, %016llx => (%08x %08x)\n",
5229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                name, j, iargs[i], flags, xer);
5231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
5233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// NOTE: Not using func: calling function kills lr
5237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mtspr_cb (const char* name, test_func_t func,
5238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
5239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
5243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void rldc_cb (const char* name, test_func_t func_IN,
5244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     unused uint32_t test_flags)
5245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
5249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k, arg_step;
5251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = (arg_list_size == 0) ? 7 : 3;
5253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_iargs; j++) {
5256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<64; k+=arg_step) {
5257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Patch up the instruction */
5258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            func = init_function( func_IN, func_buf );
5259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            patch_op_imm(&func_buf[0], (((k & 0x1F)<<1) | ((k>>5)&1)), 5, 6);
5260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r14 = iargs[i];
5262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r15 = iargs[j];
5263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            SET_CR_XER_ZERO;
5265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
5266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            GET_CR_XER(flags,xer);
5267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            res = r17;
5268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            printf("%s %016llx, %016llx, %2d => %016llx (%08x %08x)\n",
5270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   name, iargs[i], iargs[j], k, res, flags, xer);
5271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
5272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
5273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void rldi_cb (const char* name, test_func_t func_IN,
5278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     unused uint32_t test_flags)
5279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
5283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k, arg_step;
5285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = (arg_list_size == 0) ? 7 : 3;
5287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<64; j+=arg_step) {     // SH
5290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<64; k+=arg_step) {  // MB|ME
5291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Patch up the instruction */
5292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            func = init_function( func_IN, func_buf );
5293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            _patch_op_imm(&func_buf[0], (j & 0x1F), 11, 5);
5294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            _patch_op_imm(&func_buf[0], ((j>>5)&1), 1, 1);
5295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            patch_op_imm(&func_buf[0], (((k & 0x1F)<<1) | ((k>>5)&1)), 5, 6);
5296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r14 = iargs[i];
5298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            SET_CR_XER_ZERO;
5300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
5301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            GET_CR_XER(flags,xer);
5302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            res = r17;
5303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            printf("%s %016llx, %2d, %2d => %016llx (%08x %08x)\n",
5305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   name, iargs[i], j, k, res, flags, xer);
5306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
5307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
5308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void sradi_cb (const char* name, test_func_t func_IN,
5313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
5314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res;
5318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, arg_step;
5320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_step = (arg_list_size == 0) ? 7 : 3;
5322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<64; j+=arg_step) {     // SH
5325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Patch up the instruction */
5326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         func = init_function( func_IN, func_buf );
5327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         _patch_op_imm(&func_buf[0], (j & 0x1F), 11, 5);
5328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm(&func_buf[0], ((j>>5)&1), 1, 1);
5329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r14 = iargs[i];
5331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_CR_XER_ZERO;
5333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
5334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         GET_CR_XER(flags,xer);
5335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         res = r17;
5336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         printf("%s %016llx, %2d => %016llx (%08x %08x)\n",
5338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                name, iargs[i], j, res, flags, xer);
5339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
5341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
5344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct special_t special_t;
5347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct special_t {
5349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const char *name;
5350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void (*test_cb)(const char* name, test_func_t func,
5351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   unused uint32_t test_flags);
5352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
5353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_special (special_t *table,
5355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          const char* name, test_func_t func,
5356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          unused uint32_t test_flags)
5357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   const char *tmp;
5359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
5360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (tmp = name; isspace(*tmp); tmp++)
5362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      continue;
5363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; table[i].name != NULL; i++) {
5364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
5365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fprintf(stderr, "look for handler for '%s' (%s)\n", name,
5366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              table[i].name);
5367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (strcmp(table[i].name, tmp) == 0) {
5369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*table[i].test_cb)(name, func, test_flags);
5370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
5371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "ERROR: no test found for op '%s'\n", name);
5374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic special_t special_int_ops[] = {
5377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rlwimi", /* One register + 3 5 bits immediate arguments */
5379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rlwi_cb,
5380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rlwimi.", /* One register + 3 5 bits immediate arguments */
5383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rlwi_cb,
5384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rlwinm", /* One register + 3 5 bits immediate arguments */
5387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rlwi_cb,
5388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rlwinm.", /* One register + 3 5 bits immediate arguments */
5391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rlwi_cb,
5392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rlwnm",  /* Two registers + 2 5 bits immediate arguments */
5395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rlwnm_cb,
5396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rlwnm.",  /* Two registers + 2 5 bits immediate arguments */
5399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rlwnm_cb,
5400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "srawi",  /* One register + 1 5 bits immediate arguments */
5403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &srawi_cb,
5404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "srawi.",  /* One register + 1 5 bits immediate arguments */
5407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &srawi_cb,
5408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mcrf",  /* 2 3 bits immediate arguments */
5411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mcrf_cb,
5412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
5414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mcrfs",  /* 2 3 bits immediate arguments */
5416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mcrfs_cb,
5417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mcrxr",  /* 1 3 bits immediate argument */
5421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mcrxr_cb,
5422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mfcr",  /* No arguments */
5425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mfcr_cb,
5426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mfspr",  /* 1 10 bits immediate argument */
5429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mfspr_cb,
5430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
5432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {   // Move from time base
5433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mftb",  /* 1 10 bits immediate arguments */
5434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mftb_cb,
5435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtcrf",  /* One register + 1 8 bits immediate arguments */
5439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mtcrf_cb,
5440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtspr",  /* One register + 1 10 bits immediate arguments */
5443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mtspr_cb,
5444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
5446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldcl",   /* Two registers + 1 6 bit immediate argument */
5448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldc_cb,
5449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldcl.",  /* Two registers + 1 6 bit immediate argument */
5452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldc_cb,
5453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldcr",   /* Two registers + 1 6 bit immediate argument */
5456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldc_cb,
5457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldcr.",  /* Two registers + 1 6 bit immediate argument */
5460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldc_cb,
5461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldic",   /* One register + 2 6 bit immediate arguments */
5464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldi_cb,
5465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldic.",  /* One register + 2 6 bit immediate arguments */
5468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldi_cb,
5469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldicl",  /* One register + 2 6 bit immediate arguments */
5472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldi_cb,
5473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldicl.", /* One register + 2 6 bit immediate arguments */
5476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldi_cb,
5477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldicr",  /* One register + 2 6 bit immediate arguments */
5480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldi_cb,
5481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldicr.", /* One register + 2 6 bit immediate arguments */
5484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldi_cb,
5485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldimi",  /* One register + 2 6 bit immediate arguments */
5488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldi_cb,
5489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "rldimi.", /* One register + 2 6 bit immediate arguments */
5492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &rldi_cb,
5493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "sradi",  /* One register + 1 6 bit immediate argument */
5496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &sradi_cb,
5497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "sradi.", /* One register + 1 6 bit immediate argument */
5500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &sradi_cb,
5501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #ifdef __powerpc64__
5503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NULL,
5505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NULL,
5506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
5508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_special (const char* name, test_func_t func,
5510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              uint32_t test_flags)
5511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_special(special_int_ops, name, func, test_flags);
5513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_ld_one_reg_imm16 (const char* name,
5517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       test_func_t func_IN,
5518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       unused uint32_t test_flags)
5519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res, base;
5523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, offs, is_lwa=0;
5525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __powerpc64__
5527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   is_lwa = strstr(name, "lwa") != NULL;
5528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // +ve d
5531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   base = (HWord_t)&iargs[0];
5532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * sizeof(HWord_t);
5534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Patch up the instruction */
5536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      func = init_function( func_IN, func_buf );
5537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (is_lwa)
5538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm(&func_buf[0], offs>>2, 2, 14);
5539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
5540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm16(&func_buf[0], offs);
5541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = base;
5543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
5545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
5546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
5547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = r17;
5548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %2d, (%08x) => %08x, %2d (%08x %08x)\n",
5551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %3d, (%016llx) => %016llx, %3lld (%08x %08x)\n",
5553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, offs, iargs[i], res, r14-base, flags, xer);
5555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (verbose) printf("\n");
5557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // -ve d
5559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   base = (HWord_t)&iargs[nb_iargs-1];
5560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = -nb_iargs+1; i<=0; i++) {
5561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * sizeof(HWord_t);
5562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Patch up the instruction */
5564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      func = init_function( func, func_buf );
5565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      patch_op_imm16(&func_buf[0], offs);
5566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = base;
5568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
5570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
5571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
5572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = r17;
5573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %2d, (%08x) => %08x, %2d (%08x %08x)\n",
5576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %3d, (%016llx) => %016llx, %3lld (%08x %08x)\n",
5578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, offs, iargs[nb_iargs-1+i], res, r14-base, flags, xer);
5580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_ld_two_regs (const char* name,
5584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  test_func_t func,
5585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  unused uint32_t test_flags)
5586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t res, base;
5588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, offs;
5590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // +ve d
5592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   base = (HWord_t)&iargs[0];
5593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * sizeof(HWord_t);
5595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = base;
5596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r15 = offs;
5597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
5599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
5600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
5601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = r17;
5602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %d (%08x) => %08x, %d (%08x %08x)\n",
5605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %3d, (%016llx) => %016llx, %2lld (%08x %08x)\n",
5607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, offs, iargs[i], res, r14-base, flags, xer);
5609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_st_two_regs_imm16 (const char* name,
5613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                        test_func_t func_IN,
5614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                        unused uint32_t test_flags)
5615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, offs, k;
5620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HWord_t *iargs_priv, base;
5621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // private iargs table to store to
5623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   iargs_priv = malloc(nb_iargs * sizeof(HWord_t));
5624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // +ve d
5626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   base = (HWord_t)&iargs_priv[0];
5627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (k=0; k<nb_iargs; k++)  // clear array
5629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         iargs_priv[k] = 0;
5630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * sizeof(HWord_t);
5632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Patch up the instruction */
5634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      func = init_function( func_IN, func_buf );
5635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      patch_op_imm16(&func_buf[0], offs);
5636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = iargs[i];             // read from iargs
5638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r15 = base;                 // store to r15 + offs
5639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
5641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
5642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
5643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %08x, %2d => %08x, %2d (%08x %08x)\n",
5646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx, %3d => %016llx, %3lld (%08x %08x)\n",
5648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, iargs[i], offs, iargs_priv[i], r15-base, flags, xer);
5650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (verbose) printf("\n");
5652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // -ve d
5654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   base = (HWord_t)&iargs_priv[nb_iargs-1];
5655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = -nb_iargs+1; i<=0; i++) {
5656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (k=0; k<nb_iargs; k++)  // clear array
5657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         iargs_priv[k] = 0;
5658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * sizeof(HWord_t);
5660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Patch up the instruction */
5662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      func = init_function( func, func_buf );
5663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      patch_op_imm16(&func_buf[0], offs);
5664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = iargs[nb_iargs-1+i];  // read from iargs
5666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r15 = base;                 // store to r15 + offs
5667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
5669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
5670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
5671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %08x, %2d => %08x, %2d (%08x %08x)\n",
5674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx, %3d => %016llx, %3lld (%08x %08x)\n",
5676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, iargs[nb_iargs-1+i], offs, iargs_priv[nb_iargs-1+i],
5678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             r15-base, flags, xer);
5679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(iargs_priv);
5681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_int_st_three_regs (const char* name,
5684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    test_func_t func,
5685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    unused uint32_t test_flags)
5686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, offs, k;
5689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HWord_t *iargs_priv, base;
5690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // private iargs table to store to
5692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   iargs_priv = malloc(nb_iargs * sizeof(HWord_t));
5693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   base = (HWord_t)&iargs_priv[0];
5695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
5696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (k=0; k<nb_iargs; k++)  // clear array
5697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         iargs_priv[k] = 0;
5698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * sizeof(HWord_t);
5700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = iargs[i];             // read from iargs
5701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r15 = base;                 // store to r15 + offs
5702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r16 = offs;
5703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
5705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
5706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
5707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %08x, %d => %08x, %d (%08x %08x)\n",
5710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx, %3d => %016llx, %2lld (%08x %08x)\n",
5712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, iargs[i], offs, iargs_priv[i], r15-base, flags, xer);
5714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(iargs_priv);
5716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Used in do_tests, indexed by flags->nb_args
5720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Elements correspond to enum test_flags::num args
5721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
5722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_loop_t int_loops[] = {
5723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_one_arg,
5724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_two_args,
5725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_three_args,
5726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_two_args,
5727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_one_reg_imm16,
5728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_one_reg_imm16,
5729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_special,
5730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_ld_one_reg_imm16,
5731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_ld_two_regs,
5732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_st_two_regs_imm16,
5733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_int_st_three_regs,
5734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
5735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void test_dcbt_ops (const char* name, test_func_t func,
5737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           unused uint32_t test_flags)
5738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
5739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   unsigned long * data = (unsigned long *)malloc(4096 * sizeof(unsigned long));
5740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   HWord_t base;
5741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   base  = (HWord_t)data;
5743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   size_t offs = 100 * sizeof(unsigned long);    // some arbitrary offset)
5744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   r17  = base;
5746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   r14  = offs;
5747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   (*func)();
5749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("%s with various hint values completes with no exceptions\n", name);
5751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   free(data);
5752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
5753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic test_loop_t misc_loops[] = {
5755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   &test_dcbt_ops,
5756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
5757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
5759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_float_three_args (const char* name, test_func_t func,
5760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   unused uint32_t test_flags)
5761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double res;
5763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint64_t u0, u1, u2, ur;
5764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags;
5765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k;
5766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Note: using nb_normal_fargs:
5768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      - not testing special values for these insns
5769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
5770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_normal_fargs; i+=3) {
5772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_normal_fargs; j+=5) {
5773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<nb_normal_fargs; k+=7) {
5774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            u0 = *(uint64_t *)(&fargs[i]);
5775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            u1 = *(uint64_t *)(&fargs[j]);
5776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            u2 = *(uint64_t *)(&fargs[k]);
5777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            f14 = fargs[i];
5778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            f15 = fargs[j];
5779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            f16 = fargs[k];
5780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            SET_FPSCR_ZERO;
5782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            SET_CR_XER_ZERO;
5783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
5784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            GET_CR(flags);
5785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            res = f17;
5786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ur = *(uint64_t *)(&res);
5787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Note: zapping the bottom byte of the result,
5789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               as vex's accuracy isn't perfect */
5790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ur &= 0xFFFFFFFFFFFFFF00ULL;
5791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s %016llx, %016llx, %016llx => %016llx",
5794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            printf("%s %016llx, %016llx, %016llx => %016llx",
5796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   name, u0, u1, u2, ur);
5798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_FLOAT_FLAGS
5799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf(" (%08x)", flags);
5800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("\n");
5802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
5803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
5804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_float_two_args (const char* name, test_func_t func,
5809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 unused uint32_t test_flags)
5810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double res;
5812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint64_t u0, u1, ur;
5813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags;
5814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j;
5815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_fargs; i+=3) {
5817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_fargs; j+=5) {
5818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         u0 = *(uint64_t *)(&fargs[i]);
5819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         u1 = *(uint64_t *)(&fargs[j]);
5820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         f14 = fargs[i];
5821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         f15 = fargs[j];
5822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_FPSCR_ZERO;
5824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         SET_CR_XER_ZERO;
5825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
5826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         GET_CR(flags);
5827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         res = f17;
5828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ur = *(uint64_t *)(&res);
5829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s %016llx, %016llx => %016llx",
5832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         printf("%s %016llx, %016llx => %016llx",
5834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                name, u0, u1, ur);
5836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_FLOAT_FLAGS
5837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf(" (%08x)", flags);
5838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("\n");
5840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
5842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_float_one_arg (const char* name, test_func_t func,
5846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                unused uint32_t test_flags)
5847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double res;
5849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint64_t u0, ur;
5850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags;
5851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i;
5852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   unsigned zap_hi_32bits, zap_lo_44bits, zap_lo_47bits;
5853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* if we're testing fctiw or fctiwz, zap the hi 32bits,
5855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      as they're undefined */
5856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   zap_hi_32bits = strstr(name, " fctiw")    != NULL  ? 1 : 0;
5857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   zap_lo_44bits = strstr(name, " fres")     != NULL  ? 1 : 0;
5858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   zap_lo_47bits = strstr(name, " frsqrte")  != NULL  ? 1 : 0;
5859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assert(zap_hi_32bits + zap_lo_44bits + zap_lo_47bits <= 1);
5861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_fargs; i++) {
5863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      u0 = *(uint64_t *)(&fargs[i]);
5864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      f14 = fargs[i];
5865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SET_FPSCR_ZERO;
5867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SET_CR_XER_ZERO;
5868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       (*func)();
5869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       GET_CR(flags);
5870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       res = f17;
5871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       ur = *(uint64_t *)(&res);
5872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       if (strstr(name, " frsqrte") !=  NULL)
5874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          /* The 32-bit frsqrte instruction is the Floatig Reciprical Square
5875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           * Root Estimate instruction.  The precision of the estimate will
5876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           * vary from Proceesor implementation.  The approximation varies in
5877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           * bottom two bytes of the 32-bit result.
5878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           */
5879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           ur &= 0xFFFF000000000000ULL;
5880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (zap_hi_32bits)
5882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ur &= 0x00000000FFFFFFFFULL;
5883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (zap_lo_44bits)
5884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ur &= 0xFFFFF00000000000ULL;
5885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (zap_lo_47bits)
5886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ur &= 0xFFFF800000000000ULL;
5887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %016llx => %016llx",
5890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx => %016llx",
5892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, u0, ur);
5894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_FLOAT_FLAGS
5895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf(" (%08x)", flags);
5896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
5898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
5899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Special test cases for:
5902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mffs
5903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mtfsb0
5904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * mtfsb1
5905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
5906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic special_t special_float_ops[] = {
5907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
5908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mffs",   /* One 5 bits immediate argument */
5910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mffs_cb,
5911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mffs.",   /* One 5 bits immediate argument */
5914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mffs_cb,
5915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsb0", /* One 5 bits immediate argument */
5918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mffs_cb,
5919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsb0.", /* One 5 bits immediate argument */
5922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mffs_cb,
5923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsb1", /* One 5 bits immediate argument */
5926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mffs_cb,
5927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsb1.", /* One 5 bits immediate argument */
5930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mffs_cb,
5931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsf",  /* One register + 1 8 bits immediate argument */
5934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mtfsf_cb,
5935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsf.",  /* One register + 1 8 bits immediate argument */
5938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mtfsf_cb,
5939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsfi", /* One 5 bits argument + 1 5 bits argument */
5942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mtfsfi_cb,
5943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "mtfsfi.", /* One 5 bits argument + 1 5 bits argument */
5946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &mtfsfi_cb,
5947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
5949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
5950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NULL,
5951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NULL,
5952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
5953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
5954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_float_special (const char* name, test_func_t func,
5956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                uint32_t test_flags)
5957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_special(special_float_ops, name, func, test_flags);
5959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_float_ld_one_reg_imm16 (const char* name,
5963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         test_func_t func_IN,
5964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                         unused uint32_t test_flags)
5965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
5966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
5967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
5968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t base;
5969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
5970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile double src, res;
5971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, offs;
5972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* offset within [1-nb_fargs:nb_fargs] */
5974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=1-nb_fargs; i<nb_fargs; i++) {
5975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * 8;      // offset = i * sizeof(double)
5976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i < 0) {
5977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src  = fargs[nb_fargs-1 + i];
5978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         base = (HWord_t)&fargs[nb_fargs-1];
5979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
5980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src = fargs[i];
5981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         base = (HWord_t)&fargs[0];
5982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Patch up the instruction */
5985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      func = init_function( func_IN, func_buf );
5986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      patch_op_imm16(&func_buf[0], offs);
5987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // load from fargs[idx] => r14 + offs
5989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = base;
5990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
5992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
5993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
5994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = f17;
5995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
5997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %016llx, %4d => %016llx, %4d",
5998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
5999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx, %4d => %016llx, %4lld",
6000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, double_to_bits(src), offs,
6002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             double_to_bits(res), r14-base);
6003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_FLOAT_FLAGS
6004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf(" (%08x %08x)", flags, xer);
6005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
6007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (verbose) printf("\n");
6009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_float_ld_two_regs (const char* name,
6012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    test_func_t func,
6013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    unused uint32_t test_flags)
6014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t base;
6016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
6017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile double src, res;
6018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, offs;
6019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* offset within [1-nb_fargs:nb_fargs] */
6021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=1-nb_fargs; i<nb_fargs; i++) {
6022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * 8;                // offset = i * sizeof(double)
6023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i < 0) {                 // base reg = start of array
6024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src  = fargs[nb_fargs-1 + i];
6025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         base = (HWord_t)&fargs[nb_fargs-1];
6026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
6027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src  = fargs[i];
6028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         base = (HWord_t)&fargs[0];
6029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = base;
6032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r15 = offs;
6033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
6035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
6036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
6037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = f17;
6038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
6040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %016llx, %4d => %016llx, %4d",
6041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx, %4lld => %016llx, %4lld",
6043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, double_to_bits(src), r15/*offs*/,
6045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             double_to_bits(res), r14-base);
6046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_FLOAT_FLAGS
6047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf(" (%08x %08x)", flags, xer);
6048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
6050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_float_st_two_regs_imm16 (const char* name,
6054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          test_func_t func_IN,
6055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          unused uint32_t test_flags)
6056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
6058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
6059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HWord_t base;
6060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
6061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double src, *p_dst;
6062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, offs;
6063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double *fargs_priv;
6064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int nb_tmp_fargs = nb_fargs;
6065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* if we're storing an fp single-precision, don't want nans
6068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      - the vex implementation doesn't like them (yet)
6069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Note: This is actually a bigger problem: the vex implementation
6070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      rounds these insns twice.  This leads to many rounding errors.
6071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      For the small fargs set, however, this doesn't show up.
6072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
6073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (strstr(name, "stfs") != NULL)
6074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      nb_tmp_fargs = nb_normal_fargs;
6075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // private fargs table to store to
6078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fargs_priv = malloc(nb_tmp_fargs * sizeof(double));
6079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* offset within [1-nb_tmp_fargs:nb_tmp_fargs] */
6081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=1-nb_tmp_fargs; i<nb_tmp_fargs; i++) {
6082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * 8;    // offset = i * sizeof(double)
6083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i < 0) {
6084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src   =  fargs     [nb_tmp_fargs-1 + i];
6085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p_dst = &fargs_priv[nb_tmp_fargs-1 + i];
6086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         base  = (HWord_t)&fargs_priv[nb_tmp_fargs-1];
6087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
6088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src   =  fargs     [i];
6089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p_dst = &fargs_priv[i];
6090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         base  = (HWord_t)&fargs_priv[0];
6091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *p_dst = 0;  // clear dst
6093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Patch up the instruction */
6095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      func = init_function( func_IN, func_buf );
6096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      patch_op_imm16(&func_buf[0], offs);
6097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // read from fargs[idx] => f14
6099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // store to fargs_priv[idx] => r15 + offs
6100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      f14 = src;
6101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r15 = base;
6102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
6104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
6105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
6106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
6108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %016llx, %4d => %016llx, %4d",
6109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx, %4d => %016llx, %4lld",
6111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, double_to_bits(src), offs,
6113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             double_to_bits(*p_dst), r15-base);
6114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_FLOAT_FLAGS
6115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf(" (%08x %08x)", flags, xer);
6116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
6118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(fargs_priv);
6120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_float_st_three_regs (const char* name,
6123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      test_func_t func,
6124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      unused uint32_t test_flags)
6125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile HWord_t base;
6127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, xer;
6128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double src, *p_dst;
6129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, offs;
6130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double *fargs_priv;
6131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int nb_tmp_fargs = nb_fargs;
6132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* if we're storing an fp single-precision, don't want nans
6135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      - the vex implementation doesn't like them (yet)
6136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Note: This is actually a bigger problem: the vex implementation
6137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      rounds these insns twice.  This leads to many rounding errors.
6138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      For the small fargs set, however, this doesn't show up.
6139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
6140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (strstr(name, "stfs") != NULL)  // stfs(u)(x)
6141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      nb_tmp_fargs = nb_normal_fargs;
6142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // private fargs table to store to
6145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fargs_priv = malloc(nb_tmp_fargs * sizeof(double));
6146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   /* offset within [1-nb_tmp_fargs:nb_tmp_fargs] */
6148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //   for (i=1-nb_tmp_fargs; i<nb_tmp_fargs; i++) {
6149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_tmp_fargs; i++) {
6150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      offs = i * 8;    // offset = i * sizeof(double)
6151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i < 0) {
6152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src   =  fargs     [nb_tmp_fargs-1 + i];
6153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p_dst = &fargs_priv[nb_tmp_fargs-1 + i];
6154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         base  = (HWord_t)&fargs_priv[nb_tmp_fargs-1];
6155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
6156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src   =  fargs     [i];
6157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p_dst = &fargs_priv[i];
6158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         base  = (HWord_t)&fargs_priv[0];
6159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *p_dst = 0;  // clear dst
6161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      f14  = src;    // read from fargs
6163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r15  = base;   // store to r15 + offs
6164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r16  = offs;
6165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      SET_CR_XER_ZERO;
6167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
6168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      GET_CR_XER(flags,xer);
6169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
6171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %016llx, %4d => %016llx, %4d",
6172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx, %4lld => %016llx, %4lld",
6174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, double_to_bits(src), r16/*offs*/,
6176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             double_to_bits(*p_dst), r15-base);
6177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_FLOAT_FLAGS
6178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf(" (%08x %08x)", flags, xer);
6179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
6181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
6184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // print double precision result
6185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
6186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %016llx (%014e), %4d => %016llx (%014e), %08x (%08x %08x)\n",
6187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx (%014e), %4d => %016llx (%014e), %08x (%08x %08x)\n",
6189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, double_to_bits(src), src, offs,
6191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             double_to_bits(*p_dst), *p_dst, r15, flags, xer);
6192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // print single precision result
6194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __powerpc64__
6195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %016llx (%014e), %4d => %08x (%f), %08x (%08x %08x)\n",
6196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      printf("%s %016llx (%014e), %4d => %08x (%f), %08x (%08x %08x)\n",
6198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             name, double_to_bits(src), src, offs,
6200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             (uint32_t)(double_to_bits(*p_dst) >> 32),
6201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             bits_to_float( (uint32_t)(double_to_bits(*p_dst) >> 32) ),
6202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             r15, flags, xer);
6203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(fargs_priv);
6206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Used in do_tests, indexed by flags->nb_args
6210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Elements correspond to enum test_flags::num args
6211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
6212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_loop_t float_loops[] = {
6213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_one_arg,
6214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_two_args,
6215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_three_args,
6216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_two_args,
6217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
6218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
6219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_special,
6220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_ld_one_reg_imm16,
6221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_ld_two_regs,
6222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_st_two_regs_imm16,
6223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_float_st_three_regs,
6224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
6225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
6226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
6229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Ref: vector insns to test setting CR, VSCR:
6231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         volatile vector unsigned int v1 =
6232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            //            (vector unsigned int){ 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF };
6233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (vector unsigned int){ 0x80808080,0x80808080,0x80808080,0x80808080 };
6234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         volatile vector unsigned int v2 =
6235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            //            (vector unsigned int){ 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF };
6236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (vector unsigned int){ 0x01010101,0x01010101,0x01010101,0x01010101 };
6237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         //__asm__ __volatile__ ("vcmpequw. 31,%0,%1" : : "v" (v1), "v" (v2));   // sets CR[6]
6238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         //__asm__ __volatile__ ("vpkswss 31,%0,%1" : : "v" (v1), "v" (v2));     // sets VSCR[SAT]
6239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vsubsbs 31,%0,%1" : : "v" (v1), "v" (v2));       // sets VSCR[SAT]
6240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
6241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//#define DEFAULT_VSCR 0x00010000
6243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DEFAULT_VSCR 0x0
6244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_int_one_arg (const char* name, test_func_t func,
6246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 unused uint32_t test_flags)
6247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in, vec_out, vscr;
6251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src, *dst;
6252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
6253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
6255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++) {
6258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Save flags */
6259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_in  = (vector unsigned int)viargs[i];
6263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_out = (vector unsigned int){ 0,0,0,0 };
6264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // reset VSCR and CR
6266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags = 0;
6268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // load input -> r14
6272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in));
6273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // do stuff
6275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
6276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // retrieve output <- r17
6278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // get CR,VSCR flags
6281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Restore flags */
6285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      src = (unsigned int*)&vec_in;
6289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      dst = (unsigned int*)&vec_out;
6290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s: %08x %08x %08x %08x\n", name,
6292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             src[0], src[1], src[2], src[3]);
6293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s:  => %08x %08x %08x %08x ", name,
6294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             dst[0], dst[1], dst[2], dst[3]);
6295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p_vscr = (unsigned int*)&vscr;
6297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("(%08x, %08x)\n", flags, p_vscr[3]);
6298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("(%08x)\n", flags);
6300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_int_two_args (const char* name, test_func_t func,
6305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  unused uint32_t test_flags)
6306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in1, vec_in2, vec_out, vscr;
6310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src1, *src2, *dst;
6311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j;
6312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
6314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++) {
6317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_in1 = (vector unsigned int)viargs[i];
6318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_viargs; j++) {
6319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_in2 = (vector unsigned int)viargs[j];
6320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_out = (vector unsigned int){ 0,0,0,0 };
6321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Save flags */
6323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // reset VSCR and CR
6327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags = 0;
6329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load inputs -> r14,r15
6333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in1));
6334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 15,%0,%0" : : "v" (vec_in2));
6335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // do stuff
6337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
6338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // retrieve output <- r17
6340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // get CR,VSCR flags
6343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Restore flags */
6347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src1 = (unsigned int*)&vec_in1;
6351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src2 = (unsigned int*)&vec_in2;
6352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst  = (unsigned int*)&vec_out;
6353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s: ", name);
6355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%08x%08x%08x%08x, ", src1[0], src1[1], src1[2], src1[3]);
6356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%08x%08x%08x%08x\n", src2[0], src2[1], src2[2], src2[3]);
6357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s:  => %08x %08x %08x %08x ", name,
6358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                dst[0], dst[1], dst[2], dst[3]);
6359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p_vscr = (unsigned int*)&vscr;
6361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x, %08x)\n", flags, p_vscr[3]);
6362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x)\n", flags);
6364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
6367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_int_three_args (const char* name, test_func_t func,
6371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    unused uint32_t test_flags)
6372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in1, vec_in2, vec_in3, vec_out, vscr;
6376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src1, *src2, *src3, *dst;
6377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j,k;
6378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
6380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++) {
6383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_in1 = (vector unsigned int)viargs[i];
6384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_viargs; j++) {
6385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_in2 = (vector unsigned int)viargs[j];
6386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<nb_viargs; k++) {
6387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vec_in3 = (vector unsigned int)viargs[k];
6388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vec_out = (vector unsigned int){ 0,0,0,0 };
6389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Save flags */
6391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // reset VSCR and CR
6395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags = 0;
6397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // load inputs -> r14,r15,r16
6401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in1));
6402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("vor 15,%0,%0" : : "v" (vec_in2));
6403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("vor 16,%0,%0" : : "v" (vec_in3));
6404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // do stuff
6406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
6407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // retrieve output <- r17
6409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // get CR,VSCR flags
6412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Restore flags */
6416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src1 = (unsigned int*)&vec_in1;
6420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src2 = (unsigned int*)&vec_in2;
6421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src3 = (unsigned int*)&vec_in3;
6422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            dst  = (unsigned int*)&vec_out;
6423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s: %08x%08x%08x%08x, %08x%08x%08x%08x, %08x%08x%08x%08x\n", name,
6425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   src1[0], src1[1], src1[2], src1[3],
6426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   src2[0], src2[1], src2[2], src2[3],
6427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   src3[0], src3[1], src3[2], src3[3]);
6428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s:  => %08x%08x%08x%08x ", name,
6430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   dst[0], dst[1], dst[2], dst[3]);
6431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p_vscr = (unsigned int*)&vscr;
6433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("(%08x, %08x)\n", flags, p_vscr[3]);
6434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("(%08x)\n", flags);
6436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
6439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void vs128_cb (const char* name, test_func_t func,
6445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
6446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned char vec_shft;
6450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in1, vec_out, vscr;
6451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src1, *src2, *dst;
6452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j;
6453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
6455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++) {
6458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_in1 = (vector unsigned int)viargs[i];
6459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<8; j++) {
6460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* low-order 3bits of every byte must be the same for the shift vector */
6461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_shft = (vector unsigned char) { j,j,j,j, j,j,j,j, j,j,j,j, j,j,j,j };
6462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_out  = (vector unsigned int){ 0,0,0,0 };
6463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Save flags */
6465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // reset VSCR and CR
6469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags = 0;
6471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load inputs -> r14,r15
6475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in1));
6476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 15,%0,%0" : : "v" (vec_shft));
6477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // do stuff
6479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
6480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // retrieve output <- r17
6482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // get CR,VSCR flags
6485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Restore flags */
6489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src1 = (unsigned int*)&vec_in1;
6493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src2 = (unsigned int*)&vec_shft;
6494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst  = (unsigned int*)&vec_out;
6495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s: ", name);
6497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%08x%08x%08x%08x, ", src1[0], src1[1], src1[2], src1[3]);
6498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%08x%08x%08x%08x\n", src2[0], src2[1], src2[2], src2[3]);
6499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s:  => %08x %08x %08x %08x ", name,
6501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                dst[0], dst[1], dst[2], dst[3]);
6502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p_vscr = (unsigned int*)&vscr;
6504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x, %08x)\n", flags, p_vscr[3]);
6505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x)\n", flags);
6507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
6510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void vsplt_cb (const char* name, test_func_t func_IN,
6514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
6515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
6517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
6518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in1, vec_out, vscr;
6521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src1, *dst;
6522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j;
6523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
6525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++) {
6528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_in1 = (vector unsigned int)viargs[i];
6529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<16; j+=3) {
6531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_out = (vector unsigned int){ 0,0,0,0 };
6532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Patch up the instruction */
6534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         func = init_function( func_IN, func_buf );
6535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm(&func_buf[0], j, 16, 5);
6536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Save flags */
6538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // reset VSCR and CR
6542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags = 0;
6544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load input -> r14
6548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in1));
6549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // do stuff
6551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
6552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // retrieve output <- r17
6554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // get CR,VSCR flags
6557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Restore flags */
6561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src1 = (unsigned int*)&vec_in1;
6565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst  = (unsigned int*)&vec_out;
6566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s: ", name);
6568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%08x %08x %08x %08x, %u\n", src1[0], src1[1], src1[2], src1[3], j);
6569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s:  => %08x %08x %08x %08x ", name,
6571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                dst[0], dst[1], dst[2], dst[3]);
6572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p_vscr = (unsigned int*)&vscr;
6574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x, %08x)\n", flags, p_vscr[3]);
6575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x)\n", flags);
6577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
6580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void vspltis_cb (const char* name, test_func_t func_IN,
6584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      unused uint32_t test_flags)
6585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
6587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
6588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_out, vscr;
6591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *dst;
6592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
6593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
6595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<32; i++) {
6598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_out = (vector unsigned int){ 0,0,0,0 };
6599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Patch up the instruction */
6601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      func = init_function( func_IN, func_buf );
6602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      patch_op_imm(&func_buf[0], i, 16, 5);
6603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Save flags */
6605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // reset VSCR and CR
6609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags = 0;
6611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // do stuff
6615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
6616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // retrieve output <- r17
6618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // get CR,VSCR flags
6621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Restore flags */
6625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      dst = (unsigned int*)&vec_out;
6629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s: %2d => ", name, i);
6631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%08x %08x %08x %08x ", dst[0], dst[1], dst[2], dst[3]);
6632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p_vscr = (unsigned int*)&vscr;
6634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("(%08x, %08x)\n", flags, p_vscr[3]);
6635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("(%08x)\n", flags);
6637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void vsldoi_cb (const char* name, test_func_t func_IN,
6642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       unused uint32_t test_flags)
6643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
6645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
6646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in1, vec_in2, vec_out, vscr;
6649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src1, *src2, *dst;
6650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j,k;
6651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
6653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++) {
6656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_in1 = (vector unsigned int)viargs[i];
6657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_viargs; j++) {
6658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_in2 = (vector unsigned int)viargs[j];
6659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<16; k+=14) {
6660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vec_out = (vector unsigned int){ 0,0,0,0 };
6661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Patch up the instruction */
6663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            func = init_function( func_IN, func_buf );
6664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            patch_op_imm(&func_buf[0], k, 6, 4);
6665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Save flags */
6667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // reset VSCR and CR
6671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags = 0;
6673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // load inputs -> r14,r15
6677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in1));
6678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("vor 15,%0,%0" : : "v" (vec_in2));
6679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // do stuff
6681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
6682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // retrieve output <- r17
6684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // get CR,VSCR flags
6687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Restore flags */
6691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src1   = (unsigned int*)&vec_in1;
6695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src2   = (unsigned int*)&vec_in2;
6696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            dst    = (unsigned int*)&vec_out;
6697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s: ", name);
6699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%08x%08x%08x%08x, %08x%08x%08x%08x, %u\n",
6700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   src1[0], src1[1], src1[2], src1[3],
6701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   src2[0], src2[1], src2[2], src2[3], k);
6702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s:  => %08x %08x %08x %08x] ", name,
6704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   dst[0], dst[1], dst[2], dst[3]);
6705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p_vscr = (unsigned int*)&vscr;
6707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("(%08x, %08x)\n", flags, p_vscr[3]);
6708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
6709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("(%08x)\n", flags);
6710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
6713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* lvsl, lvsr */
6718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void lvs_cb (const char *name, test_func_t func,
6719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    unused uint32_t test_flags)
6720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_out, vscr;
6724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *dst;
6725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
6726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
6727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
6728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
6729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=-1; i<17; i++) {
6731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_out = (vector unsigned int){ 0,0,0,0 };
6732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // make sure start address is 16 aligned - use viargs[0]
6734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r15 = (HWord_t)&viargs[0];
6735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r14 = i;
6736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Save flags */
6738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // reset VSCR and CR
6742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags = 0;
6744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // do stuff
6748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
6749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // retrieve output <- r17
6751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // get CR,VSCR flags
6754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Restore flags */
6758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      dst = (unsigned int*)&vec_out;
6762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s %3d, %3d", name, i, 0);
6764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf(" => %08x %08x %08x %08x ", dst[0], dst[1], dst[2], dst[3]);
6765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("(%08x)\n", flags);
6766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (verbose) printf("\n");
6768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic special_t special_av_int_ops[] = {
6771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vsr", /* Two registers arguments */
6773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vs128_cb,
6774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vsl", /* Two registers arguments */
6777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vs128_cb,
6778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vspltb", /* One reg, one 5-bit uimm arguments */
6781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vsplt_cb,
6782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vsplth", /* One reg, one 5-bit uimm arguments */
6785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vsplt_cb,
6786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vspltw", /* One reg, one 5-bit uimm arguments */
6789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vsplt_cb,
6790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vspltisb", /* One reg, one 5-bit uimm arguments */
6793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vspltis_cb,
6794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vspltish", /* One reg, one 5-bit uimm arguments */
6797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vspltis_cb,
6798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vspltisw", /* One reg, one 5-bit uimm arguments */
6801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vspltis_cb,
6802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vsldoi", /* Two regs, one 4-bit uimm arguments */
6805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vsldoi_cb,
6806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "lvsl", /* Two regs */
6809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &lvs_cb,
6810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "lvsr", /* Two regs */
6813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &lvs_cb,
6814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
6816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NULL,
6817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NULL,
6818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
6819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
6820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_int_special (const char* name, test_func_t func,
6822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 uint32_t test_flags)
6823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_special(special_av_int_ops, name, func, test_flags);
6825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_int_ld_two_regs (const char *name,
6828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  test_func_t func,
6829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                  unused uint32_t test_flags)
6830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in, vec_out, vscr;
6834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src, *dst;
6835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j, k, do_mask;
6836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do_mask = 0;
6838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (strstr(name, "lvebx") != NULL) do_mask = 1;
6839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (strstr(name, "lvehx") != NULL) do_mask = 2;
6840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (strstr(name, "lvewx") != NULL) do_mask = 4;
6841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++) {
6843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<16; j+=7) {
6844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_out = (vector unsigned int){ 0,0,0,0 };
6845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load from viargs array + some dis-alignment
6847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r15 = (HWord_t)&viargs[0];
6848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r14 = i*16 + j;
6849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Save flags */
6851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // reset VSCR and CR
6855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags = 0;
6857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // do stuff
6861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
6862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // retrieve output <- r17
6864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
6865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // get CR,VSCR flags
6867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Restore flags */
6871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_in = (vector unsigned int)viargs[i];
6875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src = (unsigned int*)&vec_in;
6876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst = (unsigned int*)&vec_out;
6877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* For lvebx/lvehx/lvewx, as per the documentation, all of
6879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            the dest reg except the loaded bits are undefined
6880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            afterwards.  And different CPUs really do produce
6881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            different results.  So mask out bits of the result that
6882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            are undefined so as to make the test work reliably. */
6883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (do_mask == 1) {
6884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            char* p = (char*)dst;
6885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (k = 0; k < 16; k++)
6886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (k != j)
6887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  p[k] = (char)0;
6888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (do_mask == 2) {
6890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            short* p = (short*)dst;
6891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (k = 0; k < 8; k++)
6892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (k != (j>>1))
6893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  p[k] = (short)0;
6894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (do_mask == 4) {
6896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            int* p = (int*)dst;
6897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            for (k = 0; k < 4; k++)
6898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (k != (j>>2))
6899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  p[k] = (int)0;
6900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
6901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s %3d, %08x %08x %08x %08x", name, j, src[0], src[1], src[2], src[3]);
6903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf(" => %08x %08x %08x %08x ", dst[0], dst[1], dst[2], dst[3]);
6904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x)\n", flags);
6905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
6907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_int_st_three_regs (const char *name,
6912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       test_func_t func,
6913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       unused uint32_t test_flags)
6914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in, vec_out, vscr;
6918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src, *dst;
6919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j;
6920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vector unsigned int* viargs_priv;
6921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // private viargs table to store to
6923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   viargs_priv = memalign16(nb_viargs * sizeof(vector unsigned int));
6924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++)
6925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      viargs_priv[i] = (vector unsigned int) { 0,0,0,0 };
6926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_viargs; i++) {
6928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<16; j+=7) {
6929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // read from viargs
6930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_in = (vector unsigned int)viargs[i];
6931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // store to viargs_priv[0] + some dis-alignment
6933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r16 = (HWord_t)&viargs_priv[0];
6934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r15 = i*16 + j;
6935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Save flags */
6937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
6938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
6939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // reset VSCR and CR
6941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
6942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags = 0;
6943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
6944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
6945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load inputs -> r14
6947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in));
6948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // do stuff
6950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
6951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Output stored in viargs_priv
6953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // get CR,VSCR flags
6955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
6956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
6957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Restore flags */
6959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
6960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
6961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_out = (vector unsigned int)viargs_priv[i];
6963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src = (unsigned int*)&vec_in;
6964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst = (unsigned int*)&vec_out;
6965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s %3d, %08x %08x %08x %08x", name, j, src[0], src[1], src[2], src[3]);
6967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf(" => %08x %08x %08x %08x ", dst[0], dst[1], dst[2], dst[3]);
6968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x)\n", flags);
6969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
6970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
6971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
6972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
6973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Used in do_tests, indexed by flags->nb_args
6975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Elements correspond to enum test_flags::num args
6976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
6977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_loop_t altivec_int_loops[] = {
6978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_int_one_arg,
6979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_int_two_args,
6980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_int_three_args,
6981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_int_two_args,
6982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
6983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
6984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_int_special,
6985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
6986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_int_ld_two_regs,
6987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
6988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_av_int_st_three_regs,
6989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
6990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_float_one_arg (const char* name, test_func_t func,
6993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   unused uint32_t test_flags)
6994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
6995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
6996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
6997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector float vec_in, vec_out;
6998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vscr;
6999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src, *dst;
7000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
7001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
7002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
7003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* if we're doing an estimation operation, arrange to zap the
7006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      bottom 10-bits of the result as it's basically garbage, and differs
7007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      between cpus */
7008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int mask
7009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = (strstr(name,"vrsqrtefp") != NULL ||
7010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         strstr(name,    "vrefp") != NULL)
7011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           ? 0xFFFFC000 : 0xFFFFFFFF;
7012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_vfargs; i++) {
7014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_in  = (vector float)vfargs[i];
7015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_out = (vector float){ 0.0, 0.0, 0.0, 0.0 };
7016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Save flags */
7018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
7019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
7020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // reset VSCR and CR
7022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
7023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags = 0;
7024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
7025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
7026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // load input -> r14
7028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in));
7029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // do stuff
7031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*func)();
7032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // retrieve output <- r17
7034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
7035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // get CR,VSCR flags
7037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
7038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
7039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Restore flags */
7041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
7042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
7043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      src = (unsigned int*)&vec_in;
7045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      dst = (unsigned int*)&vec_out;
7046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s: %08x %08x %08x %08x\n", name,
7048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             src[0], src[1], src[2], src[3]);
7049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s:  => %08x %08x %08x %08x ", name,
7050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             dst[0] & mask, dst[1] & mask, dst[2] & mask, dst[3] & mask);
7051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
7052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p_vscr = (unsigned int*)&vscr;
7053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("(%08x, %08x)\n", flags, p_vscr[3]);
7054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("(%08x)\n", flags);
7056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_float_two_args (const char* name, test_func_t func,
7061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    unused uint32_t test_flags)
7062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
7064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
7065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector float vec_in1, vec_in2, vec_out;
7066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vscr;
7067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src1, *src2, *dst;
7068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j;
7069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
7070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
7071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_vfargs; i++) {
7074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_vfargs; j+=3) {
7075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_in1 = (vector float)vfargs[i];
7076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_in2 = (vector float)vfargs[j];
7077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_out = (vector float){ 0.0, 0.0, 0.0, 0.0 };
7078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Save flags */
7080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
7081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
7082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // reset VSCR and CR
7084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
7085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags = 0;
7086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
7087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
7088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load inputs -> r14,r15
7090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in1));
7091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 15,%0,%0" : : "v" (vec_in2));
7092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // do stuff
7094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
7095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // retrieve output <- r17
7097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
7098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // get CR,VSCR flags
7100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
7101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
7102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Restore flags */
7104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
7105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
7106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src1 = (unsigned int*)&vec_in1;
7108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src2 = (unsigned int*)&vec_in2;
7109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst  = (unsigned int*)&vec_out;
7110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s: %08x%08x%08x%08x, %08x%08x%08x%08x\n", name,
7112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                src1[0], src1[1], src1[2], src1[3],
7113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                src2[0], src2[1], src2[2], src2[3]);
7114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s:  => %08x %08x %08x %08x ", name,
7115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                dst[0], dst[1], dst[2], dst[3]);
7116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
7117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p_vscr = (unsigned int*)&vscr;
7118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x, %08x)\n", flags, p_vscr[3]);
7119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("(%08x)\n", flags);
7121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
7124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_float_three_args (const char* name, test_func_t func,
7128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      unused uint32_t test_flags)
7129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
7131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
7132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector float vec_in1, vec_in2, vec_in3, vec_out;
7133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vscr;
7134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src1, *src2, *src3, *dst;
7135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i,j,k,n;
7136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
7137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
7138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_vfargs; i++) {
7141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_vfargs; j+=3) {
7142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<nb_vfargs; k+=5) {
7143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vec_in1 = (vector float)vfargs[i];
7144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vec_in2 = (vector float)vfargs[j];
7145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vec_in3 = (vector float)vfargs[k];
7146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vec_out = (vector float){ 0.0, 0.0, 0.0, 0.0 };
7147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Save flags */
7149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
7150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
7151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // reset VSCR and CR
7153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
7154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags = 0;
7155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
7156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
7157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // load inputs -> r14,r15,r16
7159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in1));
7160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("vor 15,%0,%0" : : "v" (vec_in2));
7161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("vor 16,%0,%0" : : "v" (vec_in3));
7162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // do stuff
7164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
7165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // retrieve output <- r17
7167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
7168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // get CR,VSCR flags
7170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
7171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
7172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Restore flags */
7174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
7175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
7176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src1 = (unsigned int*)&vec_in1;
7178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src2 = (unsigned int*)&vec_in2;
7179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src3 = (unsigned int*)&vec_in3;
7180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            dst  = (unsigned int*)&vec_out;
7181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* Valgrind emulation for vmaddfp and vnmsubfp generates negative
7183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * NAN.  Technically, NAN is not positive or negative so mask off
7184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * the sign bit to eliminate false errors.
7185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             *
7186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * Valgrind emulation is creating negative zero.  Mask off negative
7187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * from zero result.
7188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             *
7189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * These are only an issue as we are printing the result in hex.
7190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             *
7191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * The VEX emulation accuracy for the vmaddfp and vnmsubfp
7192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * instructions is off by a single bit in the least significant
7193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * bit position of the result.  Mask off the LSB.
7194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             */
7195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             for (n=0; n<4; n++) {
7197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                /* NAN result*/
7198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                if (((dst[n] & 0x7F800000) == 0x7F800000) &&
7199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   ((dst[n] & 0x7FFFFF) != 0))
7200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   dst[n] &= 0x7FFFFFFF;
7201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                /* Negative zero result */
7203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                else if (dst[n] == 0x80000000)
7204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    dst[n] = 0x0;
7205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                else
7207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    /* The actual result and the emulated result for the
7208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     * vmaddfp and vnmsubfp instructions sometimes differ
7209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     * in the least significant bit.  Mask off the bit.
7210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     */
7211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    dst[n] &= 0xFFFFFFFE;
7212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                }
7213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s: %08x%08x%08x%08x, %08x%08x%08x%08x, %08x%08x%08x%08x\n", name,
7215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   src1[0], src1[1], src1[2], src1[3],
7216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   src2[0], src2[1], src2[2], src2[3],
7217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   src3[0], src3[1], src3[2], src3[3]);
7218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s:  => %08x %08x %08x %08x ", name,
7219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   dst[0], dst[1], dst[2], dst[3]);
7220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
7221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p_vscr = (unsigned int*)&vscr;
7222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("(%08x, %08x)\n", flags, p_vscr[3]);
7223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("(%08x)\n", flags);
7225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
7228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void vcvt_cb (const char* name, test_func_t func_IN,
7233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     unused uint32_t test_flags)
7234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile test_func_t func;
7236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   uint32_t* func_buf = get_rwx_area();
7237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t flags, tmpcr;
7238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int tmpvscr;
7239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile vector unsigned int vec_in, vec_out, vscr;
7240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int *src, *dst;
7241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j;
7242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
7243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned int* p_vscr;
7244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_vfargs; i++) {
7247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vec_in = (vector unsigned int)vfargs[i];
7248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<32; j+=9) {
7250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vec_out = (vector unsigned int){ 0,0,0,0 };
7251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Patch up the instruction */
7253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         func = init_function( func_IN, func_buf );
7254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         patch_op_imm(&func_buf[0], j, 16, 5);
7255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Save flags */
7257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r"  (tmpcr));
7258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (tmpvscr));
7259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // reset VSCR and CR
7261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vscr = (vector unsigned int){ 0,0,0,DEFAULT_VSCR };
7262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags = 0;
7263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (vscr) );
7264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r" (flags));
7265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load input -> r14
7267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("vor 14,%0,%0" : : "v" (vec_in));
7268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // do stuff
7270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (*func)();
7271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // retrieve output <- r17
7273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out));
7274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // get CR,VSCR flags
7276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfcr   %0" : "=r" (flags));
7277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mfvscr %0" : "=vr" (vscr));
7278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Restore flags */
7280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         __asm__ __volatile__ ("mtcr   %0" : : "r"  (tmpcr));
7281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         __asm__ __volatile__ ("mtvscr %0" : : "v" (tmpvscr));
7282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         src = (unsigned int*)&vec_in;
7284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst = (unsigned int*)&vec_out;
7285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s: %08x (%13e), %2u", name, src[0], *(float*)(&src[0]), j);
7287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf(" => %08x (%13e) ", dst[0], *(float*)(&dst[0]));
7288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//         printf(" => %08x ", dst[0]);
7289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined TEST_VSCR_SAT
7290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p_vscr = (unsigned int*)&vscr;
7291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("(%08x, %08x)\n", flags, p_vscr[3]);
7292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("(%08x)\n", flags);
7294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
7297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic special_t special_av_float_ops[] = {
7301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vcfux", /* One reg, one 5-bit uimm argument */
7303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vcvt_cb,
7304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
7305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vcfsx", /* One reg, one 5-bit uimm argument */
7307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vcvt_cb,
7308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
7309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vctuxs", /* One reg, one 5-bit uimm argument */
7311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vcvt_cb,
7312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
7313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vcfux", /* One reg, one 5-bit uimm argument */
7315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vcvt_cb,
7316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
7317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "vctsxs", /* One reg, one 5-bit uimm argument */
7319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      &vcvt_cb,
7320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
7321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
7322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NULL,
7323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      NULL,
7324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   },
7325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
7326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_av_float_special (const char* name, test_func_t func,
7328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                   uint32_t test_flags)
7329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_special(special_av_float_ops, name, func, test_flags);
7331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Used in do_tests, indexed by flags->nb_args
7334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Elements correspond to enum test_flags::num args
7335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
7336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic test_loop_t altivec_float_loops[] = {
7337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_float_one_arg,
7338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_float_two_args,
7339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_float_three_args,
7340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_float_two_args,
7341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
7342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
7343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   &test_av_float_special,
7344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
7345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
7346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
7347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NULL,
7348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
7349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (HAS_ALTIVEC) */
7351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (IS_PPC405)
7354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void test_ppc405 (const char* name, test_func_t func,
7355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         unused uint32_t test_flags)
7356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   volatile uint32_t res, flags, xer, tmpcr, tmpxer;
7358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, k;
7359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; i<nb_iargs; i++) {
7361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; j<nb_iargs; j++) {
7362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         for (k=0; k<nb_iargs; k++) {
7363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r14 = iargs[i];
7364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r15 = iargs[j];
7365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Beware: the third argument and the result
7366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             * are in the same register
7367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             */
7368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r17 = iargs[k];
7369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Save flags */
7371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfcr 18");
7372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tmpcr = r18;
7373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfxer 18");
7374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            tmpxer = r18;
7375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Set up flags for test */
7377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r18 = 0;
7378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtcr 18");
7379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtxer 18");
7380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*func)();
7381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfcr 18");
7382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags = r18;
7383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mfxer 18");
7384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            xer = r18;
7385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            res = r17;
7386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* Restore flags */
7388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r18 = tmpcr;
7389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtcr 18");
7390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            r18 = tmpxer;
7391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            __asm__ __volatile__ ("mtxer 18");
7392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("%s %08x, %08x, %08x => %08x (%08x %08x)\n",
7394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   name, iargs[i], iargs[j], iargs[k], res, flags, xer);
7395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (verbose) printf("\n");
7397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (IS_PPC405) */
7401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int check_filter (char *filter)
7403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char *c;
7405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int ret = 1;
7406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (filter != NULL) {
7408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c = strchr(filter, '*');
7409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (c != NULL) {
7410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *c = '\0';
7411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ret = 0;
7412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return ret;
7416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int check_name (const char* name, const char *filter,
7419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       int exact)
7420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int nlen, flen;
7422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int ret = 0;
7423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (filter != NULL) {
7425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (; isspace(*name); name++)
7426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      FDPRINTF("Check '%s' againt '%s' (%s match)\n",
7428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               name, filter, exact ? "exact" : "starting");
7429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      nlen = strlen(name);
7430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flen = strlen(filter);
7431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (exact) {
7432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (nlen == flen && memcmp(name, filter, flen) == 0)
7433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ret = 1;
7434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
7435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (flen <= nlen && memcmp(name, filter, flen) == 0)
7436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ret = 1;
7437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
7439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ret = 1;
7440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return ret;
7442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct insn_sel_flags_t_struct {
7447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int one_arg, two_args, three_args;
7448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int arith, logical, compare, ldst;
7449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int integer, floats, p405, altivec, faltivec, misc;
7450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int cr;
7451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} insn_sel_flags_t;
7452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void do_tests ( insn_sel_flags_t seln_flags,
7454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       char *filter)
7455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (IS_PPC405)
7457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_loop_t tmpl;
7458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_loop_t *loop;
7460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_t *tests;
7461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int nb_args, type, family;
7462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i, j, n;
7463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int exact;
7464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   exact = check_filter(filter);
7466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   n = 0;
7467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i=0; all_tests[i].name != NULL; i++) {
7468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      nb_args = all_tests[i].flags & PPC_NB_ARGS;
7469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Check number of arguments */
7470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ((nb_args == 1 && !seln_flags.one_arg) ||
7471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (nb_args == 2 && !seln_flags.two_args) ||
7472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (nb_args == 3 && !seln_flags.three_args))
7473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Check instruction type */
7475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      type = all_tests[i].flags & PPC_TYPE;
7476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ((type == PPC_ARITH   && !seln_flags.arith) ||
7477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (type == PPC_LOGICAL && !seln_flags.logical) ||
7478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (type == PPC_COMPARE && !seln_flags.compare) ||
7479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          (type == PPC_LDST && !seln_flags.ldst) ||
7480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          (type == PPC_POPCNT && !seln_flags.arith))
7481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Check instruction family */
7483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      family = all_tests[i].flags & PPC_FAMILY;
7484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if ((family == PPC_INTEGER  && !seln_flags.integer) ||
7485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (family == PPC_FLOAT    && !seln_flags.floats) ||
7486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (family == PPC_405      && !seln_flags.p405) ||
7487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (family == PPC_ALTIVEC  && !seln_flags.altivec) ||
7488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          (family == PPC_MISC  && !seln_flags.misc) ||
7489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (family == PPC_FALTIVEC && !seln_flags.faltivec))
7490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Check flags update */
7492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (((all_tests[i].flags & PPC_CR)  && seln_flags.cr == 0) ||
7493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          (!(all_tests[i].flags & PPC_CR) && seln_flags.cr == 1))
7494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* All passed, do the tests */
7496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      tests = all_tests[i].tests;
7497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Select the test loop */
7498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (family) {
7499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case PPC_INTEGER:
7500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         loop = &int_loops[nb_args - 1];
7501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case PPC_MISC:
7503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         loop = &misc_loops[0];
7504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
7505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case PPC_FLOAT:
7506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (NO_FLOAT)
7507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         loop = &float_loops[nb_args - 1];
7508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Sorry. "
7511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "PPC floating point instructions tests "
7512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "are disabled on your host\n");
7513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* !defined (NO_FLOAT) */
7514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case PPC_405:
7516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (IS_PPC405)
7517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tmpl = &test_ppc405;
7518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         loop = &tmpl;
7519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Sorry. "
7522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "PPC405 instructions tests are disabled on your host\n");
7523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* defined (IS_PPC405) */
7525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case PPC_ALTIVEC:
7526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
7527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         loop = &altivec_int_loops[nb_args - 1];
7528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Sorry. "
7531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "Altivec instructions tests are disabled on your host\n");
7532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case PPC_FALTIVEC:
7535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
7536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         loop = &altivec_float_loops[nb_args - 1];
7537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
7539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Sorry. "
7540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "Altivec float instructions tests "
7541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "are disabled on your host\n");
7542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
7545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("ERROR: unknown insn family %08x\n", family);
7546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         continue;
7547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (1 || verbose > 0)
7549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%s:\n", all_tests[i].name);
7550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j=0; tests[j].name != NULL; j++) {
7551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (check_name(tests[j].name, filter, exact)) {
7552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (verbose > 1)
7553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               printf("Test instruction %s\n", tests[j].name);
7554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            (*loop)(tests[j].name, tests[j].func, all_tests[i].flags);
7555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            printf("\n");
7556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            n++;
7557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        }
7559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (verbose) printf("\n");
7560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("All done. Tested %d different instructions\n", n);
7562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void usage (void)
7566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (USAGE_SIMPLE)
7568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr,
7569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "jm-insns [-1] [-2] [-3] [-*] [-t <type>] [-f <family>] [-u] "
7570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "[-n <filter>] [-r <test_rigour>] [-h]\n"
7571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-1: test opcodes with one argument\n"
7572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-2: test opcodes with two arguments\n"
7573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-3: test opcodes with three arguments\n"
7574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-*: launch test without checking the number of arguments\n"
7575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-t: launch test for instructions of type <type>\n"
7576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t    recognized types:\n"
7577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tarith (or a)\n"
7578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tlogical (or l)\n"
7579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tcompare (or c)\n"
7580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tstoreload (or s)\n"
7581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-f: launch test for instructions of family <family>\n"
7582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t    recognized families:\n"
7583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tinteger (or i)\n"
7584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tfloat (or f)\n"
7585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tppc405 (or mac)\n"
7586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\taltivec (or a)\n"
7587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-u: test instructions that update flags\n"
7588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-n: filter instructions with <filter>\n"
7589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t    <filter> can be in two forms:\n"
7590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tname  : filter functions that exactly match <name>\n"
7591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tname* : filter functions that start with <name>\n"
7592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-r: set size of arg tables to use to define <test_rigour>\n"
7593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t    recognized types:\n"
7594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tlarge (or l)\n"
7595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t\tsmall (or s) - default\n"
7596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-v: verbose (-v -v for more)\n"
7597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-h: print this help\n"
7598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           );
7599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else // #if !defined (USAGE_SIMPLE)
7600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr,
7601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "Usage: jm-insns [OPTION]\n"
7602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-i: test integer instructions (default)\n"
7603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-f: test floating point instructions\n"
7604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-a: test altivec instructions\n"
7605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           "\t-m: test miscellaneous instructions\n"
7606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-A: test all (int, fp, altivec) instructions\n"
7607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-v: be verbose\n"
7608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "\t-h: display this help and exit\n"
7609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           );
7610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #if !defined (USAGE_SIMPLE)
7611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main (int argc, char **argv)
7616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (USAGE_SIMPLE)
7618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown////////////////////////////////////////////////////////////////////////
7619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char *tmp, *filter = NULL;
7620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   insn_sel_flags_t flags;
7621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int c;
7622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // check HWord_t really is a host word
7624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(sizeof(void*) == sizeof(HWord_t));
7625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.one_arg    = 0;
7627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.two_args   = 0;
7628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.three_args = 0;
7629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.arith      = 0;
7630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.logical    = 0;
7631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.compare    = 0;
7632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.ldst       = 0;
7633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.integer    = 0;
7634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.floats     = 0;
7635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.p405       = 0;
7636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.altivec    = 0;
7637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.faltivec   = 0;
7638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.cr         = -1;
7639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while ((c = getopt(argc, argv, "123t:f:n:r:uvh")) != -1) {
7641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (c) {
7642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case '1':
7643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.one_arg = 1;
7644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case '2':
7646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.two_args = 1;
7647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case '3':
7649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.three_args = 1;
7650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 't':
7652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tmp = optarg;
7653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (strcmp(tmp, "arith") == 0 || strcmp(tmp, "a") == 0) {
7654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.arith = 1;
7655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if (strcmp(tmp, "logical") == 0 || strcmp(tmp, "l") == 0) {
7656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.logical = 1;
7657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if (strcmp(tmp, "compare") == 0 || strcmp(tmp, "c") == 0) {
7658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.compare = 1;
7659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if (strcmp(tmp, "storeload") == 0 || strcmp(tmp, "s") == 0) {
7660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.ldst = 1;
7661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
7662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            goto bad_arg;
7663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'f':
7666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tmp = optarg;
7667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (strcmp(tmp, "integer") == 0 || strcmp(tmp, "i") == 0) {
7668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.integer = 1;
7669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if (strcmp(tmp, "float") == 0 || strcmp(tmp, "f") == 0) {
7670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.floats = 1;
7671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if (strcmp(tmp, "ppc405") == 0 || strcmp(tmp, "mac") == 0) {
7672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.p405 = 1;
7673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if (strcmp(tmp, "altivec") == 0 || strcmp(tmp, "a") == 0) {
7674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.altivec = 1;
7675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            flags.faltivec = 1;
7676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
7677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            goto bad_arg;
7678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'n':
7681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         filter = optarg;
7682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'r':
7684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         tmp = optarg;
7685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (strcmp(tmp, "large") == 0 || strcmp(tmp, "l") == 0) {
7686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            arg_list_size = 1;
7687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else if (strcmp(tmp, "small") == 0 || strcmp(tmp, "s") == 0) {
7688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            arg_list_size = 0;
7689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
7690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            goto bad_arg;
7691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
7692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'u':
7695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.cr = 1;
7696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'h':
7698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         usage();
7699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return 0;
7700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'v':
7701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         verbose++;
7702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
7704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         usage();
7705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Unknown argument: '%c'\n", c);
7706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return 1;
7707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bad_arg:
7708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         usage();
7709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Bad argument for '%c': '%s'\n", c, tmp);
7710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return 1;
7711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (argc != optind) {
7714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      usage();
7715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fprintf(stderr, "Bad number of arguments\n");
7716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return 1;
7717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Default n_args
7720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags.one_arg == 0 && flags.two_args == 0 && flags.three_args == 0) {
7721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.one_arg = 1;
7722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.two_args = 1;
7723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.three_args = 1;
7724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Default type
7726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags.arith == 0 && flags.logical == 0 &&
7727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       flags.compare == 0 && flags.ldst == 0) {
7728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.arith   = 1;
7729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.logical = 1;
7730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.compare = 1;
7731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.ldst    = 1;
7732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Default family
7734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags.integer == 0 && flags.floats == 0 &&
7735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       flags.p405 == 0 && flags.altivec == 0 && flags.faltivec == 0) {
7736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.integer  = 1;
7737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.floats   = 1;
7738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.p405     = 1;
7739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.altivec  = 1;
7740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.faltivec = 1;
7741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Default cr update
7743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags.cr == -1)
7744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags.cr = 2;       // both
7745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else // #if !defined (USAGE_SIMPLE)
7747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown////////////////////////////////////////////////////////////////////////
7748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Simple usage:
7749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ./jm-insns -i   => int insns
7750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ./jm-insns -f   => fp  insns
7751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ./jm-insns -a   => av  insns
7752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ./jm-insns -m   => miscellaneous insns
7753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ./jm-insns -A   => int, fp and avinsns
7754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
7755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char *filter = NULL;
7756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   insn_sel_flags_t flags;
7757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int c;
7758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Args
7760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.one_arg    = 1;
7761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.two_args   = 1;
7762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.three_args = 1;
7763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Type
7764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.arith      = 1;
7765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.logical    = 1;
7766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.compare    = 1;
7767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.ldst       = 1;
7768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Family
7769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.integer    = 0;
7770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.floats     = 0;
7771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   flags.misc       = 0;
7772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.p405       = 0;
7773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.altivec    = 0;
7774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.faltivec   = 0;
7775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Flags
7776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   flags.cr         = 2;
7777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while ((c = getopt(argc, argv, "ifmahvA")) != -1) {
7779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (c) {
7780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'i':
7781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.integer  = 1;
7782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'f':
7784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.floats   = 1;
7785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'a':
7787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.altivec  = 1;
7788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.faltivec = 1;
7789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 'm':
7791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         flags.misc     = 1;
7792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
7793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'A':
7794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.integer  = 1;
7795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.floats   = 1;
7796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.altivec  = 1;
7797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         flags.faltivec = 1;
7798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'h':
7800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         usage();
7801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return 0;
7802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case 'v':
7803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         verbose++;
7804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
7805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
7806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         usage();
7807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Unknown argument: '%c'\n", c);
7808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return 1;
7809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
7810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   arg_list_size = 0;
7813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // #if !defined (USAGE_SIMPLE)
7814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   build_iargs_table();
7817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   build_fargs_table();
7818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   build_ii16_table();
7819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
7820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (flags.altivec || flags.faltivec) {
7821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      build_viargs_table();
7822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      build_vfargs_table();
7823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // dump_iargs();
7826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // dump_iargs16();
7827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // dump_vfargs();
7828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (verbose > 1) {
7830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\nInstruction Selection:\n");
7831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("  n_args: \n");
7832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    one_arg    = %d\n", flags.one_arg);
7833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    two_args   = %d\n", flags.two_args);
7834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    three_args = %d\n", flags.three_args);
7835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("  type: \n");
7836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    arith      = %d\n", flags.arith);
7837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    logical    = %d\n", flags.logical);
7838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    compare    = %d\n", flags.compare);
7839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    ldst       = %d\n", flags.ldst);
7840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("  family: \n");
7841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    integer    = %d\n", flags.integer);
7842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    floats     = %d\n", flags.floats);
7843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    p405       = %d\n", flags.p405);
7844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    altivec    = %d\n", flags.altivec);
7845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    faltivec   = %d\n", flags.faltivec);
7846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("  cr update: \n");
7847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    cr         = %d\n", flags.cr);
7848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
7849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("  num args: \n");
7850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    iargs      - %d\n", nb_iargs);
7851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    fargs      - %d\n", nb_fargs);
7852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined (HAS_ALTIVEC)
7853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    viargs     - %d\n", nb_viargs);
7854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("    vfargs     - %d\n", nb_vfargs);
7855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
7856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
7857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
7858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do_tests( flags, filter );
7860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
7862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
7863