1dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* HOW TO COMPILE:
3dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
4dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 32bit build:
56277067119ad816282b8e57727295b3adee14075carll   gcc -Winline -Wall -g -O -mregnames -maltivec -m32
6dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 64bit build:
7dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   gcc -Winline -Wall -g -O -mregnames -maltivec -m64
8dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
9dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll * test_isa_2_07_part1.c:
11dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * PPC tests for the ISA 2.07.  This file is based on the
12dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * jm-insns.c file for the new instructions in the ISA 2.07.  The
13dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * test structure has been kept the same as the original file to
14dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * the extent possible.
15dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
16dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * Copyright (C) 2013 IBM
17dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
18dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   Authors: Carl Love <carll@us.ibm.com>
19dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *            Maynard Johnson <maynardj@us.ibm.com>
20dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
21dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   This program is free software; you can redistribute it and/or
22dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   modify it under the terms of the GNU General Public License as
23dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   published by the Free Software Foundation; either version 2 of the
24dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   License, or (at your option) any later version.
25dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
26dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   This program is distributed in the hope that it will be useful,
27dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   but WITHOUT ANY WARRANTY; without even the implied warranty of
28dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   GNU General Public License for more details.
30dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
31dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   You should have received a copy of the GNU General Public License
32dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   along with this program; if not, write to the Free Software
33dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
34dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
35dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */
36dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
37dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/*
38dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * Operation details
39dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * -----------------
40dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
41dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * The 'loops' (e.g. int_loops) do the actual work:
42dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *  - loops over as many arguments as the insn needs (regs | imms)
43dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *     - sets up the environment (reset cr,xer, assign src regs...)
44dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *     - maybe modifies the asm instn to test different imm args
45dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *     - calls the test function
46dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *     - retrieves relevant register data (rD,cr,xer,...)
47dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *     - prints argument and result data.
48dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
49dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * More specifically...
50dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
51dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * all_tests[i] holds insn tests
52dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *  - of which each holds: {instn_test_arr[], description, flags}
53dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
54dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * flags hold 3 instn classifiers: {family, type, arg_type}
55dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
56dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * // The main test loop:
57dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * do_tests( user_ctl_flags ) {
58dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *    foreach(curr_test = all_test[i]) {
59dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
60dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       // flags are used to control what tests are run:
61dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       if (curr_test->flags && !user_ctl_flags)
62dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *          continue;
63dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
64dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       // a 'loop_family_arr' is chosen based on the 'family' flag...
65dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       switch(curr_test->flags->family) {
66dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       case x: loop_family_arr = int_loops;
67dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *      ...
68dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       }
69dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
70dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       // ...and the actual test_loop to run is found by indexing into
71dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       // the loop_family_arr with the 'arg_type' flag:
72dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       test_loop = loop_family[curr_test->flags->arg_type]
73dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
74dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       // finally, loop over all instn tests for this test:
75dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       foreach (instn_test = curr_test->instn_test_arr[i]) {
76dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
77dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *          // and call the test_loop with the current instn_test function,name
78dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *          test_loop( instn_test->func, instn_test->name )
79dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *       }
80dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *    }
81dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * }
82dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *
83dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */
84dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
85dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
86dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/**********************************************************************/
87dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
88dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Uncomment to enable output of CR flags for float tests */
89dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll//#define TEST_FLOAT_FLAGS
90dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
91dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Uncomment to enable debug output */
92dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll//#define DEBUG_ARGS_BUILD
93dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll//#define DEBUG_FILTER
94dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
95dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/**********************************************************************/
96dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <stdio.h>
97dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
98dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#ifdef HAS_ISA_2_07
99dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
100dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include "config.h"
101dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <altivec.h>
102dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <stdint.h>
103dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
104dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <assert.h>
105dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <ctype.h>     // isspace
106dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <stdlib.h>
107dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <string.h>
108dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <unistd.h>    // getopt
109dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
110dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#if !defined (__TEST_PPC_H__)
111dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define __TEST_PPC_H__
112dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
113dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include "tests/sys_mman.h"
114dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include "tests/malloc.h"       // memalign16
115dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
116dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define STATIC_ASSERT(e) sizeof(struct { int:-!(e); })
117dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
118dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Something of the same size as void*, so can be safely be coerced
119dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * to/from a pointer type. Also same size as the host's gp registers.
120dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * According to the AltiVec section of the GCC manual, the syntax does
121dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * not allow the use of a typedef name as a type specifier in conjunction
122dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * with the vector keyword, so typedefs uint[32|64]_t are #undef'ed here
123dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * and redefined using #define.
124dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */
125dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#undef uint32_t
126dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#undef uint64_t
127dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define uint32_t unsigned int
128dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define uint64_t unsigned long long int
129dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
130dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#ifndef __powerpc64__
131dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef uint32_t  HWord_t;
132a81925998c22a5af981c6933f56f24437e790447carll#define ZERO 0
133dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#else
134dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef uint64_t  HWord_t;
135a81925998c22a5af981c6933f56f24437e790447carll#define ZERO 0ULL
136dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif /* __powerpc64__ */
137dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
138dd690bf8d81c9119a7228446be12e3366e202176carll#ifdef VGP_ppc64le_linux
139dd690bf8d81c9119a7228446be12e3366e202176carll#define isLE 1
140dd690bf8d81c9119a7228446be12e3366e202176carll#else
141dd690bf8d81c9119a7228446be12e3366e202176carll#define isLE 0
142dd690bf8d81c9119a7228446be12e3366e202176carll#endif
143dd690bf8d81c9119a7228446be12e3366e202176carll
144dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef uint64_t Word_t;
145dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
146dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllenum {
147dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    compile_time_test1 = STATIC_ASSERT(sizeof(uint32_t) == 4),
148dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    compile_time_test2 = STATIC_ASSERT(sizeof(uint64_t) == 8),
149dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
150dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
151dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
152dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
153dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_CR(_arg) \
154dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      __asm__ __volatile__ ("mtcr  %0" : : "b"(_arg) : ALLCR );
155dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
156dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_XER(_arg) \
157dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" );
158dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
159dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define GET_CR(_lval) \
160dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      __asm__ __volatile__ ("mfcr %0"  : "=b"(_lval) )
161dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
162dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define GET_XER(_lval) \
163dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) )
164dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
165dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define GET_CR_XER(_lval_cr,_lval_xer) \
166dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0)
167dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
168dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_CR_ZERO \
169dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      SET_CR(0)
170dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
171dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_XER_ZERO \
172dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      SET_XER(0)
173dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
174dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_CR_XER_ZERO \
175dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   do { SET_CR_ZERO; SET_XER_ZERO; } while (0)
176dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
177dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_FPSCR_ZERO \
178dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   do { double _d = 0.0; \
179dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll        __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
180dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   } while (0)
181dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
182dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define DEFAULT_VSCR 0x0
183dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
18424e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic vector unsigned long long vec_out, vec_inA, vec_inB, vec_inC;
1856277067119ad816282b8e57727295b3adee14075carllstatic vector unsigned int vec_inA_wd, vec_inB_wd;
186dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
187dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* XXXX these must all be callee-save regs! */
188dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister double f14 __asm__ ("fr14");
189dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister double f15 __asm__ ("fr15");
190dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister double f16 __asm__ ("fr16");
191dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister double f17 __asm__ ("fr17");
192dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister HWord_t r14 __asm__ ("r14");
193a81925998c22a5af981c6933f56f24437e790447carllregister HWord_t r15 __asm__ ("r15");
194a81925998c22a5af981c6933f56f24437e790447carllregister HWord_t r16 __asm__ ("r16");
195dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister HWord_t r17 __asm__ ("r17");
196dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
197dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef void (*test_func_t) (void);
198dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef struct _test test_t;
199dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef struct _test_table test_table_t;
200dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstruct _test {
201dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    test_func_t func;
202dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    const char *name;
203dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
204dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
205dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstruct _test_table {
206dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    test_t *tests;
207dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    const char *name;
208dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    uint32_t flags;
209dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
210dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
211dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef void (*test_loop_t) (const char *name, test_func_t func,
212dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                             uint32_t flags);
213dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
214dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllenum test_flags {
215dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    /* Nb arguments */
216dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_ONE_ARG    = 0x00000001,
217dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_TWO_ARGS   = 0x00000002,
218dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_THREE_ARGS = 0x00000003,
219dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_CMP_ARGS   = 0x00000004,  // family: compare
220dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_CMPI_ARGS  = 0x00000005,  // family: compare
221dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_TWO_I16    = 0x00000006,  // family: arith/logical
222dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_SPECIAL    = 0x00000007,  // family: logical
223dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_LD_ARGS    = 0x00000008,  // family: ldst
224dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_LDX_ARGS   = 0x00000009,  // family: ldst
225dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_ST_ARGS    = 0x0000000A,  // family: ldst
226dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_STX_ARGS   = 0x0000000B,  // family: ldst
227dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_STQ_ARGS   = 0x0000000C,  // family: ldst, two args, imm
228dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_LDQ_ARGS   = 0x0000000D,  // family: ldst, two args, imm
229dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_STQX_ARGS  = 0x0000000E,  // family: ldst, three args
230dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_LDQX_ARGS  = 0x0000000F,  // family: ldst, three_args
231dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_NB_ARGS    = 0x0000000F,
232dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    /* Type */
233dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_ARITH      = 0x00000100,
234dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_LOGICAL    = 0x00000200,
235dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_COMPARE    = 0x00000300,
236dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_CROP       = 0x00000400,
237dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_LDST       = 0x00000500,
238dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_POPCNT     = 0x00000600,
2396277067119ad816282b8e57727295b3adee14075carll    PPC_ARITH_DRES = 0x00000700,
2406277067119ad816282b8e57727295b3adee14075carll    PPC_DOUBLE_IN_IRES = 0x00000800,
241dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_MOV        = 0x00000A00,
24224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    PPC_SHA_OR_BCD = 0x00000B00,
243dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_TYPE       = 0x00000F00,
244dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    /* Family */
245dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_INTEGER    = 0x00010000,
246dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_FLOAT      = 0x00020000,
247dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_405        = 0x00030000,  // Leave so we keep numbering consistent
248dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_ALTIVEC    = 0x00040000,
249dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_FALTIVEC   = 0x00050000,
2506277067119ad816282b8e57727295b3adee14075carll    PPC_ALTIVECD   = 0x00060000,    /* double word Altivec tests */
251e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll    PPC_ALTIVECQ   = 0x00070000,
252dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_FAMILY     = 0x000F0000,
253dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    /* Flags: these may be combined, so use separate bitfields. */
254dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_CR         = 0x01000000,
255dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    PPC_XER_CA     = 0x02000000,
256dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
257dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
258dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif /* !defined (__TEST_PPC_H__) */
259dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
260dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* -------------- END #include "test-ppc.h" -------------- */
261dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
262dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
263dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#if defined (DEBUG_ARGS_BUILD)
264dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
265dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#else
266dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define AB_DPRINTF(fmt, args...) do { } while (0)
267dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif
268dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2696277067119ad816282b8e57727295b3adee14075carll
270dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#if defined (DEBUG_FILTER)
271dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define FDPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
272dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#else
273dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define FDPRINTF(fmt, args...) do { } while (0)
274dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif
275dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
276dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define unused __attribute__ (( unused ))
277dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
278dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef struct special {
279dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   const char *name;
280dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   void (*test_cb)(const char* name, test_func_t func,
281dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                   unused uint32_t test_flags);
282dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} special_t;
283dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
284a81925998c22a5af981c6933f56f24437e790447carllstatic void test_stq(void)
285a81925998c22a5af981c6933f56f24437e790447carll{
286a81925998c22a5af981c6933f56f24437e790447carll  __asm__ __volatile__ ("stq  %0, 0(%1)" : :"r" (r14), "r" (r16));
287a81925998c22a5af981c6933f56f24437e790447carll}
288a81925998c22a5af981c6933f56f24437e790447carll
289a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_istq_ops_two_i16[] = {
290a81925998c22a5af981c6933f56f24437e790447carll    { &test_stq             , "stq", },
291a81925998c22a5af981c6933f56f24437e790447carll    { NULL,                   NULL,           },
292a81925998c22a5af981c6933f56f24437e790447carll};
293a81925998c22a5af981c6933f56f24437e790447carll
294a81925998c22a5af981c6933f56f24437e790447carllstatic void test_lq(void)
295a81925998c22a5af981c6933f56f24437e790447carll{
296a81925998c22a5af981c6933f56f24437e790447carll  __asm__ __volatile__ ("lq  %0, 0(%1)" : :"r" (r14), "r" (r16));
297a81925998c22a5af981c6933f56f24437e790447carll}
298a81925998c22a5af981c6933f56f24437e790447carll
299a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_ildq_ops_two_i16[] = {
300a81925998c22a5af981c6933f56f24437e790447carll    { &test_lq              , "lq", },
301a81925998c22a5af981c6933f56f24437e790447carll    { NULL,                   NULL,          },
302a81925998c22a5af981c6933f56f24437e790447carll};
303a81925998c22a5af981c6933f56f24437e790447carll
304a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#ifdef HAS_ISA_2_07
305a81925998c22a5af981c6933f56f24437e790447carllWord_t * mem_resv;
306a89b04673925f2b40bbc8e060c8aa9f5d451b680carllstatic void test_stbcx(void)
307a89b04673925f2b40bbc8e060c8aa9f5d451b680carll{
308a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  /* Have to do the lbarx to the memory address to create the reservation
309a89b04673925f2b40bbc8e060c8aa9f5d451b680carll   * or the store will not occur.
310a89b04673925f2b40bbc8e060c8aa9f5d451b680carll   */
311a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  __asm__ __volatile__ ("lbarx  %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17));
312a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  r14 = (HWord_t) 0xABEFCD0145236789ULL;
313a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  r15 = (HWord_t) 0x1155337744226688ULL;
314a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  __asm__ __volatile__ ("stbcx. %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17));
315a89b04673925f2b40bbc8e060c8aa9f5d451b680carll}
316a89b04673925f2b40bbc8e060c8aa9f5d451b680carll
317a89b04673925f2b40bbc8e060c8aa9f5d451b680carllstatic void test_sthcx(void)
318a89b04673925f2b40bbc8e060c8aa9f5d451b680carll{
319a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  /* Have to do the lharx to the memory address to create the reservation
320a89b04673925f2b40bbc8e060c8aa9f5d451b680carll   * or the store will not occur.
321a89b04673925f2b40bbc8e060c8aa9f5d451b680carll   */
322a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  __asm__ __volatile__ ("lharx  %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17));
323a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  r14 = (HWord_t) 0xABEFCD0145236789ULL;
324a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  r15 = (HWord_t) 0x1155337744226688ULL;
325a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  __asm__ __volatile__ ("sthcx. %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17));
326a89b04673925f2b40bbc8e060c8aa9f5d451b680carll}
327a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#endif
328a89b04673925f2b40bbc8e060c8aa9f5d451b680carll
329a81925998c22a5af981c6933f56f24437e790447carllstatic void test_stqcx(void)
330a81925998c22a5af981c6933f56f24437e790447carll{
331a81925998c22a5af981c6933f56f24437e790447carll  /* Have to do the lqarx to the memory address to create the reservation
332a81925998c22a5af981c6933f56f24437e790447carll   * or the store will not occur.
333a81925998c22a5af981c6933f56f24437e790447carll   */
334a81925998c22a5af981c6933f56f24437e790447carll  __asm__ __volatile__ ("lqarx  %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17));
335a81925998c22a5af981c6933f56f24437e790447carll  r14 = (HWord_t) 0xABEFCD0145236789ULL;
336a81925998c22a5af981c6933f56f24437e790447carll  r15 = (HWord_t) 0x1155337744226688ULL;
337a81925998c22a5af981c6933f56f24437e790447carll  __asm__ __volatile__ ("stqcx. %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17));
338a81925998c22a5af981c6933f56f24437e790447carll}
339a81925998c22a5af981c6933f56f24437e790447carll
340a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_stq_ops_three[] = {
341a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#ifdef HAS_ISA_2_07
342a89b04673925f2b40bbc8e060c8aa9f5d451b680carll    { &test_stbcx           , "stbcx.", },
343a89b04673925f2b40bbc8e060c8aa9f5d451b680carll    { &test_sthcx           , "sthcx.", },
344a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#endif
345a81925998c22a5af981c6933f56f24437e790447carll    { &test_stqcx           , "stqcx.", },
346a81925998c22a5af981c6933f56f24437e790447carll    { NULL,                   NULL,           },
347a81925998c22a5af981c6933f56f24437e790447carll};
348a81925998c22a5af981c6933f56f24437e790447carll
349a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#ifdef HAS_ISA_2_07
350a89b04673925f2b40bbc8e060c8aa9f5d451b680carllstatic void test_lbarx(void)
351a89b04673925f2b40bbc8e060c8aa9f5d451b680carll{
352a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  __asm__ __volatile__ ("lbarx  %0, %1, %2, 0" : :"r" (r14), "r" (r16),"r" (r17));
353a89b04673925f2b40bbc8e060c8aa9f5d451b680carll}
354a89b04673925f2b40bbc8e060c8aa9f5d451b680carllstatic void test_lharx(void)
355a89b04673925f2b40bbc8e060c8aa9f5d451b680carll{
356a89b04673925f2b40bbc8e060c8aa9f5d451b680carll  __asm__ __volatile__ ("lharx  %0, %1, %2, 0" : :"r" (r14), "r" (r16),"r" (r17));
357a89b04673925f2b40bbc8e060c8aa9f5d451b680carll}
358a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#endif
359a81925998c22a5af981c6933f56f24437e790447carllstatic void test_lqarx(void)
360a81925998c22a5af981c6933f56f24437e790447carll{
361a81925998c22a5af981c6933f56f24437e790447carll  __asm__ __volatile__ ("lqarx  %0, %1, %2, 0" : :"r" (r14), "r" (r16),"r" (r17));
362a81925998c22a5af981c6933f56f24437e790447carll}
363a81925998c22a5af981c6933f56f24437e790447carll
364a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_ldq_ops_three[] = {
365a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#ifdef HAS_ISA_2_07
366a89b04673925f2b40bbc8e060c8aa9f5d451b680carll    { &test_lbarx           , "lbarx", },
367a89b04673925f2b40bbc8e060c8aa9f5d451b680carll    { &test_lharx           , "lharx", },
368a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#endif
369a81925998c22a5af981c6933f56f24437e790447carll    { &test_lqarx           , "lqarx", },
370a81925998c22a5af981c6933f56f24437e790447carll    { NULL,                   NULL,           },
371a81925998c22a5af981c6933f56f24437e790447carll};
372a81925998c22a5af981c6933f56f24437e790447carll
373a81925998c22a5af981c6933f56f24437e790447carllstatic void test_fmrgew (void)
374a81925998c22a5af981c6933f56f24437e790447carll{
375a81925998c22a5af981c6933f56f24437e790447carll    __asm__ __volatile__ ("fmrgew        17,14,15");
376a81925998c22a5af981c6933f56f24437e790447carll};
377a81925998c22a5af981c6933f56f24437e790447carll
378a81925998c22a5af981c6933f56f24437e790447carllstatic void test_fmrgow (void)
379a81925998c22a5af981c6933f56f24437e790447carll{
380a81925998c22a5af981c6933f56f24437e790447carll    __asm__ __volatile__ ("fmrgow        17,14,15");
381a81925998c22a5af981c6933f56f24437e790447carll};
382a81925998c22a5af981c6933f56f24437e790447carll
383a81925998c22a5af981c6933f56f24437e790447carll
384dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
385dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll// VSX move instructions
386dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_mfvsrd (void)
387dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
388dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   __asm__ __volatile__ ("mfvsrd %0,%x1" : "=r" (r14) : "ws" (vec_inA));
389dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
390dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
391a81925998c22a5af981c6933f56f24437e790447carllstatic void test_mfvsrwz (void)
392a81925998c22a5af981c6933f56f24437e790447carll{
393a81925998c22a5af981c6933f56f24437e790447carll   __asm__ __volatile__ ("mfvsrwz %0,%x1" : "=r" (r14) : "ws" (vec_inA));
394a81925998c22a5af981c6933f56f24437e790447carll};
395a81925998c22a5af981c6933f56f24437e790447carll
396dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_mtvsrd (void)
397dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
398dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   __asm__ __volatile__ ("mtvsrd %x0,%1" : "=ws" (vec_out) : "r" (r14));
399dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
400dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
401a81925998c22a5af981c6933f56f24437e790447carllstatic void test_mtvsrwz (void)
402a81925998c22a5af981c6933f56f24437e790447carll{
403a81925998c22a5af981c6933f56f24437e790447carll   __asm__ __volatile__ ("mtvsrwz %x0,%1" : "=ws" (vec_out) : "r" (r14));
404a81925998c22a5af981c6933f56f24437e790447carll};
405a81925998c22a5af981c6933f56f24437e790447carll
406a81925998c22a5af981c6933f56f24437e790447carll
407dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_mtfprwa (void)
408dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
409dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   __asm__ __volatile__ ("mtfprwa %x0,%1" : "=ws" (vec_out) : "r" (r14));
410dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
411dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
412dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic test_t tests_move_ops_spe[] = {
413dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll  { &test_mfvsrd          , "mfvsrd" },
414a81925998c22a5af981c6933f56f24437e790447carll  { &test_mfvsrwz         , "mfvsrwz" },
415dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll  { &test_mtvsrd          , "mtvsrd" },
416a81925998c22a5af981c6933f56f24437e790447carll  { &test_mtvsrwz         , "mtvsrwz" },
417dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll  { &test_mtfprwa         , "mtfprwa" },
418dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll  { NULL,                   NULL }
419dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
420dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
4216277067119ad816282b8e57727295b3adee14075carll/* NOTE: Since these are "vector" instructions versus VSX, we must use
4226277067119ad816282b8e57727295b3adee14075carll * vector constraints.
4236277067119ad816282b8e57727295b3adee14075carll *
4246277067119ad816282b8e57727295b3adee14075carll * Vector Double Word tests.
4256277067119ad816282b8e57727295b3adee14075carll */
4266277067119ad816282b8e57727295b3adee14075carllstatic void test_vpkudum (void)
4276277067119ad816282b8e57727295b3adee14075carll{
4286277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vpkudum %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4296277067119ad816282b8e57727295b3adee14075carll}
4306277067119ad816282b8e57727295b3adee14075carll
431dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_vaddudm (void)
432dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
433dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   __asm__ __volatile__ ("vaddudm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
434dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
435dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
4366277067119ad816282b8e57727295b3adee14075carllstatic void test_vsubudm (void)
437dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
4386277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vsubudm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4396277067119ad816282b8e57727295b3adee14075carll}
4406277067119ad816282b8e57727295b3adee14075carll
4416277067119ad816282b8e57727295b3adee14075carllstatic void test_vmaxud (void)
4426277067119ad816282b8e57727295b3adee14075carll{
4436277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vmaxud %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4446277067119ad816282b8e57727295b3adee14075carll}
4456277067119ad816282b8e57727295b3adee14075carll
4466277067119ad816282b8e57727295b3adee14075carllstatic void test_vmaxsd (void)
4476277067119ad816282b8e57727295b3adee14075carll{
4486277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vmaxsd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4496277067119ad816282b8e57727295b3adee14075carll}
4506277067119ad816282b8e57727295b3adee14075carll
4516277067119ad816282b8e57727295b3adee14075carllstatic void test_vminud (void)
4526277067119ad816282b8e57727295b3adee14075carll{
4536277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vminud %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4546277067119ad816282b8e57727295b3adee14075carll}
4556277067119ad816282b8e57727295b3adee14075carll
4566277067119ad816282b8e57727295b3adee14075carllstatic void test_vminsd (void)
4576277067119ad816282b8e57727295b3adee14075carll{
4586277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vminsd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4596277067119ad816282b8e57727295b3adee14075carll}
4606277067119ad816282b8e57727295b3adee14075carll
4616277067119ad816282b8e57727295b3adee14075carllstatic void test_vcmpequd (void)
4626277067119ad816282b8e57727295b3adee14075carll{
4636277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vcmpequd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4646277067119ad816282b8e57727295b3adee14075carll}
4656277067119ad816282b8e57727295b3adee14075carll
4666277067119ad816282b8e57727295b3adee14075carllstatic void test_vcmpgtud (void)
4676277067119ad816282b8e57727295b3adee14075carll{
4686277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vcmpgtud %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4696277067119ad816282b8e57727295b3adee14075carll}
4706277067119ad816282b8e57727295b3adee14075carll
4716277067119ad816282b8e57727295b3adee14075carllstatic void test_vcmpgtsd (void)
4726277067119ad816282b8e57727295b3adee14075carll{
4736277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vcmpgtsd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4746277067119ad816282b8e57727295b3adee14075carll}
4756277067119ad816282b8e57727295b3adee14075carll
4766277067119ad816282b8e57727295b3adee14075carllstatic void test_vrld (void)
4776277067119ad816282b8e57727295b3adee14075carll{
4786277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vrld %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4796277067119ad816282b8e57727295b3adee14075carll}
4806277067119ad816282b8e57727295b3adee14075carll
4816277067119ad816282b8e57727295b3adee14075carllstatic void test_vsld (void)
4826277067119ad816282b8e57727295b3adee14075carll{
4836277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vsld %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4846277067119ad816282b8e57727295b3adee14075carll}
4856277067119ad816282b8e57727295b3adee14075carll
4866277067119ad816282b8e57727295b3adee14075carllstatic void test_vsrad (void)
4876277067119ad816282b8e57727295b3adee14075carll{
4886277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vsrad %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4896277067119ad816282b8e57727295b3adee14075carll}
4906277067119ad816282b8e57727295b3adee14075carll
4916277067119ad816282b8e57727295b3adee14075carllstatic void test_vsrd (void)
4926277067119ad816282b8e57727295b3adee14075carll{
4936277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vsrd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
4946277067119ad816282b8e57727295b3adee14075carll}
4956277067119ad816282b8e57727295b3adee14075carll
4966277067119ad816282b8e57727295b3adee14075carll/* Vector Double Word saturate tests.*/
4976277067119ad816282b8e57727295b3adee14075carll
4986277067119ad816282b8e57727295b3adee14075carllstatic void test_vpkudus (void)
4996277067119ad816282b8e57727295b3adee14075carll{
5006277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vpkudus %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
5016277067119ad816282b8e57727295b3adee14075carll}
5026277067119ad816282b8e57727295b3adee14075carll
5036277067119ad816282b8e57727295b3adee14075carllstatic void test_vpksdus (void)
5046277067119ad816282b8e57727295b3adee14075carll{
5056277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vpksdus %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
5066277067119ad816282b8e57727295b3adee14075carll}
5076277067119ad816282b8e57727295b3adee14075carll
5086277067119ad816282b8e57727295b3adee14075carllstatic void test_vpksdss (void)
5096277067119ad816282b8e57727295b3adee14075carll{
5106277067119ad816282b8e57727295b3adee14075carll   __asm__ __volatile__ ("vpksdss %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
5116277067119ad816282b8e57727295b3adee14075carll}
5126277067119ad816282b8e57727295b3adee14075carll
5136277067119ad816282b8e57727295b3adee14075carll
5146277067119ad816282b8e57727295b3adee14075carll/* Vector unpack two words from one vector arg */
5156277067119ad816282b8e57727295b3adee14075carllstatic void test_vupkhsw (void)
5166277067119ad816282b8e57727295b3adee14075carll{
5176277067119ad816282b8e57727295b3adee14075carll    __asm__ __volatile__ ("vupkhsw %0, %1" : "=v" (vec_out): "v" (vec_inB_wd));
5186277067119ad816282b8e57727295b3adee14075carll}
5196277067119ad816282b8e57727295b3adee14075carll
5206277067119ad816282b8e57727295b3adee14075carllstatic void test_vupklsw (void)
5216277067119ad816282b8e57727295b3adee14075carll{
5226277067119ad816282b8e57727295b3adee14075carll    __asm__ __volatile__ ("vupklsw %0, %1" : "=v" (vec_out): "v" (vec_inB_wd));
5236277067119ad816282b8e57727295b3adee14075carll}
5246277067119ad816282b8e57727295b3adee14075carll
5256277067119ad816282b8e57727295b3adee14075carll
5266277067119ad816282b8e57727295b3adee14075carll/* Vector Integer Word tests.*/
5276277067119ad816282b8e57727295b3adee14075carllstatic void test_vmulouw (void)
5286277067119ad816282b8e57727295b3adee14075carll{
5296277067119ad816282b8e57727295b3adee14075carll  __asm__ __volatile__ ("vmulouw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
5306277067119ad816282b8e57727295b3adee14075carll}
5316277067119ad816282b8e57727295b3adee14075carll
5326277067119ad816282b8e57727295b3adee14075carllstatic void test_vmuluwm (void)
5336277067119ad816282b8e57727295b3adee14075carll{
5346277067119ad816282b8e57727295b3adee14075carll    __asm__ __volatile__ ("vmuluwm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
5356277067119ad816282b8e57727295b3adee14075carll}
5366277067119ad816282b8e57727295b3adee14075carll
5376277067119ad816282b8e57727295b3adee14075carllstatic void test_vmulosw (void)
5386277067119ad816282b8e57727295b3adee14075carll{
5396277067119ad816282b8e57727295b3adee14075carll    __asm__ __volatile__ ("vmulosw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
5406277067119ad816282b8e57727295b3adee14075carll}
5416277067119ad816282b8e57727295b3adee14075carll
5426277067119ad816282b8e57727295b3adee14075carllstatic void test_vmuleuw (void)
5436277067119ad816282b8e57727295b3adee14075carll{
5446277067119ad816282b8e57727295b3adee14075carll    __asm__ __volatile__ ("vmuleuw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
5456277067119ad816282b8e57727295b3adee14075carll}
5466277067119ad816282b8e57727295b3adee14075carll
5476277067119ad816282b8e57727295b3adee14075carllstatic void test_vmulesw (void)
5486277067119ad816282b8e57727295b3adee14075carll{
5496277067119ad816282b8e57727295b3adee14075carll    __asm__ __volatile__ ("vmulesw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
5506277067119ad816282b8e57727295b3adee14075carll}
5516277067119ad816282b8e57727295b3adee14075carll
5526277067119ad816282b8e57727295b3adee14075carllstatic void test_vmrgew (void)
5536277067119ad816282b8e57727295b3adee14075carll{
5546277067119ad816282b8e57727295b3adee14075carll    __asm__ __volatile__ ("vmrgew %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
555dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
556dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
5576277067119ad816282b8e57727295b3adee14075carllstatic void test_vmrgow (void)
5586277067119ad816282b8e57727295b3adee14075carll{
5596277067119ad816282b8e57727295b3adee14075carll    __asm__ __volatile__ ("vmrgow %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
5606277067119ad816282b8e57727295b3adee14075carll}
5616277067119ad816282b8e57727295b3adee14075carll
56224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpmsumb (void)
56324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
56424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vpmsumb %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
56524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
56624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
56724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpmsumh (void)
56824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
56924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vpmsumh %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
57024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
57124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
57224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpmsumw (void)
57324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
57424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vpmsumw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd));
57524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
57624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
57724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpermxor (void)
57824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
57924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  __asm__ __volatile__ ("vpermxor %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC));
58024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
58124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
58224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpmsumd (void)
58324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
58424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vpmsumd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
58524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
58624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
58724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vnand (void)
58824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
58924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vnand %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
59024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
59124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
59224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vorc (void)
59324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
59424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vorc %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
59524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
59624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
59724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_veqv (void)
59824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
59924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("veqv %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
60024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
60124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
60224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vcipher (void)
60324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
60424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vcipher %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
60524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
60624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
60724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vcipherlast (void)
60824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
60924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vcipherlast %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
61024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
61124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
61224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vncipher (void)
61324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
61424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vncipher %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
61524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
61624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
61724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vncipherlast (void)
61824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
61924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vncipherlast %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
62024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
62124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
62224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vclzb (void)
62324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
62424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vclzb %0, %1" : "=v" (vec_out): "v" (vec_inB));
62524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
62624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
62724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vclzw (void)
62824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
62924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vclzw %0, %1" : "=v" (vec_out): "v" (vec_inB));
63024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
63124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
63224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vclzh (void)
63324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
63424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vclzh %0, %1" : "=v" (vec_out): "v" (vec_inB));
63524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
63624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
63724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vclzd (void)
63824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
63924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vclzd %0, %1" : "=v" (vec_out): "v" (vec_inB));
64024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
64124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
64224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpopcntb (void)
64324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
64424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vpopcntb %0, %1" : "=v" (vec_out): "v" (vec_inB));
64524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
64624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
64724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpopcnth (void)
64824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
64924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vpopcnth %0, %1" : "=v" (vec_out): "v" (vec_inB));
65024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
65124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
65224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpopcntw (void)
65324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
65424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vpopcntw %0, %1" : "=v" (vec_out): "v" (vec_inB));
65524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
65624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
65724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpopcntd (void)
65824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
65924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vpopcntd %0, %1" : "=v" (vec_out): "v" (vec_inB));
66024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
66124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
66224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vsbox (void)
66324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
66424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll    __asm__ __volatile__ ("vsbox %0, %1" : "=v" (vec_out): "v" (vec_inB));
66524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
66624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
66724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic int st_six;
66824e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vshasigmad (void)
66924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
67024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   switch (st_six) {
67124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   case 0x00:
67224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("vshasigmad %0, %1, 0, 0" : "=v" (vec_out): "v" (vec_inA));
67324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      break;
67424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   case 0x0f:
67524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("vshasigmad %0, %1, 0, 15" : "=v" (vec_out): "v" (vec_inA));
67624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      break;
67724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   case 0x10:
67824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("vshasigmad %0, %1, 1, 0" : "=v" (vec_out): "v" (vec_inA));
67924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      break;
68024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   case 0x1f:
68124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("vshasigmad %0, %1, 1, 15" : "=v" (vec_out): "v" (vec_inA));
68224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      break;
68324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   }
68424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
68524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
68624e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vshasigmaw (void)
68724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
68824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   switch (st_six) {
68924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   case 0x00:
69024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("vshasigmaw %0, %1, 0, 0" : "=v" (vec_out): "v" (vec_inA));
69124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      break;
69224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   case 0x0f:
69324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("vshasigmaw %0, %1, 0, 15" : "=v" (vec_out): "v" (vec_inA));
69424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      break;
69524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   case 0x10:
69624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("vshasigmaw %0, %1, 1, 0" : "=v" (vec_out): "v" (vec_inA));
69724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      break;
69824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   case 0x1f:
69924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("vshasigmaw %0, %1, 1, 15" : "=v" (vec_out): "v" (vec_inA));
70024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      break;
70124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   }
70224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
70324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
70424e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic int PS_bit;
70524e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_bcdadd (void)
70624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
70724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   if (PS_bit)
70824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("bcdadd. %0, %1, %2, 1" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
70924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   else
71024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("bcdadd. %0, %1, %2, 0" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
71124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
71224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
71324e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_bcdsub (void)
71424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
71524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   if (PS_bit)
71624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("bcdsub. %0, %1, %2, 1" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
71724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   else
71824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      __asm__ __volatile__ ("bcdsub. %0, %1, %2, 0" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
71924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
72024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
721e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vaddcuq (void)
722e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
723e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   __asm__ __volatile__ ("vaddcuq %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
724e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
725e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
726e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vadduqm (void)
727e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
728e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   __asm__ __volatile__ ("vadduqm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
729e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
730e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
731e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vaddecuq (void)
732e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
733e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  __asm__ __volatile__ ("vaddecuq %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC));
734e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
735e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
736e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vaddeuqm (void)
737e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
738e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  __asm__ __volatile__ ("vaddeuqm %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC));
739e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
740e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
741e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vsubcuq (void)
742e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
743e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   __asm__ __volatile__ ("vsubcuq %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
744e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
745e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
746e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vsubuqm (void)
747e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
748e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   __asm__ __volatile__ ("vsubuqm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
749e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
750e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
751e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vsubecuq (void)
752e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
753e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  __asm__ __volatile__ ("vsubecuq %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC));
754e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
755e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
756e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vsubeuqm (void)
757e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
758e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  __asm__ __volatile__ ("vsubeuqm %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC));
759e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
760e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
761e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vbpermq (void)
762e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
763e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   __asm__ __volatile__ ("vbpermq %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB));
764e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
765e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
766e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vgbbd (void)
767e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{
768e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll    __asm__ __volatile__ ("vgbbd %0, %1" : "=v" (vec_out): "v" (vec_inB));
769e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}
770e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
771e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
772e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic test_t tests_aa_quadword_two_args[] = {
773e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vaddcuq       , "vaddcuq" },
774e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vadduqm       , "vadduqm" },
775e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vsubcuq       , "vsubcuq" },
776e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vsubuqm       , "vsubuqm" },
777e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vbpermq       , "vbpermq" },
778e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { NULL                , NULL      },
779e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll};
780e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
781e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic test_t tests_aa_quadword_three_args[] = {
782e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vaddecuq      , "vaddecuq" },
783e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vaddeuqm      , "vaddeuqm" },
784e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vsubecuq      , "vsubecuq" },
785e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vsubeuqm      , "vsubeuqm" },
786e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { NULL                , NULL      },
787e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll};
788e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll
78924e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic test_t tests_aa_bcd_ops[] = {
79024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_bcdadd        , "bcdadd." },
79124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_bcdsub        , "bcdsub." },
79224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { NULL                , NULL      },
79324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll};
79424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
79524e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic test_t tests_aa_SHA_ops[] = {
79624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vshasigmad    , "vshasigmad" },
79724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vshasigmaw    , "vshasigmaw" },
79824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { NULL                , NULL         },
79924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll};
80024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
80124e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic test_t tests_aa_ops_three[] = {
80224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpermxor        , "vpermxor" },
80324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { NULL                  , NULL       },
80424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll};
80524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
8066277067119ad816282b8e57727295b3adee14075carllstatic test_t tests_aa_word_ops_one_arg_dres[] = {
8076277067119ad816282b8e57727295b3adee14075carll  { &test_vupkhsw         , "vupkhsw" },
8086277067119ad816282b8e57727295b3adee14075carll  { &test_vupklsw         , "vupklsw" },
8096277067119ad816282b8e57727295b3adee14075carll  { NULL                  , NULL      }
8106277067119ad816282b8e57727295b3adee14075carll};
81124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
8126277067119ad816282b8e57727295b3adee14075carllstatic test_t tests_aa_word_ops_two_args_dres[] = {
8136277067119ad816282b8e57727295b3adee14075carll  { &test_vmulouw         , "vmulouw" },
8146277067119ad816282b8e57727295b3adee14075carll  { &test_vmuluwm         , "vmuluwm" },
8156277067119ad816282b8e57727295b3adee14075carll  { &test_vmulosw         , "vmulosw" },
8166277067119ad816282b8e57727295b3adee14075carll  { &test_vmuleuw         , "vmuleuw" },
8176277067119ad816282b8e57727295b3adee14075carll  { &test_vmulesw         , "vmulesw" },
8186277067119ad816282b8e57727295b3adee14075carll  { &test_vmrgew          , "vmrgew" },
8196277067119ad816282b8e57727295b3adee14075carll  { &test_vmrgow          , "vmrgow" },
82024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpmsumb         , "vpmsumb" },
82124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpmsumh         , "vpmsumh" },
82224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpmsumw         , "vpmsumw" },
8236277067119ad816282b8e57727295b3adee14075carll  { NULL                  , NULL      }
8246277067119ad816282b8e57727295b3adee14075carll};
8256277067119ad816282b8e57727295b3adee14075carll
8266277067119ad816282b8e57727295b3adee14075carllstatic test_t tests_aa_dbl_ops_two_args[] = {
827dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll  { &test_vaddudm         , "vaddudm", },
8286277067119ad816282b8e57727295b3adee14075carll  { &test_vsubudm         , "vsubudm", },
8296277067119ad816282b8e57727295b3adee14075carll  { &test_vmaxud          , "vmaxud", },
8306277067119ad816282b8e57727295b3adee14075carll  { &test_vmaxsd          , "vmaxsd", },
8316277067119ad816282b8e57727295b3adee14075carll  { &test_vminud          , "vminud", },
8326277067119ad816282b8e57727295b3adee14075carll  { &test_vminsd          , "vminsd", },
8336277067119ad816282b8e57727295b3adee14075carll  { &test_vcmpequd        , "vcmpequd", },
8346277067119ad816282b8e57727295b3adee14075carll  { &test_vcmpgtud        , "vcmpgtud", },
8356277067119ad816282b8e57727295b3adee14075carll  { &test_vcmpgtsd        , "vcmpgtsd", },
8366277067119ad816282b8e57727295b3adee14075carll  { &test_vrld            , "vrld", },
8376277067119ad816282b8e57727295b3adee14075carll  { &test_vsld            , "vsld", },
8386277067119ad816282b8e57727295b3adee14075carll  { &test_vsrad           , "vsrad", },
8396277067119ad816282b8e57727295b3adee14075carll  { &test_vsrd            , "vsrd", },
8406277067119ad816282b8e57727295b3adee14075carll  { &test_vpkudum         , "vpkudum", },
84124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpmsumd         , "vpmsumd", },
84224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vnand           , "vnand", },
84324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vorc            , "vorc", },
84424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_veqv            , "veqv", },
84524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vcipher         , "vcipher" },
84624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vcipherlast     , "vcipherlast" },
84724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vncipher        , "vncipher" },
84824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vncipherlast    , "vncipherlast" },
8496277067119ad816282b8e57727295b3adee14075carll  { NULL                  , NULL,      },
8506277067119ad816282b8e57727295b3adee14075carll};
8516277067119ad816282b8e57727295b3adee14075carll
85224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic test_t tests_aa_dbl_ops_one_arg[] = {
85324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vclzb           , "vclzb" },
85424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vclzw           , "vclzw" },
85524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vclzh           , "vclzh" },
85624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vclzd           , "vclzd" },
85724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpopcntb        , "vpopcntb" },
85824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpopcnth        , "vpopcnth" },
85924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpopcntw        , "vpopcntw" },
86024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vpopcntd        , "vpopcntd" },
86124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { &test_vsbox           , "vsbox" },
862e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll  { &test_vgbbd           , "vgbbd" },
86324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll  { NULL                  , NULL,      }
86424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll};
86524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
8666277067119ad816282b8e57727295b3adee14075carllstatic test_t tests_aa_dbl_to_int_two_args[] = {
8676277067119ad816282b8e57727295b3adee14075carll  { &test_vpkudus         , "vpkudus", },
8686277067119ad816282b8e57727295b3adee14075carll  { &test_vpksdus         , "vpksdus", },
8696277067119ad816282b8e57727295b3adee14075carll  { &test_vpksdss         , "vpksdss", },
8706277067119ad816282b8e57727295b3adee14075carll  { NULL                  , NULL,      },
871dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
872dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
873dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic int verbose = 0;
874dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic int arg_list_size = 0;
875dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic unsigned long long * vdargs = NULL;
8766277067119ad816282b8e57727295b3adee14075carllstatic unsigned long long * vdargs_x = NULL;
877a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define NB_VDARGS 9
878a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define NB_VDARGS_X 4
879dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
880dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void build_vdargs_table (void)
881dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
882dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   // Each VSX register holds two doubleword integer values
883dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   vdargs = memalign16(NB_VDARGS * sizeof(unsigned long long));
884dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   vdargs[0] = 0x0102030405060708ULL;
885dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   vdargs[1] = 0x090A0B0C0E0D0E0FULL;
886dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   vdargs[2] = 0xF1F2F3F4F5F6F7F8ULL;
887dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   vdargs[3] = 0xF9FAFBFCFEFDFEFFULL;
888a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   vdargs[4] = 0x00007FFFFFFFFFFFULL;
889a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   vdargs[5] = 0xFFFF000000000000ULL;
890a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   vdargs[6] = 0x0000800000000000ULL;
891a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   vdargs[7] = 0x0000000000000000ULL;
892a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   vdargs[8] = 0xFFFFFFFFFFFFFFFFULL;
8936277067119ad816282b8e57727295b3adee14075carll
894a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   vdargs_x = memalign16(NB_VDARGS_X * sizeof(unsigned long long));
8956277067119ad816282b8e57727295b3adee14075carll   vdargs_x[0] = 0x000000007c118a2bULL;
8966277067119ad816282b8e57727295b3adee14075carll   vdargs_x[1] = 0x00000000f1112345ULL;
8976277067119ad816282b8e57727295b3adee14075carll   vdargs_x[2] = 0x01F2F3F4F5F6F7F8ULL;
8986277067119ad816282b8e57727295b3adee14075carll   vdargs_x[3] = 0xF9FAFBFCFEFDFEFFULL;
8996277067119ad816282b8e57727295b3adee14075carll}
9006277067119ad816282b8e57727295b3adee14075carll
9016277067119ad816282b8e57727295b3adee14075carllstatic unsigned int * vwargs = NULL;
9026277067119ad816282b8e57727295b3adee14075carll#define NB_VWARGS 8
9036277067119ad816282b8e57727295b3adee14075carll
9046277067119ad816282b8e57727295b3adee14075carllstatic void build_vwargs_table (void)
9056277067119ad816282b8e57727295b3adee14075carll{
9066277067119ad816282b8e57727295b3adee14075carll   // Each VSX register holds 4 integer word values
9076277067119ad816282b8e57727295b3adee14075carll   size_t i = 0;
9086277067119ad816282b8e57727295b3adee14075carll   vwargs = memalign(8, 8 * sizeof(int));
9096277067119ad816282b8e57727295b3adee14075carll   assert(vwargs);
9106277067119ad816282b8e57727295b3adee14075carll   assert(0 == ((8-1) & (unsigned long)vwargs));
9116277067119ad816282b8e57727295b3adee14075carll   vwargs[i++] = 0x01020304;
9126277067119ad816282b8e57727295b3adee14075carll   vwargs[i++] = 0x05060708;
9136277067119ad816282b8e57727295b3adee14075carll   vwargs[i++] = 0x090A0B0C;
9146277067119ad816282b8e57727295b3adee14075carll   vwargs[i++] = 0x0E0D0E0F;
9156277067119ad816282b8e57727295b3adee14075carll   vwargs[i++] = 0xF1F2F3F4;
9166277067119ad816282b8e57727295b3adee14075carll   vwargs[i++] = 0xF5F6F7F8;
9176277067119ad816282b8e57727295b3adee14075carll   vwargs[i++] = 0xF9FAFBFC;
9186277067119ad816282b8e57727295b3adee14075carll   vwargs[i++] = 0xFEFDFEFF;
9196277067119ad816282b8e57727295b3adee14075carll}
9206277067119ad816282b8e57727295b3adee14075carll
92124e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic unsigned long long vbcd_args[] __attribute__ ((aligned (16))) = {
92224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   0x8045090189321003ULL, // Negative BCD value
92324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   0x001122334556677dULL,
92424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   0x0000107600000001ULL, // Positive BCD value
92524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   0x319293945142031aULL,
92624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   0x0ULL,                // Valid BCD zero
92724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   0xaULL,
92824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   0x0ULL,                // Invalid BCD zero (no sign code)
92924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   0x0ULL
93024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll};
931a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes//#define NUM_VBCD_VALS (sizeof vbcd_args/sizeof vbcd_args[0])
932a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define NUM_VBCD_VALS 8
93324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
9346277067119ad816282b8e57727295b3adee14075carllstatic void build_vargs_table (void)
9356277067119ad816282b8e57727295b3adee14075carll{
9366277067119ad816282b8e57727295b3adee14075carll   build_vdargs_table();
9376277067119ad816282b8e57727295b3adee14075carll   build_vwargs_table();
938dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
939dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
940a81925998c22a5af981c6933f56f24437e790447carllstatic double *fargs = NULL;
941a81925998c22a5af981c6933f56f24437e790447carllstatic int nb_fargs = 0;
942a81925998c22a5af981c6933f56f24437e790447carll
943a81925998c22a5af981c6933f56f24437e790447carllstatic inline void register_farg (void *farg,
944a81925998c22a5af981c6933f56f24437e790447carll                                  int s, uint16_t _exp, uint64_t mant)
945a81925998c22a5af981c6933f56f24437e790447carll{
946a81925998c22a5af981c6933f56f24437e790447carll   uint64_t tmp;
947a81925998c22a5af981c6933f56f24437e790447carll
948a81925998c22a5af981c6933f56f24437e790447carll   tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant;
949a81925998c22a5af981c6933f56f24437e790447carll   *(uint64_t *)farg = tmp;
950a81925998c22a5af981c6933f56f24437e790447carll   AB_DPRINTF("%d %03x %013llx => %016llx %0e\n",
951a81925998c22a5af981c6933f56f24437e790447carll              s, _exp, mant, *(uint64_t *)farg, *(double *)farg);
952a81925998c22a5af981c6933f56f24437e790447carll}
953a81925998c22a5af981c6933f56f24437e790447carll
954a81925998c22a5af981c6933f56f24437e790447carllstatic void build_fargs_table (void)
955a81925998c22a5af981c6933f56f24437e790447carll{
956a81925998c22a5af981c6933f56f24437e790447carll   /* Double precision:
957a81925998c22a5af981c6933f56f24437e790447carll    * Sign goes from zero to one               (1 bit)
958a81925998c22a5af981c6933f56f24437e790447carll    * Exponent goes from 0 to ((1 << 12) - 1)  (11 bits)
959a81925998c22a5af981c6933f56f24437e790447carll    * Mantissa goes from 1 to ((1 << 52) - 1)  (52 bits)
960a81925998c22a5af981c6933f56f24437e790447carll    * + special values:
961a81925998c22a5af981c6933f56f24437e790447carll    * +0.0      : 0 0x000 0x0000000000000 => 0x0000000000000000
962a81925998c22a5af981c6933f56f24437e790447carll    * -0.0      : 1 0x000 0x0000000000000 => 0x8000000000000000
963a81925998c22a5af981c6933f56f24437e790447carll    * +infinity : 0 0x7FF 0x0000000000000 => 0x7FF0000000000000
964a81925998c22a5af981c6933f56f24437e790447carll    * -infinity : 1 0x7FF 0x0000000000000 => 0xFFF0000000000000
9658efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll    * +QNaN     : 0 0x7FF 0x8000000000000 => 0x7FF8000000000000
9668efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll    * -QNaN     : 1 0x7FF 0x8000000000000 => 0xFFF8000000000000
9678efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll    * +SNaN     : 0 0x7FF 0x7FFFFFFFFFFFF => 0x7FF7FFFFFFFFFFFF
9688efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll    * -SNaN     : 1 0x7FF 0x7FFFFFFFFFFFF => 0xFFF7FFFFFFFFFFFF
969a81925998c22a5af981c6933f56f24437e790447carll    * (8 values)
970a81925998c22a5af981c6933f56f24437e790447carll
971a81925998c22a5af981c6933f56f24437e790447carll    * Ref only:
972a81925998c22a5af981c6933f56f24437e790447carll    * Single precision
973a81925998c22a5af981c6933f56f24437e790447carll    * Sign:     1 bit
974a81925998c22a5af981c6933f56f24437e790447carll    * Exponent: 8 bits
975a81925998c22a5af981c6933f56f24437e790447carll    * Mantissa: 23 bits
976a81925998c22a5af981c6933f56f24437e790447carll    * +0.0      : 0 0x00 0x000000 => 0x00000000
977a81925998c22a5af981c6933f56f24437e790447carll    * -0.0      : 1 0x00 0x000000 => 0x80000000
978a81925998c22a5af981c6933f56f24437e790447carll    * +infinity : 0 0xFF 0x000000 => 0x7F800000
979a81925998c22a5af981c6933f56f24437e790447carll    * -infinity : 1 0xFF 0x000000 => 0xFF800000
9808efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll    * +QNaN     : 0 0xFF 0x400000 => 0x7FC00000
9818efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll    * -QNaN     : 1 0xFF 0x400000 => 0xFFC00000
9828efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll    * +SNaN     : 0 0xFF 0x3FFFFF => 0x7FBFFFFF
9838efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll    * -SNaN     : 1 0xFF 0x3FFFFF => 0xFFBFFFFF
984a81925998c22a5af981c6933f56f24437e790447carll    */
985a81925998c22a5af981c6933f56f24437e790447carll   uint64_t mant;
986a81925998c22a5af981c6933f56f24437e790447carll   uint16_t _exp, e0, e1;
987a81925998c22a5af981c6933f56f24437e790447carll   int s;
988a81925998c22a5af981c6933f56f24437e790447carll   int i=0;
989a81925998c22a5af981c6933f56f24437e790447carll
990a81925998c22a5af981c6933f56f24437e790447carll   /* Note: VEX isn't so hot with denormals, so don't bother
991a81925998c22a5af981c6933f56f24437e790447carll      testing them: set _exp > 0
992a81925998c22a5af981c6933f56f24437e790447carll   */
993a81925998c22a5af981c6933f56f24437e790447carll
994a81925998c22a5af981c6933f56f24437e790447carll   if ( arg_list_size == 1 ) {   // Large
995a81925998c22a5af981c6933f56f24437e790447carll      fargs = malloc(200 * sizeof(double));
996a81925998c22a5af981c6933f56f24437e790447carll      for (s=0; s<2; s++) {
997a81925998c22a5af981c6933f56f24437e790447carll         for (e0=0; e0<2; e0++) {
998a81925998c22a5af981c6933f56f24437e790447carll            for (e1=0x001; ; e1 = ((e1 + 1) << 2) + 6) {
999a81925998c22a5af981c6933f56f24437e790447carll               if (e1 >= 0x400)
1000a81925998c22a5af981c6933f56f24437e790447carll                  e1 = 0x3fe;
1001a81925998c22a5af981c6933f56f24437e790447carll               _exp = (e0 << 10) | e1;
1002a81925998c22a5af981c6933f56f24437e790447carll               for (mant = 0x0000000000001ULL; mant < (1ULL << 52);
1003a81925998c22a5af981c6933f56f24437e790447carll                    /* Add 'random' bits */
1004a81925998c22a5af981c6933f56f24437e790447carll                    mant = ((mant + 0x4A6) << 13) + 0x359) {
1005a81925998c22a5af981c6933f56f24437e790447carll                  register_farg(&fargs[i++], s, _exp, mant);
1006a81925998c22a5af981c6933f56f24437e790447carll               }
1007a81925998c22a5af981c6933f56f24437e790447carll               if (e1 == 0x3fe)
1008a81925998c22a5af981c6933f56f24437e790447carll                  break;
1009a81925998c22a5af981c6933f56f24437e790447carll            }
1010a81925998c22a5af981c6933f56f24437e790447carll         }
1011a81925998c22a5af981c6933f56f24437e790447carll      }
1012a81925998c22a5af981c6933f56f24437e790447carll   } else {                      // Default
1013a81925998c22a5af981c6933f56f24437e790447carll      fargs = malloc(16 * sizeof(double));
1014a81925998c22a5af981c6933f56f24437e790447carll      for (s=0; s<2; s++) {                                // x2
1015a81925998c22a5af981c6933f56f24437e790447carll            for (e1=0x001; ; e1 = ((e1 + 1) << 13) + 7) {  // x2
1016a81925998c22a5af981c6933f56f24437e790447carll               if (e1 >= 0x400)
1017a81925998c22a5af981c6933f56f24437e790447carll                  e1 = 0x3fe;
1018a81925998c22a5af981c6933f56f24437e790447carll               _exp = e1;
1019a81925998c22a5af981c6933f56f24437e790447carll               for (mant = 0x0000000000001ULL; mant < (1ULL << 52);
1020a81925998c22a5af981c6933f56f24437e790447carll                    /* Add 'random' bits */
1021a81925998c22a5af981c6933f56f24437e790447carll                    mant = ((mant + 0x4A6) << 29) + 0x359) {  // x2
1022a81925998c22a5af981c6933f56f24437e790447carll                  register_farg(&fargs[i++], s, _exp, mant);
1023a81925998c22a5af981c6933f56f24437e790447carll               }
1024a81925998c22a5af981c6933f56f24437e790447carll               if (e1 == 0x3fe)
1025a81925998c22a5af981c6933f56f24437e790447carll                  break;
1026a81925998c22a5af981c6933f56f24437e790447carll            }
1027a81925998c22a5af981c6933f56f24437e790447carll      }
1028a81925998c22a5af981c6933f56f24437e790447carll   }
1029a81925998c22a5af981c6933f56f24437e790447carll
1030a81925998c22a5af981c6933f56f24437e790447carll   /* Special values */
1031a81925998c22a5af981c6933f56f24437e790447carll   /* +0.0      : 0 0x000 0x0000000000000 */
1032a81925998c22a5af981c6933f56f24437e790447carll   s = 0;
1033a81925998c22a5af981c6933f56f24437e790447carll   _exp = 0x000;
1034a81925998c22a5af981c6933f56f24437e790447carll   mant = 0x0000000000000ULL;
1035a81925998c22a5af981c6933f56f24437e790447carll   register_farg(&fargs[i++], s, _exp, mant);
1036a81925998c22a5af981c6933f56f24437e790447carll   /* -0.0      : 1 0x000 0x0000000000000 */
1037a81925998c22a5af981c6933f56f24437e790447carll   s = 1;
1038a81925998c22a5af981c6933f56f24437e790447carll   _exp = 0x000;
1039a81925998c22a5af981c6933f56f24437e790447carll   mant = 0x0000000000000ULL;
1040a81925998c22a5af981c6933f56f24437e790447carll   register_farg(&fargs[i++], s, _exp, mant);
1041a81925998c22a5af981c6933f56f24437e790447carll   /* +infinity : 0 0x7FF 0x0000000000000  */
1042a81925998c22a5af981c6933f56f24437e790447carll   s = 0;
1043a81925998c22a5af981c6933f56f24437e790447carll   _exp = 0x7FF;
1044a81925998c22a5af981c6933f56f24437e790447carll   mant = 0x0000000000000ULL;
1045a81925998c22a5af981c6933f56f24437e790447carll   register_farg(&fargs[i++], s, _exp, mant);
1046a81925998c22a5af981c6933f56f24437e790447carll   /* -infinity : 1 0x7FF 0x0000000000000 */
1047a81925998c22a5af981c6933f56f24437e790447carll   s = 1;
1048a81925998c22a5af981c6933f56f24437e790447carll   _exp = 0x7FF;
1049a81925998c22a5af981c6933f56f24437e790447carll   mant = 0x0000000000000ULL;
1050a81925998c22a5af981c6933f56f24437e790447carll   register_farg(&fargs[i++], s, _exp, mant);
1051a81925998c22a5af981c6933f56f24437e790447carll   /* +QNaN     : 0 0x7FF 0x7FFFFFFFFFFFF */
1052a81925998c22a5af981c6933f56f24437e790447carll   s = 0;
1053a81925998c22a5af981c6933f56f24437e790447carll   _exp = 0x7FF;
1054a81925998c22a5af981c6933f56f24437e790447carll   mant = 0x7FFFFFFFFFFFFULL;
1055a81925998c22a5af981c6933f56f24437e790447carll   register_farg(&fargs[i++], s, _exp, mant);
1056a81925998c22a5af981c6933f56f24437e790447carll   /* -QNaN     : 1 0x7FF 0x7FFFFFFFFFFFF */
1057a81925998c22a5af981c6933f56f24437e790447carll   s = 1;
1058a81925998c22a5af981c6933f56f24437e790447carll   _exp = 0x7FF;
1059a81925998c22a5af981c6933f56f24437e790447carll   mant = 0x7FFFFFFFFFFFFULL;
1060a81925998c22a5af981c6933f56f24437e790447carll   register_farg(&fargs[i++], s, _exp, mant);
1061a81925998c22a5af981c6933f56f24437e790447carll   /* +SNaN     : 0 0x7FF 0x8000000000000 */
1062a81925998c22a5af981c6933f56f24437e790447carll   s = 0;
1063a81925998c22a5af981c6933f56f24437e790447carll   _exp = 0x7FF;
1064a81925998c22a5af981c6933f56f24437e790447carll   mant = 0x8000000000000ULL;
1065a81925998c22a5af981c6933f56f24437e790447carll   register_farg(&fargs[i++], s, _exp, mant);
1066a81925998c22a5af981c6933f56f24437e790447carll   /* -SNaN     : 1 0x7FF 0x8000000000000 */
1067a81925998c22a5af981c6933f56f24437e790447carll   s = 1;
1068a81925998c22a5af981c6933f56f24437e790447carll   _exp = 0x7FF;
1069a81925998c22a5af981c6933f56f24437e790447carll   mant = 0x8000000000000ULL;
1070a81925998c22a5af981c6933f56f24437e790447carll   register_farg(&fargs[i++], s, _exp, mant);
1071a81925998c22a5af981c6933f56f24437e790447carll   AB_DPRINTF("Registered %d fargs values\n", i);
1072a81925998c22a5af981c6933f56f24437e790447carll
1073a81925998c22a5af981c6933f56f24437e790447carll   nb_fargs = i;
1074a81925998c22a5af981c6933f56f24437e790447carll}
1075a81925998c22a5af981c6933f56f24437e790447carll
1076a81925998c22a5af981c6933f56f24437e790447carll
1077a81925998c22a5af981c6933f56f24437e790447carll
1078dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic int check_filter (char *filter)
1079dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1080dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   char *c;
1081dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int ret = 1;
1082dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1083dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   if (filter != NULL) {
1084dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      c = strchr(filter, '*');
1085dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if (c != NULL) {
1086dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         *c = '\0';
1087dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         ret = 0;
1088dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
1089dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
1090dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   return ret;
1091dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
1092dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1093dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic int check_name (const char* name, const char *filter,
1094dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                       int exact)
1095dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1096dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int nlen, flen;
1097dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int ret = 0;
1098dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1099dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   if (filter != NULL) {
1100dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      for (; isspace(*name); name++)
1101dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         continue;
1102dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      FDPRINTF("Check '%s' againt '%s' (%s match)\n",
1103dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll               name, filter, exact ? "exact" : "starting");
1104dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      nlen = strlen(name);
1105dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      flen = strlen(filter);
1106dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if (exact) {
1107dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         if (nlen == flen && memcmp(name, filter, flen) == 0)
1108dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            ret = 1;
1109dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      } else {
1110dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         if (flen <= nlen && memcmp(name, filter, flen) == 0)
1111dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            ret = 1;
1112dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
1113dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   } else {
1114dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      ret = 1;
1115dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
1116dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   return ret;
1117dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
1118dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1119dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1120dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef struct insn_sel_flags_t_struct {
1121dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int one_arg, two_args, three_args;
1122dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int arith, logical, compare, ldst;
1123dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int integer, floats, altivec, faltivec;
1124dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int cr;
1125dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} insn_sel_flags_t;
1126dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1127a81925998c22a5af981c6933f56f24437e790447carllstatic void test_float_two_args (const char* name, test_func_t func,
1128a81925998c22a5af981c6933f56f24437e790447carll                                 unused uint32_t test_flags)
1129a81925998c22a5af981c6933f56f24437e790447carll{
1130a81925998c22a5af981c6933f56f24437e790447carll   double res;
1131a81925998c22a5af981c6933f56f24437e790447carll   Word_t u0, u1, ur;
1132a81925998c22a5af981c6933f56f24437e790447carll   volatile uint32_t flags;
1133a81925998c22a5af981c6933f56f24437e790447carll   int i, j;
1134a81925998c22a5af981c6933f56f24437e790447carll
1135a81925998c22a5af981c6933f56f24437e790447carll   for (i=0; i<nb_fargs; i+=3) {
1136a81925998c22a5af981c6933f56f24437e790447carll      for (j=0; j<nb_fargs; j+=5) {
1137a81925998c22a5af981c6933f56f24437e790447carll         u0 = *(Word_t *)(&fargs[i]);
1138a81925998c22a5af981c6933f56f24437e790447carll         u1 = *(Word_t *)(&fargs[j]);
1139a81925998c22a5af981c6933f56f24437e790447carll         f14 = fargs[i];
1140a81925998c22a5af981c6933f56f24437e790447carll         f15 = fargs[j];
1141a81925998c22a5af981c6933f56f24437e790447carll
1142a81925998c22a5af981c6933f56f24437e790447carll         SET_FPSCR_ZERO;
1143a81925998c22a5af981c6933f56f24437e790447carll         SET_CR_XER_ZERO;
1144a81925998c22a5af981c6933f56f24437e790447carll         (*func)();
1145a81925998c22a5af981c6933f56f24437e790447carll         GET_CR(flags);
1146a81925998c22a5af981c6933f56f24437e790447carll         res = f17;
1147a81925998c22a5af981c6933f56f24437e790447carll         ur = *(uint64_t *)(&res);
1148a81925998c22a5af981c6933f56f24437e790447carll
1149a81925998c22a5af981c6933f56f24437e790447carll         printf("%s %016llx, %016llx => %016llx",
1150a81925998c22a5af981c6933f56f24437e790447carll                name, u0, u1, ur);
1151a81925998c22a5af981c6933f56f24437e790447carll#if defined TEST_FLOAT_FLAGS
1152a81925998c22a5af981c6933f56f24437e790447carll         printf(" (%08x)", flags);
1153a81925998c22a5af981c6933f56f24437e790447carll#endif
1154a81925998c22a5af981c6933f56f24437e790447carll         printf("\n");
1155a81925998c22a5af981c6933f56f24437e790447carll      }
1156a81925998c22a5af981c6933f56f24437e790447carll      if (verbose) printf("\n");
1157a81925998c22a5af981c6933f56f24437e790447carll   }
1158a81925998c22a5af981c6933f56f24437e790447carll}
1159a81925998c22a5af981c6933f56f24437e790447carll
1160dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1161dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void mfvs(const char* name, test_func_t func,
1162dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                 unused uint32_t test_flags)
1163dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1164dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   /* This test is for move instructions where the input is a scalar register
1165dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    * and the destination is a vector register.
1166dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    */
1167dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int i;
1168dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   volatile Word_t result;
1169a81925998c22a5af981c6933f56f24437e790447carll   result = 0ULL;
1170dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1171dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   for (i=0; i < NB_VDARGS; i++) {
1172a81925998c22a5af981c6933f56f24437e790447carll      r14 = ZERO;
1173dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE)
1174dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA = (vector unsigned long long){ 0ULL, vdargs[i] };
1175dd690bf8d81c9119a7228446be12e3366e202176carll      else
1176dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA = (vector unsigned long long){ vdargs[i], 0ULL };
1177dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1178dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      (*func)();
1179dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      result = r14;
1180dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("%s: %016llx => %016llx\n", name, vdargs[i], result);
1181dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
1182dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
1183dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1184dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void mtvs(const char* name, test_func_t func,
1185dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                 unused uint32_t test_flags)
1186dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1187dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   /* This test is for move instructions where the input is a scalar register
1188dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    * and the destination is a vector register.
1189dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    */
1190dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   unsigned long long *dst;
1191dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int i;
1192dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1193dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   for (i=0; i < NB_VDARGS; i++) {
1194dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      r14  = vdargs[i];
1195dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      vec_out = (vector unsigned long long){ 0ULL, 0ULL };
1196dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1197dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      (*func)();
1198dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      dst = (unsigned long long *) &vec_out;
1199dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE)
1200dd690bf8d81c9119a7228446be12e3366e202176carll         dst++;
1201dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("%s: %016llx => %016llx\n", name, vdargs[i], *dst);
1202dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
1203dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
1204dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1205dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void mtvs2s(const char* name, test_func_t func,
1206dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                 unused uint32_t test_flags)
1207dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1208dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   /* This test is the mtvsrwa instruction.
1209dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll    */
1210dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   unsigned long long *dst;
1211dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int i;
1212dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1213dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   for (i=0; i < NB_VDARGS; i++) {
1214dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      // Only the lower half of the vdarg doubleword arg will be used as input by mtvsrwa
1215dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      unsigned int * src = (unsigned int *)&vdargs[i];
1216dd690bf8d81c9119a7228446be12e3366e202176carll      if (!isLE)
1217dd690bf8d81c9119a7228446be12e3366e202176carll         src++;
1218dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      r14  = vdargs[i];
1219dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      vec_out = (vector unsigned long long){ 0ULL, 0ULL };
1220dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1221dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      (*func)();
1222dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      // Only doubleword 0 is used in output
1223dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      dst = (unsigned long long *) &vec_out;
1224dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE)
1225dd690bf8d81c9119a7228446be12e3366e202176carll         dst++;
1226dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("%s: %08x => %016llx\n", name, *src, *dst);
1227dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
1228dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
1229dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1230dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_special (special_t *table,
1231dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                          const char* name, test_func_t func,
1232dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                          unused uint32_t test_flags)
1233dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1234dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   const char *tmp;
1235dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int i;
1236dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1237dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   for (tmp = name; isspace(*tmp); tmp++)
1238dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      continue;
1239dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   for (i=0; table[i].name != NULL; i++) {
1240dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if (strcmp(table[i].name, tmp) == 0) {
1241dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         (*table[i].test_cb)(name, func, test_flags);
1242dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         return;
1243dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
1244dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
1245dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   fprintf(stderr, "ERROR: no test found for op '%s'\n", name);
1246dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
1247dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1248dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic special_t special_move_ops[] = {
1249dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   {
1250a81925998c22a5af981c6933f56f24437e790447carll      "mfvsrd",  /* move from vector to scalar reg doubleword */
1251dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      &mfvs,
1252dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   },
1253dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   {
1254a81925998c22a5af981c6933f56f24437e790447carll      "mtvsrd",  /* move from scalar to vector reg doubleword */
1255dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      &mtvs,
1256dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   },
1257dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   {
1258dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      "mtfprwa", /* (extended mnemonic for mtvsrwa) move from scalar to vector reg with two’s-complement */
1259dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      &mtvs2s,
1260dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   },
1261a81925998c22a5af981c6933f56f24437e790447carll   {
1262a81925998c22a5af981c6933f56f24437e790447carll      "mfvsrwz", /* move from vector to scalar reg word */
1263a81925998c22a5af981c6933f56f24437e790447carll      &mfvs,
1264a81925998c22a5af981c6933f56f24437e790447carll   },
1265a81925998c22a5af981c6933f56f24437e790447carll   {
1266a81925998c22a5af981c6933f56f24437e790447carll      "mtvsrwz", /* move from scalar to vector reg word */
1267a81925998c22a5af981c6933f56f24437e790447carll      &mtvs2s,
1268a81925998c22a5af981c6933f56f24437e790447carll   }
1269dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
1270dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1271dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_move_special(const char* name, test_func_t func,
1272dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                                uint32_t test_flags)
1273dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1274dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   test_special(special_move_ops, name, func, test_flags);
1275dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
1276dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1277dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Vector Double Word tests */
1278dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1279dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_av_dint_two_args (const char* name, test_func_t func,
1280dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                                   unused uint32_t test_flags)
1281dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1282dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1283dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   unsigned long long * dst;
1284dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   unsigned int * dst_int;
1285dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int i,j;
1286e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   int family = test_flags & PPC_FAMILY;
1287dd690bf8d81c9119a7228446be12e3366e202176carll   int is_vpkudum, is_vpmsumd;
1288dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   if (strcmp(name, "vpkudum") == 0)
1289dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      is_vpkudum = 1;
1290dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   else
1291dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      is_vpkudum = 0;
1292dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1293dd690bf8d81c9119a7228446be12e3366e202176carll   if (strcmp(name, "vpmsumd") == 0)
1294dd690bf8d81c9119a7228446be12e3366e202176carll      is_vpmsumd = 1;
1295dd690bf8d81c9119a7228446be12e3366e202176carll   else
1296dd690bf8d81c9119a7228446be12e3366e202176carll      is_vpmsumd = 0;
1297dd690bf8d81c9119a7228446be12e3366e202176carll
1298a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   for (i = 0; i < NB_VDARGS - 1; i+=2) {
1299dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE && family == PPC_ALTIVECQ)
1300dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA = (vector unsigned long long){ vdargs[i+1], vdargs[i] };
1301dd690bf8d81c9119a7228446be12e3366e202176carll      else
1302dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA = (vector unsigned long long){ vdargs[i], vdargs[i+1] };
1303a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      for (j = 0; j < NB_VDARGS - 1; j+=2) {
1304dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE && family == PPC_ALTIVECQ)
1305dd690bf8d81c9119a7228446be12e3366e202176carll            vec_inB = (vector unsigned long long){ vdargs[j+1], vdargs[j] };
1306dd690bf8d81c9119a7228446be12e3366e202176carll         else
1307dd690bf8d81c9119a7228446be12e3366e202176carll            vec_inB = (vector unsigned long long){ vdargs[j], vdargs[j+1] };
1308dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         vec_out = (vector unsigned long long){ 0,0 };
1309dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1310dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         (*func)();
1311dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         dst_int = (unsigned int *)&vec_out;
1312dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         dst  = (unsigned long long*)&vec_out;
1313dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1314dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         printf("%s: ", name);
1315dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1316dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         if (is_vpkudum) {
1317dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            printf("Inputs: %08llx %08llx %08llx %08llx\n", vdargs[i] & 0x00000000ffffffffULL,
1318dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                   vdargs[i+1] & 0x00000000ffffffffULL, vdargs[j] & 0x00000000ffffffffULL,
1319dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                   vdargs[j+1] & 0x00000000ffffffffULL);
1320dd690bf8d81c9119a7228446be12e3366e202176carll            if (isLE)
1321dd690bf8d81c9119a7228446be12e3366e202176carll               printf("         Output: %08x %08x %08x %08x\n", dst_int[2], dst_int[3],
1322dd690bf8d81c9119a7228446be12e3366e202176carll                      dst_int[0], dst_int[1]);
1323dd690bf8d81c9119a7228446be12e3366e202176carll            else
1324dd690bf8d81c9119a7228446be12e3366e202176carll               printf("         Output: %08x %08x %08x %08x\n", dst_int[0], dst_int[1],
1325dd690bf8d81c9119a7228446be12e3366e202176carll                      dst_int[2], dst_int[3]);
1326dd690bf8d81c9119a7228446be12e3366e202176carll         } else if (is_vpmsumd) {
1327dd690bf8d81c9119a7228446be12e3366e202176carll            printf("%016llx @@ %016llx ", vdargs[i], vdargs[j]);
1328dd690bf8d81c9119a7228446be12e3366e202176carll            if (isLE)
1329dd690bf8d81c9119a7228446be12e3366e202176carll               printf(" ==> %016llx\n", dst[1]);
1330dd690bf8d81c9119a7228446be12e3366e202176carll            else
1331dd690bf8d81c9119a7228446be12e3366e202176carll               printf(" ==> %016llx\n", dst[0]);
1332dd690bf8d81c9119a7228446be12e3366e202176carll            printf("\t%016llx @@ %016llx ", vdargs[i+1], vdargs[j+1]);
1333dd690bf8d81c9119a7228446be12e3366e202176carll            if (isLE)
1334dd690bf8d81c9119a7228446be12e3366e202176carll               printf(" ==> %016llx\n", dst[0]);
1335dd690bf8d81c9119a7228446be12e3366e202176carll            else
1336dd690bf8d81c9119a7228446be12e3366e202176carll               printf(" ==> %016llx\n", dst[1]);
1337e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll         } else if (family == PPC_ALTIVECQ) {
1338dd690bf8d81c9119a7228446be12e3366e202176carll            if (isLE)
1339dd690bf8d81c9119a7228446be12e3366e202176carll               printf("%016llx%016llx @@ %016llx%016llx ==> %016llx%016llx\n",
1340dd690bf8d81c9119a7228446be12e3366e202176carll                      vdargs[i], vdargs[i+1], vdargs[j], vdargs[j+1],
1341dd690bf8d81c9119a7228446be12e3366e202176carll                      dst[1], dst[0]);
1342dd690bf8d81c9119a7228446be12e3366e202176carll            else
1343dd690bf8d81c9119a7228446be12e3366e202176carll               printf("%016llx%016llx @@ %016llx%016llx ==> %016llx%016llx\n",
1344dd690bf8d81c9119a7228446be12e3366e202176carll                      vdargs[i], vdargs[i+1], vdargs[j], vdargs[j+1],
1345dd690bf8d81c9119a7228446be12e3366e202176carll                      dst[0], dst[1]);
1346dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         } else {
134724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            printf("%016llx @@ %016llx ", vdargs[i], vdargs[j]);
1348dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            printf(" ==> %016llx\n", dst[0]);
134924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            printf("\t%016llx @@ %016llx ", vdargs[i+1], vdargs[j+1]);
1350dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            printf(" ==> %016llx\n", dst[1]);
1351dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         }
1352dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
1353dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
1354dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
1355dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
135624e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_av_dint_one_arg (const char* name, test_func_t func,
135724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll                                  unused uint32_t test_flags)
135824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
135924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
136024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   unsigned long long * dst;
136124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   int i;
136224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
1363a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   for (i = 0; i < NB_VDARGS - 1; i+=2) {
136424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      vec_inB = (vector unsigned long long){ vdargs[i], vdargs[i+1] };
136524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      vec_out = (vector unsigned long long){ 0,0 };
136624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
136724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      (*func)();
136824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      dst  = (unsigned long long*)&vec_out;
136924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
137024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      printf("%s: ", name);
137124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      printf("%016llx @@ %016llx ", vdargs[i], vdargs[i + 1]);
137224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      printf(" ==> %016llx%016llx\n", dst[0], dst[1]);
137324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   }
137424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
137524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
137624e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_av_dint_one_arg_SHA (const char* name, test_func_t func,
137724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll                                      unused uint32_t test_flags)
137824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
137924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   unsigned long long * dst;
138024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   int i, st, six;
138124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
1382a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   for (i = 0; i < NB_VDARGS - 1; i+=2) {
138324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      vec_inA = (vector unsigned long long){ vdargs[i], vdargs[i+1] };
138424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      vec_out = (vector unsigned long long){ 0,0 };
138524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
138624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      for (st = 0; st < 2; st++) {
138724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         for (six = 0; six < 16; six+=15) {
138824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            st_six = (st << 4) | six;
138924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            (*func)();
139024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            dst  = (unsigned long long*)&vec_out;
139124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
139224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            printf("%s: ", name);
139324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            printf("%016llx @@ %016llx ", vdargs[i], vdargs[i + 1]);
139424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            printf(" ==> %016llx || %016llx\n", dst[0], dst[1]);
139524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         }
139624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      }
139724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   }
139824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
139924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
140024e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_av_bcd (const char* name, test_func_t func,
140124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll                         unused uint32_t test_flags)
140224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
140324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   unsigned long long * dst;
140424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   int i, j;
140524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
1406a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   for (i = 0; i < NUM_VBCD_VALS - 1; i+=2) {
1407dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE)
1408a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         vec_inA = (vector unsigned long long){ vbcd_args[i+1], vbcd_args[i]};
1409dd690bf8d81c9119a7228446be12e3366e202176carll      else
1410dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA = (vector unsigned long long){ vbcd_args[i], vbcd_args[i+1] };
1411a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      for (j = 0; j < NUM_VBCD_VALS - 1; j+=2) {
1412dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE)
1413a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes            vec_inB = (vector unsigned long long){ vbcd_args[j+1] , vbcd_args[j] };
1414dd690bf8d81c9119a7228446be12e3366e202176carll         else
1415dd690bf8d81c9119a7228446be12e3366e202176carll            vec_inB = (vector unsigned long long){ vbcd_args[j], vbcd_args[j+1] };
141624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         vec_out = (vector unsigned long long){ 0, 0 };
141724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
141824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         for (PS_bit = 0; PS_bit < 2; PS_bit++) {
141924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            (*func)();
142024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            dst  = (unsigned long long*)&vec_out;
142124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            printf("%s: ", name);
142224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            printf("%016llx || %016llx @@ %016llx || %016llx",
142324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll                   vbcd_args[i], vbcd_args[i + 1],
142424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll                   vbcd_args[j], vbcd_args[j + 1]);
1425dd690bf8d81c9119a7228446be12e3366e202176carll            if (isLE)
1426dd690bf8d81c9119a7228446be12e3366e202176carll               printf(" ==> %016llx || %016llx\n", dst[1], dst[0]);
1427dd690bf8d81c9119a7228446be12e3366e202176carll            else
1428dd690bf8d81c9119a7228446be12e3366e202176carll               printf(" ==> %016llx || %016llx\n", dst[0], dst[1]);
142924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         }
143024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      }
143124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   }
143224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
143324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
14346277067119ad816282b8e57727295b3adee14075carll/* Vector doubleword-to-int tests, two input args, integer result */
14356277067119ad816282b8e57727295b3adee14075carllstatic void test_av_dint_to_int_two_args (const char* name, test_func_t func,
14366277067119ad816282b8e57727295b3adee14075carll                                          unused uint32_t test_flags)
14376277067119ad816282b8e57727295b3adee14075carll{
14386277067119ad816282b8e57727295b3adee14075carll
14396277067119ad816282b8e57727295b3adee14075carll   unsigned int * dst_int;
14406277067119ad816282b8e57727295b3adee14075carll   int i,j;
1441a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   for (i = 0; i < NB_VDARGS_X - 1; i+=2) {
14426277067119ad816282b8e57727295b3adee14075carll      vec_inA = (vector unsigned long long){ vdargs_x[i], vdargs_x[i+1] };
1443a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      for (j = 0; j < NB_VDARGS_X - 1; j+=2) {
14446277067119ad816282b8e57727295b3adee14075carll         vec_inB = (vector unsigned long long){ vdargs_x[j], vdargs_x[j+1] };
14456277067119ad816282b8e57727295b3adee14075carll         vec_out = (vector unsigned long long){ 0,0 };
14466277067119ad816282b8e57727295b3adee14075carll
14476277067119ad816282b8e57727295b3adee14075carll         (*func)();
14486277067119ad816282b8e57727295b3adee14075carll         dst_int = (unsigned int *)&vec_out;
14496277067119ad816282b8e57727295b3adee14075carll
14506277067119ad816282b8e57727295b3adee14075carll         printf("%s: ", name);
14516277067119ad816282b8e57727295b3adee14075carll         printf("%016llx, %016llx @@ %016llx, %016llx ",
14526277067119ad816282b8e57727295b3adee14075carll                vdargs_x[i], vdargs_x[i+1],
14536277067119ad816282b8e57727295b3adee14075carll                vdargs_x[j], vdargs_x[j+1]);
1454dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE)
1455dd690bf8d81c9119a7228446be12e3366e202176carll            printf(" ==> %08x %08x %08x %08x\n", dst_int[2], dst_int[3],
1456dd690bf8d81c9119a7228446be12e3366e202176carll                   dst_int[0], dst_int[1]);
1457dd690bf8d81c9119a7228446be12e3366e202176carll         else
1458dd690bf8d81c9119a7228446be12e3366e202176carll            printf(" ==> %08x %08x %08x %08x\n", dst_int[0], dst_int[1],
1459dd690bf8d81c9119a7228446be12e3366e202176carll                   dst_int[2], dst_int[3]);
14606277067119ad816282b8e57727295b3adee14075carll      }
14616277067119ad816282b8e57727295b3adee14075carll   }
14626277067119ad816282b8e57727295b3adee14075carll}
14636277067119ad816282b8e57727295b3adee14075carll
14646277067119ad816282b8e57727295b3adee14075carll/* Vector Word tests; two integer args, with double word result */
14656277067119ad816282b8e57727295b3adee14075carll
14666277067119ad816282b8e57727295b3adee14075carllstatic void test_av_wint_two_args_dres (const char* name, test_func_t func,
14676277067119ad816282b8e57727295b3adee14075carll                                        unused uint32_t test_flags)
14686277067119ad816282b8e57727295b3adee14075carll{
14696277067119ad816282b8e57727295b3adee14075carll
14706277067119ad816282b8e57727295b3adee14075carll   unsigned long long * dst;
14716277067119ad816282b8e57727295b3adee14075carll   int i,j;
14726277067119ad816282b8e57727295b3adee14075carll
14736277067119ad816282b8e57727295b3adee14075carll   for (i = 0; i < NB_VWARGS; i+=4) {
1474dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE)
1475dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA_wd = (vector unsigned int){ vwargs[i+3], vwargs[i+2], vwargs[i+1], vwargs[i] };
1476dd690bf8d81c9119a7228446be12e3366e202176carll      else
1477dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA_wd = (vector unsigned int){ vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3] };
14786277067119ad816282b8e57727295b3adee14075carll      for (j = 0; j < NB_VWARGS; j+=4) {
1479dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE)
1480dd690bf8d81c9119a7228446be12e3366e202176carll            vec_inB_wd = (vector unsigned int){ vwargs[j+3], vwargs[j+2], vwargs[j+1], vwargs[j] };
1481dd690bf8d81c9119a7228446be12e3366e202176carll         else
1482dd690bf8d81c9119a7228446be12e3366e202176carll            vec_inB_wd = (vector unsigned int){ vwargs[j], vwargs[j+1], vwargs[j+2], vwargs[j+3] };
14836277067119ad816282b8e57727295b3adee14075carll         vec_out = (vector unsigned long long){ 0, 0 };
14846277067119ad816282b8e57727295b3adee14075carll
14856277067119ad816282b8e57727295b3adee14075carll         (*func)();
14866277067119ad816282b8e57727295b3adee14075carll         dst  = (unsigned long long *)&vec_out;
14876277067119ad816282b8e57727295b3adee14075carll         printf("%s: ", name);
1488dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE)
1489dd690bf8d81c9119a7228446be12e3366e202176carll            printf("%08x %08x %08x %08x ==> %016llx %016llx\n",
1490dd690bf8d81c9119a7228446be12e3366e202176carll                   vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3], dst[1], dst[0]);
1491dd690bf8d81c9119a7228446be12e3366e202176carll         else
1492dd690bf8d81c9119a7228446be12e3366e202176carll            printf("%08x %08x %08x %08x ==> %016llx %016llx\n",
1493dd690bf8d81c9119a7228446be12e3366e202176carll                   vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3], dst[0], dst[1]);
14946277067119ad816282b8e57727295b3adee14075carll      }
14956277067119ad816282b8e57727295b3adee14075carll   }
14966277067119ad816282b8e57727295b3adee14075carll}
14976277067119ad816282b8e57727295b3adee14075carll
14986277067119ad816282b8e57727295b3adee14075carll/* Vector Word tests; one input arg, with double word result */
14996277067119ad816282b8e57727295b3adee14075carll
15006277067119ad816282b8e57727295b3adee14075carllstatic void test_av_wint_one_arg_dres (const char* name, test_func_t func,
15016277067119ad816282b8e57727295b3adee14075carll                                       unused uint32_t test_flags)
15026277067119ad816282b8e57727295b3adee14075carll{
15036277067119ad816282b8e57727295b3adee14075carll   unsigned long long * dst;
15046277067119ad816282b8e57727295b3adee14075carll   int i;
15056277067119ad816282b8e57727295b3adee14075carll   for (i = 0; i < NB_VWARGS; i+=4) {
1506dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE)
1507dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inB_wd = (vector unsigned int){ vwargs[i+3], vwargs[i+2], vwargs[i+1], vwargs[i] };
1508dd690bf8d81c9119a7228446be12e3366e202176carll      else
1509dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inB_wd = (vector unsigned int){ vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3] };
15106277067119ad816282b8e57727295b3adee14075carll      vec_out = (vector unsigned long long){ 0, 0 };
15116277067119ad816282b8e57727295b3adee14075carll
15126277067119ad816282b8e57727295b3adee14075carll      (*func)();
15136277067119ad816282b8e57727295b3adee14075carll      dst  = (unsigned long long *)&vec_out;
15146277067119ad816282b8e57727295b3adee14075carll      printf("%s: ", name);
1515dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE)
1516dd690bf8d81c9119a7228446be12e3366e202176carll         printf("%08x %08x %08x %08x ==> %016llx %016llx\n",
1517dd690bf8d81c9119a7228446be12e3366e202176carll                vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3], dst[1], dst[0]);
1518dd690bf8d81c9119a7228446be12e3366e202176carll      else
1519dd690bf8d81c9119a7228446be12e3366e202176carll         printf("%08x %08x %08x %08x ==> %016llx %016llx\n",
1520dd690bf8d81c9119a7228446be12e3366e202176carll                vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3], dst[0], dst[1]);
15216277067119ad816282b8e57727295b3adee14075carll   }
15226277067119ad816282b8e57727295b3adee14075carll}
15236277067119ad816282b8e57727295b3adee14075carll
15246277067119ad816282b8e57727295b3adee14075carll
1525a81925998c22a5af981c6933f56f24437e790447carllstatic void test_int_stq_two_regs_imm16 (const char* name,
1526a81925998c22a5af981c6933f56f24437e790447carll                                        test_func_t func_IN,
1527a81925998c22a5af981c6933f56f24437e790447carll                                        unused uint32_t test_flags)
1528a81925998c22a5af981c6933f56f24437e790447carll{
1529a81925998c22a5af981c6933f56f24437e790447carll   /* Store quad word from register pair */
1530a81925998c22a5af981c6933f56f24437e790447carll   int offs, k;
1531a81925998c22a5af981c6933f56f24437e790447carll   HWord_t base;
1532a81925998c22a5af981c6933f56f24437e790447carll   Word_t *iargs_priv;
1533a81925998c22a5af981c6933f56f24437e790447carll
1534a81925998c22a5af981c6933f56f24437e790447carll   // private iargs table to store to, note storing pair of regs
1535a81925998c22a5af981c6933f56f24437e790447carll   iargs_priv = memalign16(2 * sizeof(Word_t));
1536a81925998c22a5af981c6933f56f24437e790447carll
1537a81925998c22a5af981c6933f56f24437e790447carll   base = (HWord_t)&iargs_priv[0];
1538a81925998c22a5af981c6933f56f24437e790447carll   for (k = 0; k < 2; k++)  // clear array
1539a81925998c22a5af981c6933f56f24437e790447carll      iargs_priv[k] = 0;
1540a81925998c22a5af981c6933f56f24437e790447carll
1541a81925998c22a5af981c6933f56f24437e790447carll   offs = 0;
1542a81925998c22a5af981c6933f56f24437e790447carll
1543a81925998c22a5af981c6933f56f24437e790447carll   /* setup source register pair */
1544a81925998c22a5af981c6933f56f24437e790447carll   r14 = (HWord_t) 0xABCDEF0123456789ULL;
1545a81925998c22a5af981c6933f56f24437e790447carll   r15 = (HWord_t) 0x1133557722446688ULL;
1546a81925998c22a5af981c6933f56f24437e790447carll
1547a81925998c22a5af981c6933f56f24437e790447carll   r16 = base;                 // store to r16 + offs
1548a81925998c22a5af981c6933f56f24437e790447carll
1549a81925998c22a5af981c6933f56f24437e790447carll   (*func_IN)();
1550a81925998c22a5af981c6933f56f24437e790447carll
1551a81925998c22a5af981c6933f56f24437e790447carll#ifndef __powerpc64__
1552a81925998c22a5af981c6933f56f24437e790447carll   printf("%s %08x,%08x, %2d => "
1553a81925998c22a5af981c6933f56f24437e790447carll#else
1554a81925998c22a5af981c6933f56f24437e790447carll   printf("%s %016llx,%016llx, %3d => "
1555a81925998c22a5af981c6933f56f24437e790447carll#endif
1556a81925998c22a5af981c6933f56f24437e790447carll            "%016llx,%016llx)\n",
1557a81925998c22a5af981c6933f56f24437e790447carll            name, r14, r15, offs, iargs_priv[0], iargs_priv[1]);
1558a81925998c22a5af981c6933f56f24437e790447carll
1559a81925998c22a5af981c6933f56f24437e790447carll   if (verbose) printf("\n");
1560a81925998c22a5af981c6933f56f24437e790447carll   free(iargs_priv);
1561a81925998c22a5af981c6933f56f24437e790447carll}
1562a81925998c22a5af981c6933f56f24437e790447carll
1563a81925998c22a5af981c6933f56f24437e790447carll
1564a81925998c22a5af981c6933f56f24437e790447carllstatic void test_int_stq_three_regs (const char* name,
1565a81925998c22a5af981c6933f56f24437e790447carll                                     test_func_t func_IN,
1566a81925998c22a5af981c6933f56f24437e790447carll                                     unused uint32_t test_flags)
1567a81925998c22a5af981c6933f56f24437e790447carll{
1568a81925998c22a5af981c6933f56f24437e790447carll   /* Store quad word from register pair */
1569a81925998c22a5af981c6933f56f24437e790447carll   volatile uint32_t flags, xer;
1570a81925998c22a5af981c6933f56f24437e790447carll   int k;
1571a81925998c22a5af981c6933f56f24437e790447carll   HWord_t base;
1572a81925998c22a5af981c6933f56f24437e790447carll
1573a81925998c22a5af981c6933f56f24437e790447carll   base = (HWord_t)&mem_resv[0];
1574a81925998c22a5af981c6933f56f24437e790447carll   for (k = 0; k < 2; k++)  // setup array for lqarx inst
1575a81925998c22a5af981c6933f56f24437e790447carll      mem_resv[k] = k;
1576a81925998c22a5af981c6933f56f24437e790447carll
1577a81925998c22a5af981c6933f56f24437e790447carll   /* setup source register pair for store */
1578a81925998c22a5af981c6933f56f24437e790447carll   r14 = ZERO;
1579a81925998c22a5af981c6933f56f24437e790447carll   r15 = ZERO;
1580a81925998c22a5af981c6933f56f24437e790447carll   r16 = base;                 // store to r16 + r17
1581a81925998c22a5af981c6933f56f24437e790447carll   r17 = ZERO;
1582a81925998c22a5af981c6933f56f24437e790447carll
1583a81925998c22a5af981c6933f56f24437e790447carll   /* In order for the store to occur, the lqarx instruction must first
1584a81925998c22a5af981c6933f56f24437e790447carll    * be used to load from the address thus creating a reservation at the
1585a81925998c22a5af981c6933f56f24437e790447carll    * memory address.  The lqarx instruction is done in the test_stqcx(),
1586a81925998c22a5af981c6933f56f24437e790447carll    * then registers 14, r15 are changed to the data to be stored in memory
1587a81925998c22a5af981c6933f56f24437e790447carll    * by the stqcx instruction.
1588a81925998c22a5af981c6933f56f24437e790447carll    */
1589a81925998c22a5af981c6933f56f24437e790447carll   SET_CR_XER_ZERO;
1590a81925998c22a5af981c6933f56f24437e790447carll   (*func_IN)();
1591a81925998c22a5af981c6933f56f24437e790447carll   GET_CR_XER(flags,xer);
1592a81925998c22a5af981c6933f56f24437e790447carll#ifndef __powerpc64__
1593a81925998c22a5af981c6933f56f24437e790447carll   printf("%s %08x,%08x, =>  "
1594a81925998c22a5af981c6933f56f24437e790447carll#else
1595a81925998c22a5af981c6933f56f24437e790447carll   printf("%s %016llx,%016llx => "
1596a81925998c22a5af981c6933f56f24437e790447carll#endif
1597a81925998c22a5af981c6933f56f24437e790447carll            "%016llx,%016llx; CR=%08x\n",
1598a81925998c22a5af981c6933f56f24437e790447carll            name, r14, r15, mem_resv[0], mem_resv[1], flags);
1599a81925998c22a5af981c6933f56f24437e790447carll
1600a81925998c22a5af981c6933f56f24437e790447carll   if (verbose) printf("\n");
1601a81925998c22a5af981c6933f56f24437e790447carll}
1602a81925998c22a5af981c6933f56f24437e790447carll
1603a81925998c22a5af981c6933f56f24437e790447carllstatic void test_int_ldq_two_regs_imm16 (const char* name,
1604a81925998c22a5af981c6933f56f24437e790447carll                                        test_func_t func_IN,
1605a81925998c22a5af981c6933f56f24437e790447carll                                        unused uint32_t test_flags)
1606a81925998c22a5af981c6933f56f24437e790447carll{
1607a81925998c22a5af981c6933f56f24437e790447carll   /* load quad word from register pair */
1608a81925998c22a5af981c6933f56f24437e790447carll   volatile uint32_t flags, xer;
1609a81925998c22a5af981c6933f56f24437e790447carll   Word_t * mem_priv;
1610a81925998c22a5af981c6933f56f24437e790447carll   HWord_t base;
1611a81925998c22a5af981c6933f56f24437e790447carll
1612a81925998c22a5af981c6933f56f24437e790447carll   // private iargs table to store to, note storing pair of regs
1613a81925998c22a5af981c6933f56f24437e790447carll   mem_priv = memalign16(2 * sizeof(Word_t));  // want 128-bits
1614a81925998c22a5af981c6933f56f24437e790447carll
1615a81925998c22a5af981c6933f56f24437e790447carll   base = (HWord_t)&mem_priv[0];
1616a81925998c22a5af981c6933f56f24437e790447carll
1617a81925998c22a5af981c6933f56f24437e790447carll   mem_priv[0] = 0xAACCEE0011335577ULL;
1618a81925998c22a5af981c6933f56f24437e790447carll   mem_priv[1] = 0xABCDEF0123456789ULL;
1619a81925998c22a5af981c6933f56f24437e790447carll
1620a81925998c22a5af981c6933f56f24437e790447carll   r14 = 0;
1621a81925998c22a5af981c6933f56f24437e790447carll   r15 = 0;
1622a81925998c22a5af981c6933f56f24437e790447carll   r16 = base;                 // fetch from r16 + offs
1623a81925998c22a5af981c6933f56f24437e790447carll   SET_CR_XER_ZERO;
1624a81925998c22a5af981c6933f56f24437e790447carll   (*func_IN)();
1625a81925998c22a5af981c6933f56f24437e790447carll   GET_CR_XER(flags,xer);
1626a81925998c22a5af981c6933f56f24437e790447carll
1627a81925998c22a5af981c6933f56f24437e790447carll#ifndef __powerpc64__
1628a81925998c22a5af981c6933f56f24437e790447carll   printf("%s (0x%016llx, 0x%016llx) =>  (reg_pair = %08x,%08x)\n",
1629a81925998c22a5af981c6933f56f24437e790447carll#else
1630a81925998c22a5af981c6933f56f24437e790447carll   printf("%s (0x%016llx, 0x%016llx) =>  (reg_pair = 0x%016llx, 0x%016llx)\n",
1631a81925998c22a5af981c6933f56f24437e790447carll#endif
1632a81925998c22a5af981c6933f56f24437e790447carll          name, mem_priv[0], mem_priv[1], r14, r15);
1633a81925998c22a5af981c6933f56f24437e790447carll
1634a81925998c22a5af981c6933f56f24437e790447carll   if (verbose) printf("\n");
1635a81925998c22a5af981c6933f56f24437e790447carll
1636a81925998c22a5af981c6933f56f24437e790447carll   free(mem_priv);
1637a81925998c22a5af981c6933f56f24437e790447carll}
1638a81925998c22a5af981c6933f56f24437e790447carll
1639a81925998c22a5af981c6933f56f24437e790447carllstatic void test_int_ldq_three_regs (const char* name,
1640a81925998c22a5af981c6933f56f24437e790447carll                                     test_func_t func_IN,
1641a81925998c22a5af981c6933f56f24437e790447carll                                     unused uint32_t test_flags)
1642a81925998c22a5af981c6933f56f24437e790447carll{
1643a81925998c22a5af981c6933f56f24437e790447carll   /* load quad word from register pair */
1644a81925998c22a5af981c6933f56f24437e790447carll   HWord_t base;
1645a81925998c22a5af981c6933f56f24437e790447carll
1646a81925998c22a5af981c6933f56f24437e790447carll   base = (HWord_t)&mem_resv[0];
1647a81925998c22a5af981c6933f56f24437e790447carll
1648a81925998c22a5af981c6933f56f24437e790447carll   mem_resv[0] = 0xAACCEE0011335577ULL;
1649a81925998c22a5af981c6933f56f24437e790447carll   mem_resv[1] = 0xABCDEF0123456789ULL;
1650a81925998c22a5af981c6933f56f24437e790447carll
1651a81925998c22a5af981c6933f56f24437e790447carll   r14 = 0;
1652a81925998c22a5af981c6933f56f24437e790447carll   r15 = 0;
1653a81925998c22a5af981c6933f56f24437e790447carll   r16 = base;                 // fetch from r16 + r17
1654a81925998c22a5af981c6933f56f24437e790447carll   r17 = 0;
1655a81925998c22a5af981c6933f56f24437e790447carll
1656a81925998c22a5af981c6933f56f24437e790447carll   (*func_IN)();
1657a81925998c22a5af981c6933f56f24437e790447carll
1658a81925998c22a5af981c6933f56f24437e790447carll#ifndef __powerpc64__
1659a81925998c22a5af981c6933f56f24437e790447carll   printf("%s (0x%016llx, 0x%016llx) =>  (reg_pair = 0x%08x, 0x%08x)\n",
1660a81925998c22a5af981c6933f56f24437e790447carll#else
1661a81925998c22a5af981c6933f56f24437e790447carll   printf("%s (0x%016llx, 0x%016llx) =>  (reg_pair = 0x%016llx, 0x%016llx)\n",
1662a81925998c22a5af981c6933f56f24437e790447carll#endif
1663a81925998c22a5af981c6933f56f24437e790447carll          name, mem_resv[0], mem_resv[1], r14, r15);
1664a81925998c22a5af981c6933f56f24437e790447carll   if (verbose) printf("\n");
1665a81925998c22a5af981c6933f56f24437e790447carll
1666a81925998c22a5af981c6933f56f24437e790447carll}
1667a81925998c22a5af981c6933f56f24437e790447carll
1668e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_av_dint_three_args (const char* name, test_func_t func,
1669e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll                                     unused uint32_t test_flags)
167024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{
167124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
167224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   unsigned long long * dst;
167324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   int i,j, k;
1674e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   int family = test_flags & PPC_FAMILY;
1675e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   unsigned long long cin_vals[] = {
1676e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll                                    // First pair of ULLs have LSB=0, so cin is '0'.
1677e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll                                    // Second pair of ULLs have LSB=1, so cin is '1'.
1678e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll                                    0xf000000000000000ULL, 0xf000000000000000ULL,
1679e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll                                    0xf000000000000000ULL, 0xf000000000000001ULL
1680e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   };
1681a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   for (i = 0; i < NB_VDARGS - 1; i+=2) {
1682dd690bf8d81c9119a7228446be12e3366e202176carll      if (isLE)
1683dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA = (vector unsigned long long){ vdargs[i+1], vdargs[i] };
1684dd690bf8d81c9119a7228446be12e3366e202176carll      else
1685dd690bf8d81c9119a7228446be12e3366e202176carll         vec_inA = (vector unsigned long long){ vdargs[i], vdargs[i+1] };
1686a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes      for (j = 0; j < NB_VDARGS - 1; j+=2) {
1687dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE)
1688dd690bf8d81c9119a7228446be12e3366e202176carll            vec_inB = (vector unsigned long long){ vdargs[j+1], vdargs[j] };
1689dd690bf8d81c9119a7228446be12e3366e202176carll         else
1690dd690bf8d81c9119a7228446be12e3366e202176carll            vec_inB = (vector unsigned long long){ vdargs[j], vdargs[j+1] };
1691a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes         for (k = 0; k < 4 - 1; k+=2) {
1692dd690bf8d81c9119a7228446be12e3366e202176carll            if (family == PPC_ALTIVECQ) {
1693dd690bf8d81c9119a7228446be12e3366e202176carll               if (isLE)
1694dd690bf8d81c9119a7228446be12e3366e202176carll                  vec_inC = (vector unsigned long long){ cin_vals[k+1], cin_vals[k] };
1695dd690bf8d81c9119a7228446be12e3366e202176carll               else
1696dd690bf8d81c9119a7228446be12e3366e202176carll                  vec_inC = (vector unsigned long long){ cin_vals[k], cin_vals[k+1] };
1697dd690bf8d81c9119a7228446be12e3366e202176carll            } else {
1698dd690bf8d81c9119a7228446be12e3366e202176carll               if (isLE)
1699dd690bf8d81c9119a7228446be12e3366e202176carll                  vec_inC = (vector unsigned long long){ vdargs[k+1], vdargs[k] };
1700dd690bf8d81c9119a7228446be12e3366e202176carll               else
1701dd690bf8d81c9119a7228446be12e3366e202176carll                  vec_inC = (vector unsigned long long){ vdargs[k], vdargs[k+1] };
1702dd690bf8d81c9119a7228446be12e3366e202176carll            }
170324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            vec_out = (vector unsigned long long){ 0,0 };
170424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll
170524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            (*func)();
170624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            dst  = (unsigned long long*)&vec_out;
170724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            printf("%s: ", name);
1708e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll            if (family == PPC_ALTIVECQ) {
1709dd690bf8d81c9119a7228446be12e3366e202176carll               if (isLE)
1710dd690bf8d81c9119a7228446be12e3366e202176carll                  printf("%016llx%016llx @@ %016llx%016llx @@ %llx ==> %016llx%016llx\n",
1711dd690bf8d81c9119a7228446be12e3366e202176carll                         vdargs[i], vdargs[i+1], vdargs[j], vdargs[j+1], cin_vals[k+1],
1712dd690bf8d81c9119a7228446be12e3366e202176carll                         dst[1], dst[0]);
1713dd690bf8d81c9119a7228446be12e3366e202176carll               else
1714dd690bf8d81c9119a7228446be12e3366e202176carll                  printf("%016llx%016llx @@ %016llx%016llx @@ %llx ==> %016llx%016llx\n",
1715dd690bf8d81c9119a7228446be12e3366e202176carll                         vdargs[i], vdargs[i+1], vdargs[j], vdargs[j+1], cin_vals[k+1],
1716dd690bf8d81c9119a7228446be12e3366e202176carll                         dst[0], dst[1]);
1717e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll            } else {
1718e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll               printf("%016llx @@ %016llx @@ %016llx ", vdargs[i], vdargs[j], vdargs[k]);
1719dd690bf8d81c9119a7228446be12e3366e202176carll               if (isLE)
1720dd690bf8d81c9119a7228446be12e3366e202176carll                  printf(" ==> %016llx\n", dst[1]);
1721dd690bf8d81c9119a7228446be12e3366e202176carll               else
1722dd690bf8d81c9119a7228446be12e3366e202176carll                  printf(" ==> %016llx\n", dst[0]);
1723e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll               printf("\t%016llx @@ %016llx @@ %016llx ", vdargs[i+1], vdargs[j+1], vdargs[k+1]);
1724dd690bf8d81c9119a7228446be12e3366e202176carll               if (isLE)
1725dd690bf8d81c9119a7228446be12e3366e202176carll                  printf(" ==> %016llx\n", dst[0]);
1726dd690bf8d81c9119a7228446be12e3366e202176carll               else
1727dd690bf8d81c9119a7228446be12e3366e202176carll                  printf(" ==> %016llx\n", dst[1]);
1728e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll            }
172924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         }
173024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll      }
173124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   }
173224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}
1733a81925998c22a5af981c6933f56f24437e790447carll
1734a81925998c22a5af981c6933f56f24437e790447carll
17356277067119ad816282b8e57727295b3adee14075carll/* The ALTIVEC_LOOPS and altive_loops defined below are used in do_tests.
17366277067119ad816282b8e57727295b3adee14075carll * Add new values to the end; do not change order, since the altivec_loops
17376277067119ad816282b8e57727295b3adee14075carll * array is indexed using the enumerated values defined by ALTIVEC_LOOPS.
17386277067119ad816282b8e57727295b3adee14075carll */
1739a81925998c22a5af981c6933f56f24437e790447carllenum ALTIVEC_LOOPS {
1740a81925998c22a5af981c6933f56f24437e790447carll   ALTV_MOV,
17416277067119ad816282b8e57727295b3adee14075carll   ALTV_DINT,
17426277067119ad816282b8e57727295b3adee14075carll   ALTV_INT_DRES,
17436277067119ad816282b8e57727295b3adee14075carll   ALTV_DINT_IRES,
174424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   ALTV_ONE_INT_DRES,
174524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   ALTV_DINT_THREE_ARGS,
174624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   ALTV_DINT_ONE_ARG,
174724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   ALTV_SHA,
174824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   ATLV_BCD
1749a81925998c22a5af981c6933f56f24437e790447carll};
17506277067119ad816282b8e57727295b3adee14075carll
1751a81925998c22a5af981c6933f56f24437e790447carllstatic test_loop_t altivec_loops[] = {
1752a81925998c22a5af981c6933f56f24437e790447carll   &test_move_special,
1753a81925998c22a5af981c6933f56f24437e790447carll   &test_av_dint_two_args,
17546277067119ad816282b8e57727295b3adee14075carll   &test_av_wint_two_args_dres,
17556277067119ad816282b8e57727295b3adee14075carll   &test_av_dint_to_int_two_args,
17566277067119ad816282b8e57727295b3adee14075carll   &test_av_wint_one_arg_dres,
1757e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   &test_av_dint_three_args,
175824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   &test_av_dint_one_arg,
175924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   &test_av_dint_one_arg_SHA,
176024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   &test_av_bcd,
1761a81925998c22a5af981c6933f56f24437e790447carll   NULL
1762a81925998c22a5af981c6933f56f24437e790447carll};
1763a81925998c22a5af981c6933f56f24437e790447carll
1764dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Used in do_tests, indexed by flags->nb_args
1765dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   Elements correspond to enum test_flags::num args
1766dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll*/
1767a81925998c22a5af981c6933f56f24437e790447carllstatic test_loop_t int_loops[] = {
1768a81925998c22a5af981c6933f56f24437e790447carll  /* The #defines for the family, number registers need the array
1769a81925998c22a5af981c6933f56f24437e790447carll   * to be properly indexed.  This test is for the new ISA 2.0.7
1770a81925998c22a5af981c6933f56f24437e790447carll   * instructions.  The infrastructure has been left for the momemnt
1771a81925998c22a5af981c6933f56f24437e790447carll   */
1772a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_one_arg,
1773a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_two_args,
1774a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_three_args,
1775a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_two_args,
1776a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_one_reg_imm16,
1777a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_one_reg_imm16,
1778a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_special,
1779a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_ld_one_reg_imm16,
1780a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_ld_two_regs,
1781a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_st_two_regs_imm16,
1782a81925998c22a5af981c6933f56f24437e790447carll   NULL, //&test_int_st_three_regs,
1783a81925998c22a5af981c6933f56f24437e790447carll   &test_int_stq_two_regs_imm16,
1784a81925998c22a5af981c6933f56f24437e790447carll   &test_int_ldq_two_regs_imm16,
1785a81925998c22a5af981c6933f56f24437e790447carll   &test_int_stq_three_regs,
1786a81925998c22a5af981c6933f56f24437e790447carll   &test_int_ldq_three_regs,
1787dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
1788dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1789a81925998c22a5af981c6933f56f24437e790447carll/* Used in do_tests, indexed by flags->nb_args
1790a81925998c22a5af981c6933f56f24437e790447carll   Elements correspond to enum test_flags::num args
1791a81925998c22a5af981c6933f56f24437e790447carll   Must have NULL for last entry.
1792a81925998c22a5af981c6933f56f24437e790447carll */
1793a81925998c22a5af981c6933f56f24437e790447carllstatic test_loop_t float_loops[] = {
1794a81925998c22a5af981c6933f56f24437e790447carll   NULL,
1795a81925998c22a5af981c6933f56f24437e790447carll   &test_float_two_args,
1796a81925998c22a5af981c6933f56f24437e790447carll};
1797a81925998c22a5af981c6933f56f24437e790447carll
1798a81925998c22a5af981c6933f56f24437e790447carll
1799a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_fa_ops_two[] = {
1800a81925998c22a5af981c6933f56f24437e790447carll    { &test_fmrgew          , "fmrgew", },
1801a81925998c22a5af981c6933f56f24437e790447carll    { &test_fmrgow          , "fmrgow", },
1802a81925998c22a5af981c6933f56f24437e790447carll    { NULL,                   NULL,           },
1803dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
1804dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1805dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic test_table_t all_tests[] = {
1806dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   {
1807dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll       tests_move_ops_spe,
1808dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll       "PPC VSR special move insns",
18096277067119ad816282b8e57727295b3adee14075carll       PPC_ALTIVECD | PPC_MOV | PPC_ONE_ARG,
1810dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   },
1811dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   {
18126277067119ad816282b8e57727295b3adee14075carll       tests_aa_dbl_ops_two_args,
18136277067119ad816282b8e57727295b3adee14075carll       "PPC altivec double word integer insns (arith, compare) with two args",
18146277067119ad816282b8e57727295b3adee14075carll       PPC_ALTIVECD | PPC_ARITH | PPC_TWO_ARGS,
18156277067119ad816282b8e57727295b3adee14075carll   },
18166277067119ad816282b8e57727295b3adee14075carll   {
18176277067119ad816282b8e57727295b3adee14075carll       tests_aa_word_ops_two_args_dres,
18186277067119ad816282b8e57727295b3adee14075carll       "PPC altivec integer word instructions with two input args, double word result",
18196277067119ad816282b8e57727295b3adee14075carll       PPC_ALTIVEC | PPC_ARITH_DRES | PPC_TWO_ARGS,
18206277067119ad816282b8e57727295b3adee14075carll   },
18216277067119ad816282b8e57727295b3adee14075carll   {
18226277067119ad816282b8e57727295b3adee14075carll       tests_aa_dbl_to_int_two_args,
18236277067119ad816282b8e57727295b3adee14075carll       "PPC altivec doubleword-to-integer instructions with two input args, saturated integer result",
18246277067119ad816282b8e57727295b3adee14075carll       PPC_ALTIVECD | PPC_DOUBLE_IN_IRES | PPC_TWO_ARGS,
18256277067119ad816282b8e57727295b3adee14075carll   },
18266277067119ad816282b8e57727295b3adee14075carll   {
18276277067119ad816282b8e57727295b3adee14075carll       tests_aa_word_ops_one_arg_dres,
18286277067119ad816282b8e57727295b3adee14075carll       "PPC altivec integer word instructions with one input arg, double word result",
18296277067119ad816282b8e57727295b3adee14075carll       PPC_ALTIVEC | PPC_ARITH_DRES | PPC_ONE_ARG,
1830dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   },
1831a81925998c22a5af981c6933f56f24437e790447carll   {
1832a81925998c22a5af981c6933f56f24437e790447carll      tests_istq_ops_two_i16,
1833a81925998c22a5af981c6933f56f24437e790447carll      "PPC store quadword insns\n    with one register + one 16 bits immediate args with flags update",
1834a81925998c22a5af981c6933f56f24437e790447carll      0x0001050c,
1835a81925998c22a5af981c6933f56f24437e790447carll   },
1836a81925998c22a5af981c6933f56f24437e790447carll   {
1837a81925998c22a5af981c6933f56f24437e790447carll      tests_ildq_ops_two_i16,
1838a81925998c22a5af981c6933f56f24437e790447carll      "PPC load quadword insns\n    with one register + one 16 bits immediate args with flags update",
1839a81925998c22a5af981c6933f56f24437e790447carll      0x0001050d,
1840a81925998c22a5af981c6933f56f24437e790447carll   },
1841a81925998c22a5af981c6933f56f24437e790447carll   {
1842a81925998c22a5af981c6933f56f24437e790447carll       tests_ldq_ops_three,
1843a81925998c22a5af981c6933f56f24437e790447carll       "PPC load quadword insns\n    with three register args",
1844a81925998c22a5af981c6933f56f24437e790447carll       0x0001050f,
1845a81925998c22a5af981c6933f56f24437e790447carll   },
1846a81925998c22a5af981c6933f56f24437e790447carll   {
1847a81925998c22a5af981c6933f56f24437e790447carll       tests_stq_ops_three,
1848a81925998c22a5af981c6933f56f24437e790447carll       "PPC store quadword insns\n    with three register args",
1849a81925998c22a5af981c6933f56f24437e790447carll       0x0001050e,
1850a81925998c22a5af981c6933f56f24437e790447carll   },
1851a81925998c22a5af981c6933f56f24437e790447carll   {
1852a81925998c22a5af981c6933f56f24437e790447carll       tests_fa_ops_two,
1853a81925998c22a5af981c6933f56f24437e790447carll       "PPC floating point arith insns with two args",
1854a81925998c22a5af981c6933f56f24437e790447carll       0x00020102,
1855a81925998c22a5af981c6933f56f24437e790447carll   },
185624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   {
185724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       tests_aa_ops_three    ,
185824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       "PPC altivec integer logical insns with three args",
185924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       0x00060203,
186024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   },
186124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   {
186224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       tests_aa_dbl_ops_one_arg,
186324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       "PPC altivec one vector input arg, hex result",
186424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       0x00060201,
186524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   },
186624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   {
186724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       tests_aa_SHA_ops,
186824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       "PPC altivec SSH insns",
186924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       0x00040B01,
187024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   },
187124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   {
187224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       tests_aa_bcd_ops,
187324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       "PPC altivec BCD insns",
187424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll       0x00040B02,
187524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll   },
1876e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   {
1877e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll       tests_aa_quadword_two_args,
1878e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll       "PPC altivec quadword insns, two input args",
1879e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll       0x00070102,
1880e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   },
1881e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   {
1882e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll       tests_aa_quadword_three_args,
1883e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll       "PPC altivec quadword insns, three input args",
1884e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll       0x00070103
1885e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll   },
1886dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   { NULL,                   NULL,               0x00000000, },
1887dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll};
1888dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1889dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void do_tests ( insn_sel_flags_t seln_flags,
1890dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll                       char *filter)
1891dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
1892dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   test_loop_t *loop;
1893dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   test_t *tests;
1894dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int nb_args, type, family;
1895dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int i, j, n;
1896dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int exact;
1897dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1898dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   exact = check_filter(filter);
1899dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   n = 0;
1900dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   for (i=0; all_tests[i].name != NULL; i++) {
1901dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      nb_args = all_tests[i].flags & PPC_NB_ARGS;
1902dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1903dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      /* Check number of arguments */
1904dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if ((nb_args == 1 && !seln_flags.one_arg) ||
1905dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (nb_args == 2 && !seln_flags.two_args) ||
1906dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (nb_args == 3 && !seln_flags.three_args)){
1907dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         continue;
1908dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
1909dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      /* Check instruction type */
1910dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      type = all_tests[i].flags & PPC_TYPE;
1911dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if ((type == PPC_ARITH   && !seln_flags.arith)   ||
1912dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (type == PPC_LOGICAL && !seln_flags.logical) ||
1913dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (type == PPC_COMPARE && !seln_flags.compare) ||
1914dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (type == PPC_LDST && !seln_flags.ldst)       ||
1915dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (type == PPC_MOV && !seln_flags.ldst)       ||
1916dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (type == PPC_POPCNT && !seln_flags.arith)) {
1917dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         continue;
1918dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
1919dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1920dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      /* Check instruction family */
1921dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      family = all_tests[i].flags & PPC_FAMILY;
1922dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if ((family == PPC_INTEGER  && !seln_flags.integer) ||
1923dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (family == PPC_FLOAT    && !seln_flags.floats)  ||
1924dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (family == PPC_ALTIVEC && !seln_flags.altivec)  ||
19256277067119ad816282b8e57727295b3adee14075carll          (family == PPC_ALTIVECD && !seln_flags.altivec)  ||
1926e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll          (family == PPC_ALTIVECQ && !seln_flags.altivec)  ||
1927dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (family == PPC_FALTIVEC && !seln_flags.faltivec)) {
1928dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         continue;
1929dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
1930dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      /* Check flags update */
1931dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if (((all_tests[i].flags & PPC_CR)  && seln_flags.cr == 0) ||
1932dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll          (!(all_tests[i].flags & PPC_CR) && seln_flags.cr == 1))
1933dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         continue;
1934dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1935dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      /* All passed, do the tests */
1936dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      tests = all_tests[i].tests;
1937dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1938dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      loop = NULL;
1939dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1940dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      /* Select the test loop */
1941dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      switch (family) {
1942dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case PPC_INTEGER:
1943a81925998c22a5af981c6933f56f24437e790447carll         mem_resv = memalign16(2 * sizeof(HWord_t));  // want 128-bits
1944a81925998c22a5af981c6933f56f24437e790447carll         loop = &int_loops[nb_args - 1];
1945dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
1946dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1947dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case PPC_FLOAT:
1948a81925998c22a5af981c6933f56f24437e790447carll         loop = &float_loops[nb_args - 1];
1949dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
1950dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1951e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll      case PPC_ALTIVECQ:
1952e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll         if (nb_args == 2)
1953e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll            loop = &altivec_loops[ALTV_DINT];
1954e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll         else if (nb_args == 3)
1955e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll            loop = &altivec_loops[ALTV_DINT_THREE_ARGS];
1956e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll         break;
19576277067119ad816282b8e57727295b3adee14075carll      case PPC_ALTIVECD:
1958dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         switch (type) {
19596277067119ad816282b8e57727295b3adee14075carll         case PPC_MOV:
19606277067119ad816282b8e57727295b3adee14075carll            loop = &altivec_loops[ALTV_MOV];
19616277067119ad816282b8e57727295b3adee14075carll            break;
19626277067119ad816282b8e57727295b3adee14075carll         case PPC_ARITH:
19636277067119ad816282b8e57727295b3adee14075carll            loop = &altivec_loops[ALTV_DINT];
19646277067119ad816282b8e57727295b3adee14075carll            break;
19656277067119ad816282b8e57727295b3adee14075carll         case PPC_DOUBLE_IN_IRES:
19666277067119ad816282b8e57727295b3adee14075carll            loop = &altivec_loops[ALTV_DINT_IRES];
19676277067119ad816282b8e57727295b3adee14075carll            break;
196824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         case PPC_LOGICAL:
196924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            if (nb_args == 3)
197024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll               loop = &altivec_loops[ALTV_DINT_THREE_ARGS];
197124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            else if (nb_args ==1)
197224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll               loop = &altivec_loops[ALTV_DINT_ONE_ARG];
197324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            break;
19746277067119ad816282b8e57727295b3adee14075carll         default:
19756277067119ad816282b8e57727295b3adee14075carll            printf("No altivec test defined for type %x\n", type);
1976dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         }
1977dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
1978dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
1979dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case PPC_FALTIVEC:
1980dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         printf("Currently there are no floating altivec tests in this testsuite.\n");
1981dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
1982dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
19836277067119ad816282b8e57727295b3adee14075carll      case PPC_ALTIVEC:
19846277067119ad816282b8e57727295b3adee14075carll         switch (type) {
19856277067119ad816282b8e57727295b3adee14075carll         case PPC_ARITH_DRES:
198624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         {
19876277067119ad816282b8e57727295b3adee14075carll            switch (nb_args) {
19886277067119ad816282b8e57727295b3adee14075carll            case 1:
19896277067119ad816282b8e57727295b3adee14075carll               loop = &altivec_loops[ALTV_ONE_INT_DRES];
19906277067119ad816282b8e57727295b3adee14075carll               break;
19916277067119ad816282b8e57727295b3adee14075carll            case 2:
19926277067119ad816282b8e57727295b3adee14075carll               loop = &altivec_loops[ALTV_INT_DRES];
19936277067119ad816282b8e57727295b3adee14075carll               break;
19946277067119ad816282b8e57727295b3adee14075carll            default:
19956277067119ad816282b8e57727295b3adee14075carll               printf("No altivec test defined for number args %d\n", nb_args);
19966277067119ad816282b8e57727295b3adee14075carll            }
19976277067119ad816282b8e57727295b3adee14075carll            break;
199824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         }
199924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll         case PPC_SHA_OR_BCD:
200024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            if (nb_args == 1)
200124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll               loop = &altivec_loops[ALTV_SHA];
200224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            else
200324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll               loop = &altivec_loops[ATLV_BCD];
200424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll            break;
20056277067119ad816282b8e57727295b3adee14075carll         default:
20066277067119ad816282b8e57727295b3adee14075carll            printf("No altivec test defined for type %x\n", type);
20076277067119ad816282b8e57727295b3adee14075carll         }
20086277067119ad816282b8e57727295b3adee14075carll         break;
20096277067119ad816282b8e57727295b3adee14075carll
2010dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      default:
2011dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         printf("ERROR: unknown insn family %08x\n", family);
2012dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         continue;
2013dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
2014dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if (1 || verbose > 0)
2015dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      for (j=0; tests[j].name != NULL; j++) {
2016dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         if (check_name(tests[j].name, filter, exact)) {
2017dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            if (verbose > 1)
2018dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll               printf("Test instruction %s\n", tests[j].name);
2019dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            if (loop != NULL)
2020dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll               (*loop)(tests[j].name, tests[j].func, all_tests[i].flags);
2021dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            printf("\n");
2022dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll            n++;
2023dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         }
2024dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll        }
2025dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      if (verbose) printf("\n");
2026dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
2027dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   printf("All done. Tested %d different instructions\n", n);
2028dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
2029dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2030dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2031dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void usage (void)
2032dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
2033dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   fprintf(stderr,
2034dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll           "Usage: jm-insns [OPTION]\n"
2035dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll           "\t-i: test integer instructions (default)\n"
2036dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll           "\t-f: test floating point instructions\n"
2037dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll           "\t-a: test altivec instructions\n"
2038dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll           "\t-A: test all (int, fp, altivec) instructions\n"
2039dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll           "\t-v: be verbose\n"
2040dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll           "\t-h: display this help and exit\n"
2041dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll           );
2042dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
2043dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2044dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif
2045dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2046dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllint main (int argc, char **argv)
2047dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{
2048dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#ifdef HAS_ISA_2_07
2049dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   /* Simple usage:
2050dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      ./jm-insns -i   => int insns
2051dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      ./jm-insns -f   => fp  insns
2052dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      ./jm-insns -a   => av  insns
2053dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      ./jm-insns -A   => int, fp and avinsns
2054dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   */
2055dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   char *filter = NULL;
2056dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   insn_sel_flags_t flags;
2057dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   int c;
2058dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2059dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   // Args
2060dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.one_arg    = 1;
2061dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.two_args   = 1;
2062dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.three_args = 1;
2063dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   // Type
2064dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.arith      = 1;
2065dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.logical    = 1;
2066dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.compare    = 1;
2067dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.ldst       = 1;
2068dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   // Family
2069dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.integer    = 0;
2070dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.floats     = 0;
2071dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.altivec    = 0;
2072dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.faltivec   = 0;
2073dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   // Flags
2074dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   flags.cr         = 2;
2075dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2076dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   while ((c = getopt(argc, argv, "ifahvA")) != -1) {
2077dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      switch (c) {
2078dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case 'i':
2079dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         flags.integer  = 1;
2080dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
2081dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case 'f':
2082a81925998c22a5af981c6933f56f24437e790447carll         build_fargs_table();
2083dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         flags.floats   = 1;
2084dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
2085dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case 'a':
2086dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         flags.altivec  = 1;
2087dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         flags.faltivec = 1;
2088dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
2089dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case 'A':
2090dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         flags.integer  = 1;
2091dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         flags.floats   = 1;
2092dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         flags.altivec  = 1;
2093dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         flags.faltivec = 1;
2094dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
2095dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case 'h':
2096dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         usage();
2097dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         return 0;
2098dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      case 'v':
2099dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         verbose++;
2100dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         break;
2101dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      default:
2102dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         usage();
2103dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         fprintf(stderr, "Unknown argument: '%c'\n", c);
2104dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll         return 1;
2105dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      }
2106dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
2107dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2108dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   arg_list_size = 0;
2109dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
21106277067119ad816282b8e57727295b3adee14075carll   build_vargs_table();
2111dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   if (verbose > 1) {
2112dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("\nInstruction Selection:\n");
2113dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("  n_args: \n");
2114dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    one_arg    = %d\n", flags.one_arg);
2115dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    two_args   = %d\n", flags.two_args);
2116dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    three_args = %d\n", flags.three_args);
2117dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("  type: \n");
2118dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    arith      = %d\n", flags.arith);
2119dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    logical    = %d\n", flags.logical);
2120dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    compare    = %d\n", flags.compare);
2121dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    ldst       = %d\n", flags.ldst);
2122dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("  family: \n");
2123dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    integer    = %d\n", flags.integer);
2124dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    floats     = %d\n", flags.floats);
2125dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    altivec    = %d\n", flags.altivec);
2126dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    faltivec   = %d\n", flags.faltivec);
2127dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("  cr update: \n");
2128dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("    cr         = %d\n", flags.cr);
2129dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll      printf("\n");
2130dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   }
2131dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll
2132dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   do_tests( flags, filter );
2133dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#else
2134dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   printf("NO ISA 2.07 SUPPORT\n");
2135dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif
2136dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll   return 0;
2137dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}
2138