1f34eb496099507090f26dcf94bb780da8b3894e5sewardj/*  Copyright (C) 2011 IBM
2f34eb496099507090f26dcf94bb780da8b3894e5sewardj
3f34eb496099507090f26dcf94bb780da8b3894e5sewardj Author: Maynard Johnson <maynardj@us.ibm.com>
4f34eb496099507090f26dcf94bb780da8b3894e5sewardj
5f34eb496099507090f26dcf94bb780da8b3894e5sewardj This program is free software; you can redistribute it and/or
6f34eb496099507090f26dcf94bb780da8b3894e5sewardj modify it under the terms of the GNU General Public License as
7f34eb496099507090f26dcf94bb780da8b3894e5sewardj published by the Free Software Foundation; either version 2 of the
8f34eb496099507090f26dcf94bb780da8b3894e5sewardj License, or (at your option) any later version.
9f34eb496099507090f26dcf94bb780da8b3894e5sewardj
10f34eb496099507090f26dcf94bb780da8b3894e5sewardj This program is distributed in the hope that it will be useful, but
11f34eb496099507090f26dcf94bb780da8b3894e5sewardj WITHOUT ANY WARRANTY; without even the implied warranty of
12f34eb496099507090f26dcf94bb780da8b3894e5sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13f34eb496099507090f26dcf94bb780da8b3894e5sewardj General Public License for more details.
14f34eb496099507090f26dcf94bb780da8b3894e5sewardj
15f34eb496099507090f26dcf94bb780da8b3894e5sewardj You should have received a copy of the GNU General Public License
16f34eb496099507090f26dcf94bb780da8b3894e5sewardj along with this program; if not, write to the Free Software
17f34eb496099507090f26dcf94bb780da8b3894e5sewardj Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18f34eb496099507090f26dcf94bb780da8b3894e5sewardj 02111-1307, USA.
19f34eb496099507090f26dcf94bb780da8b3894e5sewardj
20f34eb496099507090f26dcf94bb780da8b3894e5sewardj The GNU General Public License is contained in the file COPYING.
21f34eb496099507090f26dcf94bb780da8b3894e5sewardj */
22f34eb496099507090f26dcf94bb780da8b3894e5sewardj
23f34eb496099507090f26dcf94bb780da8b3894e5sewardj#ifdef HAS_VSX
24f34eb496099507090f26dcf94bb780da8b3894e5sewardj
25f34eb496099507090f26dcf94bb780da8b3894e5sewardj#include <stdio.h>
26f34eb496099507090f26dcf94bb780da8b3894e5sewardj#include <stdint.h>
27f34eb496099507090f26dcf94bb780da8b3894e5sewardj#include <stdlib.h>
28f34eb496099507090f26dcf94bb780da8b3894e5sewardj#include <string.h>
29f34eb496099507090f26dcf94bb780da8b3894e5sewardj#include <malloc.h>
30f34eb496099507090f26dcf94bb780da8b3894e5sewardj#include <altivec.h>
31f34eb496099507090f26dcf94bb780da8b3894e5sewardj
32f34eb496099507090f26dcf94bb780da8b3894e5sewardj#ifndef __powerpc64__
33f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef uint32_t HWord_t;
34f34eb496099507090f26dcf94bb780da8b3894e5sewardj#else
35f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef uint64_t HWord_t;
36f34eb496099507090f26dcf94bb780da8b3894e5sewardj#endif /* __powerpc64__ */
37f34eb496099507090f26dcf94bb780da8b3894e5sewardj
38dd690bf8d81c9119a7228446be12e3366e202176carll#ifdef VGP_ppc64le_linux
39dd690bf8d81c9119a7228446be12e3366e202176carll#define isLE 1
40dd690bf8d81c9119a7228446be12e3366e202176carll#else
41dd690bf8d81c9119a7228446be12e3366e202176carll#define isLE 0
42dd690bf8d81c9119a7228446be12e3366e202176carll#endif
43dd690bf8d81c9119a7228446be12e3366e202176carll
44f34eb496099507090f26dcf94bb780da8b3894e5sewardjregister HWord_t r14 __asm__ ("r14");
45f34eb496099507090f26dcf94bb780da8b3894e5sewardjregister HWord_t r15 __asm__ ("r15");
46f34eb496099507090f26dcf94bb780da8b3894e5sewardjregister HWord_t r16 __asm__ ("r16");
47f34eb496099507090f26dcf94bb780da8b3894e5sewardjregister HWord_t r17 __asm__ ("r17");
48f34eb496099507090f26dcf94bb780da8b3894e5sewardjregister double f14 __asm__ ("fr14");
49f34eb496099507090f26dcf94bb780da8b3894e5sewardjregister double f15 __asm__ ("fr15");
50f34eb496099507090f26dcf94bb780da8b3894e5sewardjregister double f16 __asm__ ("fr16");
51f34eb496099507090f26dcf94bb780da8b3894e5sewardjregister double f17 __asm__ ("fr17");
52f34eb496099507090f26dcf94bb780da8b3894e5sewardj
53f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic volatile unsigned int cond_reg;
54f34eb496099507090f26dcf94bb780da8b3894e5sewardj
55f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
56f34eb496099507090f26dcf94bb780da8b3894e5sewardj
57f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define SET_CR(_arg) \
58f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("mtcr  %0" : : "b"(_arg) : ALLCR );
59f34eb496099507090f26dcf94bb780da8b3894e5sewardj
60f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define SET_XER(_arg) \
61f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" );
62f34eb496099507090f26dcf94bb780da8b3894e5sewardj
63f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define GET_CR(_lval) \
64f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("mfcr %0"  : "=b"(_lval) )
65f34eb496099507090f26dcf94bb780da8b3894e5sewardj
66f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define GET_XER(_lval) \
67f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) )
68f34eb496099507090f26dcf94bb780da8b3894e5sewardj
69f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define GET_CR_XER(_lval_cr,_lval_xer) \
70f34eb496099507090f26dcf94bb780da8b3894e5sewardj   do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0)
71f34eb496099507090f26dcf94bb780da8b3894e5sewardj
72f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define SET_CR_ZERO \
73f34eb496099507090f26dcf94bb780da8b3894e5sewardj      SET_CR(0)
74f34eb496099507090f26dcf94bb780da8b3894e5sewardj
75f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define SET_XER_ZERO \
76f34eb496099507090f26dcf94bb780da8b3894e5sewardj      SET_XER(0)
77f34eb496099507090f26dcf94bb780da8b3894e5sewardj
78f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define SET_CR_XER_ZERO \
79f34eb496099507090f26dcf94bb780da8b3894e5sewardj   do { SET_CR_ZERO; SET_XER_ZERO; } while (0)
80f34eb496099507090f26dcf94bb780da8b3894e5sewardj
81f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define SET_FPSCR_ZERO \
82f34eb496099507090f26dcf94bb780da8b3894e5sewardj   do { double _d = 0.0; \
83f34eb496099507090f26dcf94bb780da8b3894e5sewardj        __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
84f34eb496099507090f26dcf94bb780da8b3894e5sewardj   } while (0)
85f34eb496099507090f26dcf94bb780da8b3894e5sewardj
86f34eb496099507090f26dcf94bb780da8b3894e5sewardj
87f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef void (*test_func_t)(void);
88f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct ldst_test ldst_test_t;
89f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct vsx_logic_test logic_test_t;
90f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct xs_conv_test xs_conv_test_t;
91f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct p7_fp_test fp_test_t;
92f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct vx_fp_test vx_fp_test_t;
93f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct vsx_move_test move_test_t;
94f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct vsx_permute_test permute_test_t;
95f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct test_table test_table_t;
96f34eb496099507090f26dcf94bb780da8b3894e5sewardj
97f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic double *fargs = NULL;
98f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic int nb_fargs;
99f34eb496099507090f26dcf94bb780da8b3894e5sewardj
100f34eb496099507090f26dcf94bb780da8b3894e5sewardj/* These functions below that construct a table of floating point
101f34eb496099507090f26dcf94bb780da8b3894e5sewardj * values were lifted from none/tests/ppc32/jm-insns.c.
102f34eb496099507090f26dcf94bb780da8b3894e5sewardj */
103f34eb496099507090f26dcf94bb780da8b3894e5sewardj
104f34eb496099507090f26dcf94bb780da8b3894e5sewardj#if defined (DEBUG_ARGS_BUILD)
105f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
106f34eb496099507090f26dcf94bb780da8b3894e5sewardj#else
107f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define AB_DPRINTF(fmt, args...) do { } while (0)
108f34eb496099507090f26dcf94bb780da8b3894e5sewardj#endif
109f34eb496099507090f26dcf94bb780da8b3894e5sewardj
110f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic inline void register_farg (void *farg,
111f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                  int s, uint16_t _exp, uint64_t mant)
112f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
113f34eb496099507090f26dcf94bb780da8b3894e5sewardj   uint64_t tmp;
114f34eb496099507090f26dcf94bb780da8b3894e5sewardj
115f34eb496099507090f26dcf94bb780da8b3894e5sewardj   tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant;
116f34eb496099507090f26dcf94bb780da8b3894e5sewardj   *(uint64_t *)farg = tmp;
117f34eb496099507090f26dcf94bb780da8b3894e5sewardj   AB_DPRINTF("%d %03x %013llx => %016llx %0e\n",
118f34eb496099507090f26dcf94bb780da8b3894e5sewardj              s, _exp, mant, *(uint64_t *)farg, *(double *)farg);
119f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
120f34eb496099507090f26dcf94bb780da8b3894e5sewardj
121f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void build_fargs_table(void)
122f34eb496099507090f26dcf94bb780da8b3894e5sewardj/*
123f34eb496099507090f26dcf94bb780da8b3894e5sewardj * Double precision:
124f34eb496099507090f26dcf94bb780da8b3894e5sewardj * Sign goes from zero to one               (1 bit)
125f34eb496099507090f26dcf94bb780da8b3894e5sewardj * Exponent goes from 0 to ((1 << 12) - 1)  (11 bits)
126f34eb496099507090f26dcf94bb780da8b3894e5sewardj * Mantissa goes from 1 to ((1 << 52) - 1)  (52 bits)
127f34eb496099507090f26dcf94bb780da8b3894e5sewardj * + special values:
128f34eb496099507090f26dcf94bb780da8b3894e5sewardj * +0.0      : 0 0x000 0x0000000000000 => 0x0000000000000000
129f34eb496099507090f26dcf94bb780da8b3894e5sewardj * -0.0      : 1 0x000 0x0000000000000 => 0x8000000000000000
130f34eb496099507090f26dcf94bb780da8b3894e5sewardj * +infinity : 0 0x7FF 0x0000000000000 => 0x7FF0000000000000
131f34eb496099507090f26dcf94bb780da8b3894e5sewardj * -infinity : 1 0x7FF 0x0000000000000 => 0xFFF0000000000000
1328efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * +QNaN     : 0 0x7FF 0x8000000000000 => 0x7FF8000000000000
1338efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * -QNaN     : 1 0x7FF 0x8000000000000 => 0xFFF8000000000000
1348efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * +SNaN     : 0 0x7FF 0x7FFFFFFFFFFFF => 0x7FF7FFFFFFFFFFFF
1358efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * -SNaN     : 1 0x7FF 0x7FFFFFFFFFFFF => 0xFFF7FFFFFFFFFFFF
136f34eb496099507090f26dcf94bb780da8b3894e5sewardj * (8 values)
137f34eb496099507090f26dcf94bb780da8b3894e5sewardj *
138f34eb496099507090f26dcf94bb780da8b3894e5sewardj * Single precision
139f34eb496099507090f26dcf94bb780da8b3894e5sewardj * Sign:     1 bit
140f34eb496099507090f26dcf94bb780da8b3894e5sewardj * Exponent: 8 bits
141f34eb496099507090f26dcf94bb780da8b3894e5sewardj * Mantissa: 23 bits
142f34eb496099507090f26dcf94bb780da8b3894e5sewardj * +0.0      : 0 0x00 0x000000 => 0x00000000
143f34eb496099507090f26dcf94bb780da8b3894e5sewardj * -0.0      : 1 0x00 0x000000 => 0x80000000
144f34eb496099507090f26dcf94bb780da8b3894e5sewardj * +infinity : 0 0xFF 0x000000 => 0x7F800000
145f34eb496099507090f26dcf94bb780da8b3894e5sewardj * -infinity : 1 0xFF 0x000000 => 0xFF800000
1468efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * +QNaN     : 0 0xFF 0x400000 => 0x7FC00000
1478efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * -QNaN     : 1 0xFF 0x400000 => 0xFFC00000
1488efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * +SNaN     : 0 0xFF 0x3FFFFF => 0x7FBFFFFF
1498efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * -SNaN     : 1 0xFF 0x3FFFFF => 0xFFBFFFFF
150f34eb496099507090f26dcf94bb780da8b3894e5sewardj*/
151f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
152f34eb496099507090f26dcf94bb780da8b3894e5sewardj   uint64_t mant;
153f34eb496099507090f26dcf94bb780da8b3894e5sewardj   uint16_t _exp, e1;
154f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int s;
155f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int i=0;
156f34eb496099507090f26dcf94bb780da8b3894e5sewardj
157f34eb496099507090f26dcf94bb780da8b3894e5sewardj   if (nb_fargs)
158f34eb496099507090f26dcf94bb780da8b3894e5sewardj      return;
159f34eb496099507090f26dcf94bb780da8b3894e5sewardj
160f34eb496099507090f26dcf94bb780da8b3894e5sewardj   fargs = malloc( 16 * sizeof(double) );
161f34eb496099507090f26dcf94bb780da8b3894e5sewardj   for (s = 0; s < 2; s++) {
162f34eb496099507090f26dcf94bb780da8b3894e5sewardj      for (e1 = 0x001;; e1 = ((e1 + 1) << 13) + 7) {
163f34eb496099507090f26dcf94bb780da8b3894e5sewardj         if (e1 >= 0x400)
164f34eb496099507090f26dcf94bb780da8b3894e5sewardj            e1 = 0x3fe;
165f34eb496099507090f26dcf94bb780da8b3894e5sewardj         _exp = e1;
166f34eb496099507090f26dcf94bb780da8b3894e5sewardj         for (mant = 0x0000000000001ULL; mant < (1ULL << 52);
167f34eb496099507090f26dcf94bb780da8b3894e5sewardj         /* Add 'random' bits */
168f34eb496099507090f26dcf94bb780da8b3894e5sewardj         mant = ((mant + 0x4A6) << 29) + 0x359) {
169f34eb496099507090f26dcf94bb780da8b3894e5sewardj            register_farg( &fargs[i++], s, _exp, mant );
170f34eb496099507090f26dcf94bb780da8b3894e5sewardj         }
171f34eb496099507090f26dcf94bb780da8b3894e5sewardj         if (e1 == 0x3fe)
172f34eb496099507090f26dcf94bb780da8b3894e5sewardj            break;
173f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
174f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
175f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // add a few smaller values to fargs . . .
176f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
177f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x002;
178f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x0000000000b01ULL;
179f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&fargs[i++], s, _exp, mant);
180f34eb496099507090f26dcf94bb780da8b3894e5sewardj
181f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x000;
182f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x00000203f0b3dULL;
183f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&fargs[i++], s, _exp, mant);
184f34eb496099507090f26dcf94bb780da8b3894e5sewardj
185f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x00000005a203dULL;
186f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&fargs[i++], s, _exp, mant);
187f34eb496099507090f26dcf94bb780da8b3894e5sewardj
188f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 1;
189f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x002;
190f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x0000000000b01ULL;
191f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&fargs[i++], s, _exp, mant);
192f34eb496099507090f26dcf94bb780da8b3894e5sewardj
193f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x000;
194f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x00000203f0b3dULL;
195f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&fargs[i++], s, _exp, mant);
196f34eb496099507090f26dcf94bb780da8b3894e5sewardj
197f34eb496099507090f26dcf94bb780da8b3894e5sewardj   nb_fargs = i;
198f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
199f34eb496099507090f26dcf94bb780da8b3894e5sewardj
200f34eb496099507090f26dcf94bb780da8b3894e5sewardj
201f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef struct fp_test_args {
202f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int fra_idx;
203f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int frb_idx;
204f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int cr_flags;
205f34eb496099507090f26dcf94bb780da8b3894e5sewardj} fp_test_args_t;
206f34eb496099507090f26dcf94bb780da8b3894e5sewardj
207f34eb496099507090f26dcf94bb780da8b3894e5sewardj
208dd690bf8d81c9119a7228446be12e3366e202176carllfp_test_args_t ftdiv_tests[] = {
209f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {0, 1, 0x8},
210f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {9, 1, 0xa},
211f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {1, 12, 0xa},
212f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {0, 2, 0xa},
213f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {1, 3, 0xa},
214f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {3, 0, 0xa},
215f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {0, 3, 0xa},
216f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {4, 0, 0xa},
217f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {7, 1, 0xe},
218f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {8, 1, 0xe},
219f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {1, 7, 0xe},
220f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {0, 13, 0xe},
221f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {5, 5, 0xe},
222f34eb496099507090f26dcf94bb780da8b3894e5sewardj                              {5, 6, 0xe},
223f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
224f34eb496099507090f26dcf94bb780da8b3894e5sewardj
225f34eb496099507090f26dcf94bb780da8b3894e5sewardjfp_test_args_t xscmpX_tests[] = {
226dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 8, 0x2},
227dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 14, 0x8},
228dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 6, 0x8},
229dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 5, 0x8},
230dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 4, 0x8},
231dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 7, 0x8},
232dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 9, 0x1},
233dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 11, 0x1},
234dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 8, 0x4},
235dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 14, 0x2},
236dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 6, 0x8},
237dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 5, 0x8},
238dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 4, 0x8},
239dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 7, 0x8},
240dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 9, 0x1},
241dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 11, 0x1},
242dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 8, 0x4},
243dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 14, 0x4},
244dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 6, 0x2},
245dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 5, 0x2},
246dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 4, 0x8},
247dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 7, 0x8},
248dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 9, 0x1},
249dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 11, 0x1},
250dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 8, 0x4},
251dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 14, 0x4},
252dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 6, 0x2},
253dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 5, 0x2},
254dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 4, 0x8},
255dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 7, 0x8},
256dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 9, 0x1},
257dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 11, 0x1},
258dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 8, 0x4},
259dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 14, 0x4},
260dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 6, 0x4},
261dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 5, 0x4},
262dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 1, 0x8},
263dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 7, 0x8},
264dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 9, 0x1},
265dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 11, 0x1},
266dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 8, 0x4},
267dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 14, 0x4},
268dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 6, 0x4},
269dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 5, 0x4},
270dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 4, 0x4},
271dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 7, 0x2},
272dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 9, 0x1},
273dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 11, 0x1},
274dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 8, 0x1},
275dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 14, 0x1},
276dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 6, 0x1},
277dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 5, 0x1},
278dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 4, 0x1},
279dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 7, 0x1},
280dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 9, 0x1},
281dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 11, 0x1},
282dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 8, 0x1},
283dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 14, 0x1},
284dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 6, 0x1},
285dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 5, 0x1},
286dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 4, 0x1},
287dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 7, 0x1},
288dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 9, 0x1},
289dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 11, 0x1},
290f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
291f34eb496099507090f26dcf94bb780da8b3894e5sewardj
292f34eb496099507090f26dcf94bb780da8b3894e5sewardjfp_test_args_t xsadddp_tests[] = {
293dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 8, 0x0},
294dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 14, 0x0},
295dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 6, 0x0},
296dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 5, 0x0},
297dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 4, 0x0},
298dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 7, 0x0},
299dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 9, 0x0},
300dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 11, 0x0},
301dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 8, 0x0},
302dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 14, 0x0},
303dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 6, 0x0},
304dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 5, 0x0},
305dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 4, 0x0},
306dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 7, 0x0},
307dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 9, 0x0},
308dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 11, 0x0},
309dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 8, 0x0},
310dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 14, 0x0},
311dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 6, 0x0},
312dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 5, 0x0},
313dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 4, 0x0},
314dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 7, 0x0},
315dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 9, 0x0},
316dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 11, 0x0},
317dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 8, 0x0},
318dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 14, 0x0},
319dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 6, 0x0},
320dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 5, 0x0},
321dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 4, 0x0},
322dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 7, 0x0},
323dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 9, 0x0},
324dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 11, 0x0},
325dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 8, 0x0},
326dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 14, 0x0},
327dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 6, 0x0},
328dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 5, 0x0},
329dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 1, 0x0},
330dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 7, 0x0},
331dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 9, 0x0},
332dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 11, 0x0},
333dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 8, 0x0},
334dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 14, 0x0},
335dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 6, 0x0},
336dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 5, 0x0},
337dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 4, 0x0},
338dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 7, 0x0},
339dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 9, 0x0},
340dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 11, 0x0},
341dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 8, 0x0},
342dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 14, 0x0},
343dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 6, 0x0},
344dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 5, 0x0},
345dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 4, 0x0},
346dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 7, 0x0},
347dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 9, 0x0},
348dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 11, 0x0},
349dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 8, 0x0},
350dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 14, 0x0},
351dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 6, 0x0},
352dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 5, 0x0},
353dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 4, 0x0},
354dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 7, 0x0},
355dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 9, 0x0},
356dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 11, 0x0},
357f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
358f34eb496099507090f26dcf94bb780da8b3894e5sewardj
359f34eb496099507090f26dcf94bb780da8b3894e5sewardjfp_test_args_t xsdivdp_tests[] = {
360dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 8, 0x0},
361dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 14, 0x0},
362dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 6, 0x0},
363dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 5, 0x0},
364dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 4, 0x0},
365dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 7, 0x0},
366dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 9, 0x0},
367dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 11, 0x0},
368dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 8, 0x0},
369dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 14, 0x0},
370dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 6, 0x0},
371dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 5, 0x0},
372dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 4, 0x0},
373dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 7, 0x0},
374dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 9, 0x0},
375dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 11, 0x0},
376dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 8, 0x0},
377dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 14, 0x0},
378dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 6, 0x0},
379dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 5, 0x0},
380dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 4, 0x0},
381dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 7, 0x0},
382dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 9, 0x0},
383dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 11, 0x0},
384dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 8, 0x0},
385dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 14, 0x0},
386dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 6, 0x0},
387dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 5, 0x0},
388dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 4, 0x0},
389dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 7, 0x0},
390dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 9, 0x0},
391dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 11, 0x0},
392dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 8, 0x0},
393dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 14, 0x0},
394dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 6, 0x0},
395dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 5, 0x0},
396dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 1, 0x0},
397dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 7, 0x0},
398dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 9, 0x0},
399dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 11, 0x0},
400dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 8, 0x0},
401dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 14, 0x0},
402dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 6, 0x0},
403dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 5, 0x0},
404dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 4, 0x0},
405dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 7, 0x0},
406dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 9, 0x0},
407dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 11, 0x0},
408dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 8, 0x0},
409dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 14, 0x0},
410dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 6, 0x0},
411dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 5, 0x0},
412dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 4, 0x0},
413dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 7, 0x0},
414dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 9, 0x0},
415dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 11, 0x0},
416dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 8, 0x0},
417dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 14, 0x0},
418dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 6, 0x0},
419dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 5, 0x0},
420dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 4, 0x0},
421dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 7, 0x0},
422dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 9, 0x0},
423dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 11, 0x0},
424f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
425f34eb496099507090f26dcf94bb780da8b3894e5sewardj
426f34eb496099507090f26dcf94bb780da8b3894e5sewardjfp_test_args_t xsmaddXdp_tests[] = {
427dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 8, 0x0},
428dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 14, 0x0},
429dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 6, 0x0},
430dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 5, 0x0},
431dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 4, 0x0},
432dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 7, 0x0},
433dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 9, 0x0},
434dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 11, 0x0},
435dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 8, 0x0},
436dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 14, 0x0},
437dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 6, 0x0},
438dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 5, 0x0},
439dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 4, 0x0},
440dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 7, 0x0},
441dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 9, 0x0},
442dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 11, 0x0},
443dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 8, 0x0},
444dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 14, 0x0},
445dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 6, 0x0},
446dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 5, 0x0},
447dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 4, 0x0},
448dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 7, 0x0},
449dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 9, 0x0},
450dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 11, 0x0},
451dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 8, 0x0},
452dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 14, 0x0},
453dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 6, 0x0},
454dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 5, 0x0},
455dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 4, 0x0},
456dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 7, 0x0},
457dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 9, 0x0},
458dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 11, 0x0},
459dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 8, 0x0},
460dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 14, 0x0},
461dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 6, 0x0},
462dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 5, 0x0},
463dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 1, 0x0},
464dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 7, 0x0},
465dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 9, 0x0},
466dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 11, 0x0},
467dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 8, 0x0},
468dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 14, 0x0},
469dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 6, 0x0},
470dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 5, 0x0},
471dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 4, 0x0},
472dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 7, 0x0},
473dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 9, 0x0},
474dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 11, 0x0},
475dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 8, 0x0},
476dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 14, 0x0},
477dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 6, 0x0},
478dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 5, 0x0},
479dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 4, 0x0},
480dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 7, 0x0},
481dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 9, 0x0},
482dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 11, 0x0},
483dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 8, 0x0},
484dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 14, 0x0},
485dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 6, 0x0},
486dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 5, 0x0},
487dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 4, 0x0},
488dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 7, 0x0},
489dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 9, 0x0},
490dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 11, 0x0},
491f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
492f34eb496099507090f26dcf94bb780da8b3894e5sewardj
493f34eb496099507090f26dcf94bb780da8b3894e5sewardjfp_test_args_t xsmsubXdp_tests[] = {
494dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 8, 0x0},
495dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 14, 0x0},
496dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 6, 0x0},
497dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 5, 0x0},
498dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 4, 0x0},
499dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 7, 0x0},
500dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 9, 0x0},
501dd690bf8d81c9119a7228446be12e3366e202176carll                                   {8, 11, 0x0},
502dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 8, 0x0},
503dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 14, 0x0},
504dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 6, 0x0},
505dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 5, 0x0},
506dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 4, 0x0},
507dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 7, 0x0},
508dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 9, 0x0},
509dd690bf8d81c9119a7228446be12e3366e202176carll                                   {14, 11, 0x0},
510dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 8, 0x0},
511dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 14, 0x0},
512dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 6, 0x0},
513dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 5, 0x0},
514dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 4, 0x0},
515dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 7, 0x0},
516dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 9, 0x0},
517dd690bf8d81c9119a7228446be12e3366e202176carll                                   {6, 11, 0x0},
518dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 8, 0x0},
519dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 14, 0x0},
520dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 6, 0x0},
521dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 5, 0x0},
522dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 4, 0x0},
523dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 7, 0x0},
524dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 9, 0x0},
525dd690bf8d81c9119a7228446be12e3366e202176carll                                   {5, 11, 0x0},
526dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 8, 0x0},
527dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 14, 0x0},
528dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 6, 0x0},
529dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 5, 0x0},
530dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 1, 0x0},
531dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 7, 0x0},
532dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 9, 0x0},
533dd690bf8d81c9119a7228446be12e3366e202176carll                                   {4, 11, 0x0},
534dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 8, 0x0},
535dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 14, 0x0},
536dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 6, 0x0},
537dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 5, 0x0},
538dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 4, 0x0},
539dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 7, 0x0},
540dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 9, 0x0},
541dd690bf8d81c9119a7228446be12e3366e202176carll                                   {7, 11, 0x0},
542dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 8, 0x0},
543dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 14, 0x0},
544dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 6, 0x0},
545dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 5, 0x0},
546dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 4, 0x0},
547dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 7, 0x0},
548dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 9, 0x0},
549dd690bf8d81c9119a7228446be12e3366e202176carll                                   {10, 11, 0x0},
550dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 8, 0x0},
551dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 14, 0x0},
552dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 6, 0x0},
553dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 5, 0x0},
554dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 4, 0x0},
555dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 7, 0x0},
556dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 9, 0x0},
557dd690bf8d81c9119a7228446be12e3366e202176carll                                   {12, 11, 0x0},
558f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
559f34eb496099507090f26dcf94bb780da8b3894e5sewardj
560f34eb496099507090f26dcf94bb780da8b3894e5sewardjfp_test_args_t xsnmaddXdp_tests[] = {
561dd690bf8d81c9119a7228446be12e3366e202176carll                                     {8, 8, 0x0},
562dd690bf8d81c9119a7228446be12e3366e202176carll                                     {8, 14, 0x0},
563dd690bf8d81c9119a7228446be12e3366e202176carll                                     {8, 6, 0x0},
564dd690bf8d81c9119a7228446be12e3366e202176carll                                     {8, 5, 0x0},
565dd690bf8d81c9119a7228446be12e3366e202176carll                                     {8, 4, 0x0},
566dd690bf8d81c9119a7228446be12e3366e202176carll                                     {8, 7, 0x0},
567dd690bf8d81c9119a7228446be12e3366e202176carll                                     {8, 9, 0x0},
568dd690bf8d81c9119a7228446be12e3366e202176carll                                     {8, 11, 0x0},
569dd690bf8d81c9119a7228446be12e3366e202176carll                                     {14, 8, 0x0},
570dd690bf8d81c9119a7228446be12e3366e202176carll                                     {14, 14, 0x0},
571dd690bf8d81c9119a7228446be12e3366e202176carll                                     {14, 6, 0x0},
572dd690bf8d81c9119a7228446be12e3366e202176carll                                     {14, 5, 0x0},
573dd690bf8d81c9119a7228446be12e3366e202176carll                                     {14, 4, 0x0},
574dd690bf8d81c9119a7228446be12e3366e202176carll                                     {14, 7, 0x0},
575dd690bf8d81c9119a7228446be12e3366e202176carll                                     {14, 9, 0x0},
576dd690bf8d81c9119a7228446be12e3366e202176carll                                     {14, 11, 0x0},
577dd690bf8d81c9119a7228446be12e3366e202176carll                                     {6, 8, 0x0},
578dd690bf8d81c9119a7228446be12e3366e202176carll                                     {6, 14, 0x0},
579dd690bf8d81c9119a7228446be12e3366e202176carll                                     {6, 6, 0x0},
580dd690bf8d81c9119a7228446be12e3366e202176carll                                     {6, 5, 0x0},
581dd690bf8d81c9119a7228446be12e3366e202176carll                                     {6, 4, 0x0},
582dd690bf8d81c9119a7228446be12e3366e202176carll                                     {6, 7, 0x0},
583dd690bf8d81c9119a7228446be12e3366e202176carll                                     {6, 9, 0x0},
584dd690bf8d81c9119a7228446be12e3366e202176carll                                     {6, 11, 0x0},
585dd690bf8d81c9119a7228446be12e3366e202176carll                                     {5, 8, 0x0},
586dd690bf8d81c9119a7228446be12e3366e202176carll                                     {5, 14, 0x0},
587dd690bf8d81c9119a7228446be12e3366e202176carll                                     {5, 6, 0x0},
588dd690bf8d81c9119a7228446be12e3366e202176carll                                     {5, 5, 0x0},
589dd690bf8d81c9119a7228446be12e3366e202176carll                                     {5, 4, 0x0},
590dd690bf8d81c9119a7228446be12e3366e202176carll                                     {5, 7, 0x0},
591dd690bf8d81c9119a7228446be12e3366e202176carll                                     {5, 9, 0x0},
592dd690bf8d81c9119a7228446be12e3366e202176carll                                     {5, 11, 0x0},
593dd690bf8d81c9119a7228446be12e3366e202176carll                                     {4, 8, 0x0},
594dd690bf8d81c9119a7228446be12e3366e202176carll                                     {4, 14, 0x0},
595dd690bf8d81c9119a7228446be12e3366e202176carll                                     {4, 6, 0x0},
596dd690bf8d81c9119a7228446be12e3366e202176carll                                     {4, 5, 0x0},
597dd690bf8d81c9119a7228446be12e3366e202176carll                                     {4, 1, 0x0},
598dd690bf8d81c9119a7228446be12e3366e202176carll                                     {4, 7, 0x0},
599dd690bf8d81c9119a7228446be12e3366e202176carll                                     {4, 9, 0x0},
600dd690bf8d81c9119a7228446be12e3366e202176carll                                     {4, 11, 0x0},
601dd690bf8d81c9119a7228446be12e3366e202176carll                                     {7, 8, 0x0},
602dd690bf8d81c9119a7228446be12e3366e202176carll                                     {7, 14, 0x0},
603dd690bf8d81c9119a7228446be12e3366e202176carll                                     {7, 6, 0x0},
604dd690bf8d81c9119a7228446be12e3366e202176carll                                     {7, 5, 0x0},
605dd690bf8d81c9119a7228446be12e3366e202176carll                                     {7, 4, 0x0},
606dd690bf8d81c9119a7228446be12e3366e202176carll                                     {7, 7, 0x0},
607dd690bf8d81c9119a7228446be12e3366e202176carll                                     {7, 9, 0x0},
608dd690bf8d81c9119a7228446be12e3366e202176carll                                     {7, 11, 0x0},
609dd690bf8d81c9119a7228446be12e3366e202176carll                                     {10, 8, 0x0},
610dd690bf8d81c9119a7228446be12e3366e202176carll                                     {10, 14, 0x0},
611dd690bf8d81c9119a7228446be12e3366e202176carll                                     {10, 6, 0x0},
612dd690bf8d81c9119a7228446be12e3366e202176carll                                     {10, 5, 0x0},
613dd690bf8d81c9119a7228446be12e3366e202176carll                                     {10, 4, 0x0},
614dd690bf8d81c9119a7228446be12e3366e202176carll                                     {10, 7, 0x0},
615dd690bf8d81c9119a7228446be12e3366e202176carll                                     {10, 9, 0x0},
616dd690bf8d81c9119a7228446be12e3366e202176carll                                     {10, 11, 0x0},
617dd690bf8d81c9119a7228446be12e3366e202176carll                                     {12, 8, 0x0},
618dd690bf8d81c9119a7228446be12e3366e202176carll                                     {12, 14, 0x0},
619dd690bf8d81c9119a7228446be12e3366e202176carll                                     {12, 6, 0x0},
620dd690bf8d81c9119a7228446be12e3366e202176carll                                     {12, 5, 0x0},
621dd690bf8d81c9119a7228446be12e3366e202176carll                                     {12, 4, 0x0},
622dd690bf8d81c9119a7228446be12e3366e202176carll                                     {12, 7, 0x0},
623dd690bf8d81c9119a7228446be12e3366e202176carll                                     {12, 9, 0x0},
624dd690bf8d81c9119a7228446be12e3366e202176carll                                     {12, 11, 0x0},
625f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
626f34eb496099507090f26dcf94bb780da8b3894e5sewardj
627f34eb496099507090f26dcf94bb780da8b3894e5sewardjfp_test_args_t xsmuldp_tests[] = {
628dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 8, 0x0},
629dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 14, 0x0},
630dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 6, 0x0},
631dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 5, 0x0},
632dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 4, 0x0},
633dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 7, 0x0},
634dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 9, 0x0},
635dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 11, 0x0},
636dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 8, 0x0},
637dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 14, 0x0},
638dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 6, 0x0},
639dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 5, 0x0},
640dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 4, 0x0},
641dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 7, 0x0},
642dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 9, 0x0},
643dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 11, 0x0},
644dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 8, 0x0},
645dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 14, 0x0},
646dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 6, 0x0},
647dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 5, 0x0},
648dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 4, 0x0},
649dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 7, 0x0},
650dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 9, 0x0},
651dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 11, 0x0},
652dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 8, 0x0},
653dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 14, 0x0},
654dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 6, 0x0},
655dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 5, 0x0},
656dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 4, 0x0},
657dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 7, 0x0},
658dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 9, 0x0},
659dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 11, 0x0},
660dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 8, 0x0},
661dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 14, 0x0},
662dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 6, 0x0},
663dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 5, 0x0},
664dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 1, 0x0},
665dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 7, 0x0},
666dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 9, 0x0},
667dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 11, 0x0},
668dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 8, 0x0},
669dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 14, 0x0},
670dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 6, 0x0},
671dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 5, 0x0},
672dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 4, 0x0},
673dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 7, 0x0},
674dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 9, 0x0},
675dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 11, 0x0},
676dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 8, 0x0},
677dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 14, 0x0},
678dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 6, 0x0},
679dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 5, 0x0},
680dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 4, 0x0},
681dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 7, 0x0},
682dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 9, 0x0},
683dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 11, 0x0},
684dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 8, 0x0},
685dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 14, 0x0},
686dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 6, 0x0},
687dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 5, 0x0},
688dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 4, 0x0},
689dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 7, 0x0},
690dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 9, 0x0},
691dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 11, 0x0},
692f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
693f34eb496099507090f26dcf94bb780da8b3894e5sewardj
694f34eb496099507090f26dcf94bb780da8b3894e5sewardjfp_test_args_t xssubdp_tests[] = {
695dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 8, 0x0},
696dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 14, 0x0},
697dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 6, 0x0},
698dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 5, 0x0},
699dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 4, 0x0},
700dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 7, 0x0},
701dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 9, 0x0},
702dd690bf8d81c9119a7228446be12e3366e202176carll                                  {8, 11, 0x0},
703dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 8, 0x0},
704dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 14, 0x0},
705dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 6, 0x0},
706dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 5, 0x0},
707dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 4, 0x0},
708dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 7, 0x0},
709dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 9, 0x0},
710dd690bf8d81c9119a7228446be12e3366e202176carll                                  {14, 11, 0x0},
711dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 8, 0x0},
712dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 14, 0x0},
713dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 6, 0x0},
714dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 5, 0x0},
715dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 4, 0x0},
716dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 7, 0x0},
717dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 9, 0x0},
718dd690bf8d81c9119a7228446be12e3366e202176carll                                  {6, 11, 0x0},
719dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 8, 0x0},
720dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 14, 0x0},
721dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 6, 0x0},
722dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 5, 0x0},
723dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 4, 0x0},
724dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 7, 0x0},
725dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 9, 0x0},
726dd690bf8d81c9119a7228446be12e3366e202176carll                                  {5, 11, 0x0},
727dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 8, 0x0},
728dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 14, 0x0},
729dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 6, 0x0},
730dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 5, 0x0},
731dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 1, 0x0},
732dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 7, 0x0},
733dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 9, 0x0},
734dd690bf8d81c9119a7228446be12e3366e202176carll                                  {4, 11, 0x0},
735dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 8, 0x0},
736dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 14, 0x0},
737dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 6, 0x0},
738dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 5, 0x0},
739dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 4, 0x0},
740dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 7, 0x0},
741dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 9, 0x0},
742dd690bf8d81c9119a7228446be12e3366e202176carll                                  {7, 11, 0x0},
743dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 8, 0x0},
744dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 14, 0x0},
745dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 6, 0x0},
746dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 5, 0x0},
747dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 4, 0x0},
748dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 7, 0x0},
749dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 9, 0x0},
750dd690bf8d81c9119a7228446be12e3366e202176carll                                  {10, 11, 0x0},
751dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 8, 0x0},
752dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 14, 0x0},
753dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 6, 0x0},
754dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 5, 0x0},
755dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 4, 0x0},
756dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 7, 0x0},
757dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 9, 0x0},
758dd690bf8d81c9119a7228446be12e3366e202176carll                                  {12, 11, 0x0},
759f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
760f34eb496099507090f26dcf94bb780da8b3894e5sewardj
761f34eb496099507090f26dcf94bb780da8b3894e5sewardj
762f34eb496099507090f26dcf94bb780da8b3894e5sewardj
763f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic int nb_special_fargs;
764f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic double * spec_fargs;
765f34eb496099507090f26dcf94bb780da8b3894e5sewardj
766f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void build_special_fargs_table(void)
767f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
768f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* The special floating point values created below are for
769f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * use in the ftdiv tests for setting the fe_flag and fg_flag,
770f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * but they can also be used for other tests (e.g., xscmpudp).
771f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *
772f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Note that fl_flag is 'always '1' on ppc64 Linux.
773f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *
774f34eb496099507090f26dcf94bb780da8b3894e5sewardj  Entry  Sign Exp   fraction                  Special value
775f34eb496099507090f26dcf94bb780da8b3894e5sewardj   0      0   3fd   0x8000000000000ULL         Positive finite number
776f34eb496099507090f26dcf94bb780da8b3894e5sewardj   1      0   404   0xf000000000000ULL         ...
777f34eb496099507090f26dcf94bb780da8b3894e5sewardj   2      0   001   0x8000000b77501ULL         ...
778f34eb496099507090f26dcf94bb780da8b3894e5sewardj   3      0   7fe   0x800000000051bULL         ...
779f34eb496099507090f26dcf94bb780da8b3894e5sewardj   4      0   012   0x3214569900000ULL         ...
780f34eb496099507090f26dcf94bb780da8b3894e5sewardj   5      0   000   0x0000000000000ULL         +0.0 (+zero)
781f34eb496099507090f26dcf94bb780da8b3894e5sewardj   6      1   000   0x0000000000000ULL         -0.0 (-zero)
782f34eb496099507090f26dcf94bb780da8b3894e5sewardj   7      0   7ff   0x0000000000000ULL         +infinity
783f34eb496099507090f26dcf94bb780da8b3894e5sewardj   8      1   7ff   0x0000000000000ULL         -infinity
7848efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll   9      0   7ff   0x7FFFFFFFFFFFFULL         +SNaN
7858efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll   10     1   7ff   0x7FFFFFFFFFFFFULL         -SNaN
7868efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll   11     0   7ff   0x8000000000000ULL         +QNaN
7878efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll   12     1   7ff   0x8000000000000ULL         -QNaN
788f34eb496099507090f26dcf94bb780da8b3894e5sewardj   13     1   000   0x8340000078000ULL         Denormalized val (zero exp and non-zero fraction)
789f34eb496099507090f26dcf94bb780da8b3894e5sewardj   14     1   40d   0x0650f5a07b353ULL         Negative finite number
790f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
791f34eb496099507090f26dcf94bb780da8b3894e5sewardj
792f34eb496099507090f26dcf94bb780da8b3894e5sewardj   uint64_t mant;
793f34eb496099507090f26dcf94bb780da8b3894e5sewardj   uint16_t _exp;
794f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int s;
795f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int i = 0;
796f34eb496099507090f26dcf94bb780da8b3894e5sewardj
797f34eb496099507090f26dcf94bb780da8b3894e5sewardj   if (spec_fargs)
798f34eb496099507090f26dcf94bb780da8b3894e5sewardj      return;
799f34eb496099507090f26dcf94bb780da8b3894e5sewardj
800f34eb496099507090f26dcf94bb780da8b3894e5sewardj   spec_fargs = malloc( 16 * sizeof(double) );
801f34eb496099507090f26dcf94bb780da8b3894e5sewardj
802f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #0
803f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
804f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x3fd;
805f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x8000000000000ULL;
806f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
807f34eb496099507090f26dcf94bb780da8b3894e5sewardj
808f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #1
809f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
810f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x404;
811f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0xf000000000000ULL;
812f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
813f34eb496099507090f26dcf94bb780da8b3894e5sewardj
814f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* None of the ftdiv tests succeed.
815f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * FRA = value #0; FRB = value #1
816f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * ea_ = -2; e_b = 5
817f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 100
818f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
819f34eb496099507090f26dcf94bb780da8b3894e5sewardj
820f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /*************************************************
821f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *     fe_flag tests
822f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *
823f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *************************************************/
824f34eb496099507090f26dcf94bb780da8b3894e5sewardj
825f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fe_flag <- 1 if FRA is a NaN
826f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * FRA = value #9; FRB = value #1
827f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = 1024; e_b = 5
828f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 101
829f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
830f34eb496099507090f26dcf94bb780da8b3894e5sewardj
831f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fe_flag <- 1 if FRB is a NaN
832f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * FRA = value #1; FRB = value #12
833f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = 5; e_b = 1024
834f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 101
835f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
836f34eb496099507090f26dcf94bb780da8b3894e5sewardj
837f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fe_flag <- 1 if e_b <= -1022
838f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * FRA = value #0; FRB = value #2
839f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = -2; e_b = -1022
840f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 101
841f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *
842f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
843f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #2
844f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
845f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x001;
846f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x8000000b77501ULL;
847f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
848f34eb496099507090f26dcf94bb780da8b3894e5sewardj
849f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fe_flag <- 1 if e_b >= 1021
850f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * FRA = value #1; FRB = value #3
851f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = 5; e_b = 1023
852f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 101
853f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
854f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #3
855f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
856f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x7fe;
857f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x800000000051bULL;
858f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
859f34eb496099507090f26dcf94bb780da8b3894e5sewardj
860f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fe_flag <- 1 if FRA != 0 && e_a - e_b >= 1023
861f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Let FRA = value #3 and FRB be value #0.
862f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = 1023; e_b = -2
863f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 101
864f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
865f34eb496099507090f26dcf94bb780da8b3894e5sewardj
866f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fe_flag <- 1 if FRA != 0 && e_a - e_b <= -1023
867f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Let FRA = value #0 above and FRB be value #3 above
868f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = -2; e_b = 1023
869f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 101
870f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
871f34eb496099507090f26dcf94bb780da8b3894e5sewardj
872f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fe_flag <- 1 if FRA != 0 && e_a <= -970
873f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Let FRA = value #4 and FRB be value #0
874f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = -1005; e_b = -2
875f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 101
876f34eb496099507090f26dcf94bb780da8b3894e5sewardj   */
877f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #4
878f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
879f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x012;
880f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x3214569900000ULL;
881f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
882f34eb496099507090f26dcf94bb780da8b3894e5sewardj
883f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /*************************************************
884f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *     fg_flag tests
885f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *
886f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *************************************************/
887f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fg_flag <- 1 if FRA is an Infinity
888f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * NOTE: FRA = Inf also sets fe_flag
889f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Do two tests, using values #7 and #8 (+/- Inf) for FRA.
890f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Test 1:
891f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *   Let FRA be value #7 and FRB be value #1
892f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *   e_a = 1024; e_b = 5
893f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *   fl_flag || fg_flag || fe_flag = 111
894f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *
895f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Test 2:
896f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *   Let FRA be value #8 and FRB be value #1
897f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *   e_a = 1024; e_b = 5
898f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *   fl_flag || fg_flag || fe_flag = 111
899f34eb496099507090f26dcf94bb780da8b3894e5sewardj    *
900f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
901f34eb496099507090f26dcf94bb780da8b3894e5sewardj
902f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fg_flag <- 1 if FRB is an Infinity
903f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * NOTE: FRB = Inf also sets fe_flag
904f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Let FRA be value #1 and FRB be value #7
905f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = 5; e_b = 1024
906f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 111
907f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
908f34eb496099507090f26dcf94bb780da8b3894e5sewardj
909f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fg_flag <- 1 if FRB is denormalized
910f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * NOTE: e_b < -1022 ==> fe_flag <- 1
911f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Let FRA be value #0 and FRB be value #13
912f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * e_a = -2; e_b = -1023
913f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 111
914f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
915f34eb496099507090f26dcf94bb780da8b3894e5sewardj
916f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fg_flag <- 1 if FRB is +zero
917f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * NOTE: FRA = Inf also sets fe_flag
918f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Let FRA = val #5; FRB = val #5
919f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * ea_ = -1023; e_b = -1023
920f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 111
921f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
922f34eb496099507090f26dcf94bb780da8b3894e5sewardj
923f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* fg_flag <- 1 if FRB is -zero
924f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * NOTE: FRA = Inf also sets fe_flag
925f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * Let FRA = val #5; FRB = val #6
926f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * ea_ = -1023; e_b = -1023
927f34eb496099507090f26dcf94bb780da8b3894e5sewardj    * fl_flag || fg_flag || fe_flag = 111
928f34eb496099507090f26dcf94bb780da8b3894e5sewardj    */
929f34eb496099507090f26dcf94bb780da8b3894e5sewardj
930f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* Special values */
931f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* +0.0      : 0 0x000 0x0000000000000 */
932f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #5
933f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
934f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x000;
935f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x0000000000000ULL;
936f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
937f34eb496099507090f26dcf94bb780da8b3894e5sewardj
938f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* -0.0      : 1 0x000 0x0000000000000 */
939f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #6
940f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 1;
941f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x000;
942f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x0000000000000ULL;
943f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
944f34eb496099507090f26dcf94bb780da8b3894e5sewardj
945f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* +infinity : 0 0x7FF 0x0000000000000  */
946f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #7
947f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
948f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x7FF;
949f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x0000000000000ULL;
950f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
951f34eb496099507090f26dcf94bb780da8b3894e5sewardj
952f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* -infinity : 1 0x7FF 0x0000000000000 */
953f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #8
954f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 1;
955f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x7FF;
956f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x0000000000000ULL;
957f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
958f34eb496099507090f26dcf94bb780da8b3894e5sewardj
9598efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll   /* +SNaN     : 0 0x7FF 0x7FFFFFFFFFFFF */
960f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #9
961f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
962f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x7FF;
963f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x7FFFFFFFFFFFFULL;
964f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
965f34eb496099507090f26dcf94bb780da8b3894e5sewardj
9668efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll   /* -SNaN     : 1 0x7FF 0x7FFFFFFFFFFFF */
967f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #10
968f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 1;
969f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x7FF;
970f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x7FFFFFFFFFFFFULL;
971f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
972f34eb496099507090f26dcf94bb780da8b3894e5sewardj
9738efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll   /* +QNaN     : 0 0x7FF 0x8000000000000 */
974f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #11
975f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 0;
976f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x7FF;
977f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x8000000000000ULL;
978f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
979f34eb496099507090f26dcf94bb780da8b3894e5sewardj
9808efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll   /* -QNaN     : 1 0x7FF 0x8000000000000 */
981f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #12
982f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 1;
983f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x7FF;
984f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x8000000000000ULL;
985f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
986f34eb496099507090f26dcf94bb780da8b3894e5sewardj
987f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* denormalized value */
988f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #13
989f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 1;
990f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x000;
991f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x8340000078000ULL;
992f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
993f34eb496099507090f26dcf94bb780da8b3894e5sewardj
994f34eb496099507090f26dcf94bb780da8b3894e5sewardj   /* Negative finite number */
995f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // #14
996f34eb496099507090f26dcf94bb780da8b3894e5sewardj   s = 1;
997f34eb496099507090f26dcf94bb780da8b3894e5sewardj   _exp = 0x40d;
998f34eb496099507090f26dcf94bb780da8b3894e5sewardj   mant = 0x0650f5a07b353ULL;
999f34eb496099507090f26dcf94bb780da8b3894e5sewardj   register_farg(&spec_fargs[i++], s, _exp, mant);
1000f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1001f34eb496099507090f26dcf94bb780da8b3894e5sewardj   nb_special_fargs = i;
1002f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1003f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1004f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1005f34eb496099507090f26dcf94bb780da8b3894e5sewardjstruct test_table
1006f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1007f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t test_category;
1008f34eb496099507090f26dcf94bb780da8b3894e5sewardj   char * name;
1009f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1010f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1011f34eb496099507090f26dcf94bb780da8b3894e5sewardjstruct p7_fp_test
1012f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1013f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t test_func;
1014f34eb496099507090f26dcf94bb780da8b3894e5sewardj   const char *name;
1015f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int single;  // 1=single precision result; 0=double precision result
1016f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1017f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1018f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef enum {
1019f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VX_FP_CMP,
1020f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VX_FP_SMA,
1021f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VX_FP_SMS,
1022f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VX_FP_SNMA,
1023f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VX_FP_OTHER
1024f34eb496099507090f26dcf94bb780da8b3894e5sewardj} vx_fp_test_type;
1025f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1026f34eb496099507090f26dcf94bb780da8b3894e5sewardjstruct vx_fp_test
1027f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1028f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t test_func;
1029f34eb496099507090f26dcf94bb780da8b3894e5sewardj   const char *name;
1030f34eb496099507090f26dcf94bb780da8b3894e5sewardj   fp_test_args_t * targs;
1031f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int num_tests;
1032f34eb496099507090f26dcf94bb780da8b3894e5sewardj   vx_fp_test_type test_type;
1033f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1034f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1035f34eb496099507090f26dcf94bb780da8b3894e5sewardjstruct xs_conv_test
1036f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1037f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t test_func;
1038f34eb496099507090f26dcf94bb780da8b3894e5sewardj   const char *name;
1039f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int num_tests;
1040f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1041f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1042f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef enum {
1043f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VSX_LOAD =1,
1044f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VSX_LOAD_SPLAT,
1045f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VSX_STORE
1046f34eb496099507090f26dcf94bb780da8b3894e5sewardj} vsx_ldst_type;
1047f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1048f34eb496099507090f26dcf94bb780da8b3894e5sewardjstruct ldst_test
1049f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1050f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t test_func;
1051f34eb496099507090f26dcf94bb780da8b3894e5sewardj   const char *name;
1052f34eb496099507090f26dcf94bb780da8b3894e5sewardj   void * base_addr;
1053f34eb496099507090f26dcf94bb780da8b3894e5sewardj   uint32_t offset;
1054f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int num_words_to_process;
1055f34eb496099507090f26dcf94bb780da8b3894e5sewardj   vsx_ldst_type type;
1056f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1057f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1058f34eb496099507090f26dcf94bb780da8b3894e5sewardjtypedef enum {
1059f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VSX_AND = 1,
1060f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VSX_XOR,
1061f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VSX_ANDC,
1062f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VSX_OR,
1063f34eb496099507090f26dcf94bb780da8b3894e5sewardj   VSX_NOR
1064f34eb496099507090f26dcf94bb780da8b3894e5sewardj} vsx_log_op;
1065f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1066f34eb496099507090f26dcf94bb780da8b3894e5sewardjstruct vsx_logic_test
1067f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1068f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t test_func;
1069f34eb496099507090f26dcf94bb780da8b3894e5sewardj   const char *name;
1070f34eb496099507090f26dcf94bb780da8b3894e5sewardj   vsx_log_op op;
1071f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1072f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1073f34eb496099507090f26dcf94bb780da8b3894e5sewardjstruct vsx_move_test
1074f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1075f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t test_func;
1076f34eb496099507090f26dcf94bb780da8b3894e5sewardj   const char *name;
1077f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1078f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1079f34eb496099507090f26dcf94bb780da8b3894e5sewardjstruct vsx_permute_test
1080f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1081f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t test_func;
1082f34eb496099507090f26dcf94bb780da8b3894e5sewardj   const char *name;
1083f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned int xa[4];
1084f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned int xb[4];
1085f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1086f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1087f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic vector unsigned int vec_out, vec_inA, vec_inB;
1088f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1089f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_lxsdx(void)
1090f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1091f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("lxsdx          %x0, %1, %2" : "=wa" (vec_out): "b" (r14),"r" (r15));
1092f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1093f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1094f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void
1095f34eb496099507090f26dcf94bb780da8b3894e5sewardjtest_lxvd2x(void)
1096f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1097f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("lxvd2x          %x0, %1, %2" : "=wa" (vec_out): "b" (r14),"r" (r15));
1098f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1099f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1100f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_lxvdsx(void)
1101f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1102f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("lxvdsx          %x0, %1, %2" : "=wa" (vec_out): "b" (r14),"r" (r15));
1103f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1104f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1105f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_lxvw4x(void)
1106f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1107f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("lxvw4x          %x0, %1, %2" : "=wa" (vec_out): "b" (r14),"r" (r15));
1108f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1109f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1110f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_stxsdx(void)
1111f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1112f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("stxsdx          %x0, %1, %2" : : "wa" (vec_inA), "b" (r14),"r" (r15));
1113f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1114f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1115f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_stxvd2x(void)
1116f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1117f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("stxvd2x          %x0, %1, %2" : : "wa" (vec_inA), "b" (r14),"r" (r15));
1118f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1119f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1120f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_stxvw4x(void)
1121f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1122f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("stxvw4x          %x0, %1, %2" : : "wa" (vec_inA), "b" (r14),"r" (r15));
1123f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1124f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1125f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxlxor(void)
1126f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1127f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxlxor          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1128f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1129f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1130f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxlor(void)
1131f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1132f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxlor          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1133f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1134f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1135f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxlnor(void)
1136f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1137f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxlnor          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1138f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1139f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1140f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxland(void)
1141f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1142f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxland          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1143f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1144f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1145f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxlandc(void)
1146f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1147f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxlandc          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1148f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1149f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1150f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxmrghw(void)
1151f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1152f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxmrghw          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1153f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1154f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1155f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxmrglw(void)
1156f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1157f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxmrglw          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1158f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1159f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1160f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxpermdi_00(void)
1161f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1162f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxpermdi         %x0, %x1, %x2, 0x0" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1163f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1164f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1165f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxpermdi_01(void)
1166f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1167f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxpermdi         %x0, %x1, %x2, 0x1" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1168f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1169f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1170f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxpermdi_10(void)
1171f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1172f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxpermdi         %x0, %x1, %x2, 0x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1173f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1174f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1175f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxpermdi_11(void)
1176f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1177f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxpermdi         %x0, %x1, %x2, 0x3" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1178f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1179f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1180f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxsldwi_0(void)
1181f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1182f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxsldwi         %x0, %x1, %x2, 0" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1183f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1184f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1185f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxsldwi_1(void)
1186f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1187f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxsldwi         %x0, %x1, %x2, 1" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1188f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1189f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1190f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxsldwi_2(void)
1191f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1192f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxsldwi         %x0, %x1, %x2, 2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1193f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1194f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1195f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xxsldwi_3(void)
1196f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1197f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xxsldwi         %x0, %x1, %x2, 3" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1198f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1199f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1200f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_fcfids (void)
1201f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1202f34eb496099507090f26dcf94bb780da8b3894e5sewardj    __asm__ __volatile__ ("fcfids          %0, %1" : "=f" (f17): "d" (f14));
1203f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1204f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1205f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_fcfidus (void)
1206f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1207f34eb496099507090f26dcf94bb780da8b3894e5sewardj    __asm__ __volatile__ ("fcfidus          %0, %1" : "=f" (f17): "d" (f14));
1208f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1209f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1210f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_fcfidu (void)
1211f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1212f34eb496099507090f26dcf94bb780da8b3894e5sewardj    __asm__ __volatile__ ("fcfidu          %0, %1" : "=f" (f17): "d" (f14));
1213f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1214f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1215f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsabsdp (void)
1216f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1217f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xsabsdp          %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
1218f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1219f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1220f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xscpsgndp (void)
1221f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1222f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xscpsgndp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1223f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1224f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1225f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsnabsdp (void)
1226f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1227f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xsnabsdp          %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
1228f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1229f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1230f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsnegdp (void)
1231f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1232f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xsnegdp          %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
1233f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1234f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1235f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic int do_cmpudp;
1236f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xscmp (void)
1237f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1238f34eb496099507090f26dcf94bb780da8b3894e5sewardj   if (do_cmpudp)
1239f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("xscmpudp          cr1, %x0, %x1" : : "wa" (vec_inA),"wa" (vec_inB));
1240f34eb496099507090f26dcf94bb780da8b3894e5sewardj   else
1241f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("xscmpodp          cr1, %x0, %x1" : : "wa" (vec_inA),"wa" (vec_inB));
1242f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1243f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1244f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsadddp(void)
1245f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1246f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xsadddp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1247f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1248f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1249f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsdivdp(void)
1250f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1251f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xsdivdp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1252f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1253f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1254f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic int do_adp;
1255f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsmadd(void)
1256f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1257f34eb496099507090f26dcf94bb780da8b3894e5sewardj   if (do_adp)
1258f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("xsmaddadp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1259f34eb496099507090f26dcf94bb780da8b3894e5sewardj   else
1260f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("xsmaddmdp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1261f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1262f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1263f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsmsub(void)
1264f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1265f34eb496099507090f26dcf94bb780da8b3894e5sewardj   if (do_adp)
1266f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("xsmsubadp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1267f34eb496099507090f26dcf94bb780da8b3894e5sewardj   else
1268f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("xsmsubmdp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1269f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1270f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1271f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsnmadd(void)
1272f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1273f34eb496099507090f26dcf94bb780da8b3894e5sewardj   if (do_adp)
1274f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("xsnmaddadp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1275f34eb496099507090f26dcf94bb780da8b3894e5sewardj   else
1276f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("xsnmaddmdp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1277f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1278f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1279f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xsmuldp(void)
1280f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1281f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xsmuldp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1282f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1283f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1284f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xssubdp(void)
1285f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1286f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xssubdp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
1287f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1288f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1289f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xscvdpsxds (void)
1290f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1291f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xscvdpsxds          %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
1292f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1293f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1294f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xscvsxddp (void)
1295f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1296f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xscvsxddp          %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
1297f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1298f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1299f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xscvuxddp (void)
1300f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1301f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("xscvuxddp          %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
1302f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1303f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1304f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic unsigned int vstg[] __attribute__ ((aligned (16))) = { 0, 0, 0,0,
1305f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                              0, 0, 0, 0 };
1306f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1307f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define NUM_VSTG_INTS (sizeof vstg/sizeof vstg[0])
1308f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define NUM_VSTG_VECS (NUM_VSTG_INTS/4)
1309f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1310f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic unsigned int viargs[] __attribute__ ((aligned (16))) = { 0x01234567,
1311f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0x89abcdef,
1312f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0x00112233,
1313f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0x44556677,
1314f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0x8899aabb,
1315f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0x91929394,
1316f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0xa1a2a3a4,
1317f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0xb1b2b3b4,
1318f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0xc1c2c3c4,
1319f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0xd1d2d3d4,
1320f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                                                0x7a6b5d3e
1321f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1322f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define NUM_VIARGS_INTS (sizeof viargs/sizeof viargs[0])
1323f34eb496099507090f26dcf94bb780da8b3894e5sewardj#define NUM_VIARGS_VECS  (NUM_VIARGS_INTS/4)
1324f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1325f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic ldst_test_t ldst_tests[] = { { &test_lxsdx, "lxsdx", viargs, 0, 2, VSX_LOAD },
1326f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_lxsdx, "lxsdx", viargs, 4, 2, VSX_LOAD },
1327f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_lxvd2x, "lxvd2x", viargs, 0, 4, VSX_LOAD },
1328f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_lxvd2x, "lxvd2x", viargs, 4, 4, VSX_LOAD },
1329f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_lxvdsx, "lxvdsx", viargs, 0, 4, VSX_LOAD_SPLAT },
1330f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_lxvdsx, "lxvdsx", viargs, 4, 4, VSX_LOAD_SPLAT },
1331f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_lxvw4x, "lxvw4x", viargs, 0, 4, VSX_LOAD },
1332f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_lxvw4x, "lxvw4x", viargs, 4, 4, VSX_LOAD },
1333f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_stxsdx, "stxsdx", vstg, 0, 2, VSX_STORE },
1334f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_stxsdx, "stxsdx", vstg, 4, 2, VSX_STORE },
1335f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_stxvd2x, "stxvd2x", vstg, 0, 4, VSX_STORE },
1336f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_stxvd2x, "stxvd2x", vstg, 4, 4, VSX_STORE },
1337f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_stxvw4x, "stxvw4x", vstg, 0, 4, VSX_STORE },
1338f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_stxvw4x, "stxvw4x", vstg, 4, 4, VSX_STORE },
1339f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { NULL, NULL, NULL, 0, 0, 0 } };
1340f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1341f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic logic_test_t logic_tests[] = { { &test_xxlxor, "xxlxor", VSX_XOR },
1342f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                      { &test_xxlor, "xxlor", VSX_OR } ,
1343f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                      { &test_xxlnor, "xxlnor", VSX_NOR },
1344f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                      { &test_xxland, "xxland", VSX_AND },
1345f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                      { &test_xxlandc, "xxlandc", VSX_ANDC },
1346dd690bf8d81c9119a7228446be12e3366e202176carll                                      { NULL, NULL, 0}};
1347f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1348dd690bf8d81c9119a7228446be12e3366e202176carllstatic move_test_t move_tests[] = { { &test_xsabsdp, "xsabsdp" },
1349dd690bf8d81c9119a7228446be12e3366e202176carll                                    { &test_xscpsgndp, "xscpsgndp" },
1350dd690bf8d81c9119a7228446be12e3366e202176carll                                    { &test_xsnabsdp, "xsnabsdp" },
1351dd690bf8d81c9119a7228446be12e3366e202176carll                                    { &test_xsnegdp, "xsnegdp" },
1352dd690bf8d81c9119a7228446be12e3366e202176carll                                    { NULL, NULL }
1353f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1354f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1355f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1356f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic permute_test_t permute_tests[] =
1357f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1358f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxmrghw, "xxmrghw",
1359f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1360f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1361f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1362f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxmrghw, "xxmrghw",
1363f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x00112233, 0x44556677, 0x8899aabb, 0xccddeeff }, /* XA input */
1364f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XB input */
1365f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1366f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxmrglw, "xxmrglw",
1367f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1368f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1369f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1370f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxmrglw, "xxmrglw",
1371f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x00112233, 0x44556677, 0x8899aabb, 0xccddeeff}, /* XA input */
1372f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444}, /* XB input */
1373f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1374f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxpermdi_00, "xxpermdi DM=00",
1375f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1376f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1377f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1378f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxpermdi_01, "xxpermdi DM=01",
1379f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1380f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1381f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1382f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxpermdi_10, "xxpermdi DM=10",
1383f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1384f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1385f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1386f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxpermdi_11, "xxpermdi DM=11",
1387f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1388f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1389f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1390f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxsldwi_0, "xxsldwi SHW=0",
1391f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1392f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1393f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1394f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxsldwi_1, "xxsldwi SHW=1",
1395f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1396f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1397f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1398f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxsldwi_2, "xxsldwi SHW=2",
1399f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1400f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1401f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1402f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { &test_xxsldwi_3, "xxsldwi SHW=3",
1403f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x11111111, 0x22222222, 0x33333333, 0x44444444 }, /* XA input */
1404f34eb496099507090f26dcf94bb780da8b3894e5sewardj    { 0x55555555, 0x66666666, 0x77777777, 0x88888888 }, /* XB input */
1405f34eb496099507090f26dcf94bb780da8b3894e5sewardj  },
1406f34eb496099507090f26dcf94bb780da8b3894e5sewardj  { NULL, NULL }
1407f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1408f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1409f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic fp_test_t fp_tests[] = { { &test_fcfids, "fcfids", 1 },
1410f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                { &test_fcfidus, "fcfidus", 1 },
1411f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                { &test_fcfidu, "fcfidu", 1 },
1412f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                { NULL, NULL, 0 },
1413f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1414f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1415f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1416f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic vx_fp_test_t vx_fp_tests[] = {
1417f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_xscmp, "xscmp", xscmpX_tests, 64, VX_FP_CMP},
1418f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_xsadddp, "xsadddp", xsadddp_tests, 64, VX_FP_OTHER},
1419f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_xsdivdp, "xsdivdp", xsdivdp_tests, 64, VX_FP_OTHER},
1420f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_xsmadd, "xsmadd", xsmaddXdp_tests, 64, VX_FP_SMA},
1421f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_xsmsub, "xsmsub", xsmsubXdp_tests, 64, VX_FP_SMS},
1422f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_xsnmadd, "xsnmadd", xsnmaddXdp_tests, 64, VX_FP_SNMA},
1423f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { & test_xsmuldp, "xsmuldp", xsmuldp_tests, 64, VX_FP_OTHER},
1424f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { & test_xssubdp, "xssubdp", xssubdp_tests, 64, VX_FP_OTHER},
1425f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { NULL, NULL, NULL, 0, 0 }
1426f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1427f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1428f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic xs_conv_test_t xs_conv_tests[] = {
1429dd690bf8d81c9119a7228446be12e3366e202176carll                                         { &test_xscvdpsxds, "xscvdpsxds", 15},
1430dd690bf8d81c9119a7228446be12e3366e202176carll                                         { &test_xscvsxddp, "xscvsxddp", 15},
1431dd690bf8d81c9119a7228446be12e3366e202176carll                                         { &test_xscvuxddp, "xscvuxddp", 15},
1432dd690bf8d81c9119a7228446be12e3366e202176carll                                         { NULL, NULL, 0}
1433f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
1434f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1435f34eb496099507090f26dcf94bb780da8b3894e5sewardj#ifdef __powerpc64__
1436f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_ldbrx(void)
1437f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1438dd690bf8d81c9119a7228446be12e3366e202176carll   int i;
1439f34eb496099507090f26dcf94bb780da8b3894e5sewardj   HWord_t reg_out;
1440f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned char * byteIn, * byteOut;
1441f34eb496099507090f26dcf94bb780da8b3894e5sewardj   r14 = (HWord_t)viargs;
1442f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // Just try the instruction an arbitrary number of times at different r15 offsets.
1443f34eb496099507090f26dcf94bb780da8b3894e5sewardj   for (i = 0; i < 3; i++) {
1444f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int j, k;
1445f34eb496099507090f26dcf94bb780da8b3894e5sewardj      reg_out = 0;
1446f34eb496099507090f26dcf94bb780da8b3894e5sewardj      r15 = i * 4;
1447f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("ldbrx          %0, %1, %2" : "=r" (reg_out): "b" (r14),"r" (r15));
1448f34eb496099507090f26dcf94bb780da8b3894e5sewardj      byteIn = ((unsigned char *)(r14 + r15));
1449f34eb496099507090f26dcf94bb780da8b3894e5sewardj      byteOut = (unsigned char *)&reg_out;
1450f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1451f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf("ldbrx:");
1452dd690bf8d81c9119a7228446be12e3366e202176carll      for (k = 0; k < 8; k++) {
1453f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf( " %02x", (byteIn[k]));
1454f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1455f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf(" (reverse) =>");
1456f34eb496099507090f26dcf94bb780da8b3894e5sewardj      for (j = 0; j < 8; j++) {
1457f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf( " %02x", (byteOut[j]));
1458f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1459f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf("\n");
1460f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1461f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "\n" );
1462f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1463f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1464f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void
1465f34eb496099507090f26dcf94bb780da8b3894e5sewardjtest_popcntd(void)
1466f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1467f34eb496099507090f26dcf94bb780da8b3894e5sewardj   uint64_t res;
1468f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned long long src = 0x9182736405504536ULL;
1469f34eb496099507090f26dcf94bb780da8b3894e5sewardj   r14 = src;
1470f34eb496099507090f26dcf94bb780da8b3894e5sewardj   __asm__ __volatile__ ("popcntd          %0, %1" : "=r" (res): "r" (r14));
1471f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf("popcntd: 0x%llx => %d\n", src, (int)res);
1472f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "\n" );
1473f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1474f34eb496099507090f26dcf94bb780da8b3894e5sewardj#endif
1475f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1476f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void
1477f34eb496099507090f26dcf94bb780da8b3894e5sewardjtest_lfiwzx(void)
1478f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1479f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned int i;
1480f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned int * src;
1481f34eb496099507090f26dcf94bb780da8b3894e5sewardj   uint64_t reg_out;
1482f34eb496099507090f26dcf94bb780da8b3894e5sewardj   r14 = (HWord_t)viargs;
1483f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // Just try the instruction an arbitrary number of times at different r15 offsets.
1484f34eb496099507090f26dcf94bb780da8b3894e5sewardj   for (i = 0; i < 3; i++) {
1485f34eb496099507090f26dcf94bb780da8b3894e5sewardj      reg_out = 0;
1486f34eb496099507090f26dcf94bb780da8b3894e5sewardj      r15 = i * 4;
1487f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("lfiwzx          %0, %1, %2" : "=d" (reg_out): "b" (r14),"r" (r15));
1488f34eb496099507090f26dcf94bb780da8b3894e5sewardj      src = ((unsigned int *)(r14 + r15));
1489f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf("lfiwzx: %u => %llu.00\n", *src, (unsigned long long)reg_out);
1490f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1491f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1492f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "\n" );
1493f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1494f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1495f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_vx_fp_ops(void)
1496f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1497f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1498f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t func;
1499f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int k;
1500f34eb496099507090f26dcf94bb780da8b3894e5sewardj   char * test_name = (char *)malloc(20);
1501f34eb496099507090f26dcf94bb780da8b3894e5sewardj   k = 0;
1502f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1503f34eb496099507090f26dcf94bb780da8b3894e5sewardj   build_special_fargs_table();
1504f34eb496099507090f26dcf94bb780da8b3894e5sewardj   while ((func = vx_fp_tests[k].test_func)) {
1505f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int i, condreg, repeat = 0;
1506f34eb496099507090f26dcf94bb780da8b3894e5sewardj      unsigned int flags;
1507f34eb496099507090f26dcf94bb780da8b3894e5sewardj      unsigned long long * frap, * frbp, * dst;
1508f34eb496099507090f26dcf94bb780da8b3894e5sewardj      vx_fp_test_t test_group = vx_fp_tests[k];
1509f34eb496099507090f26dcf94bb780da8b3894e5sewardj      vx_fp_test_type test_type = test_group.test_type;
1510f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1511f34eb496099507090f26dcf94bb780da8b3894e5sewardj      switch (test_type) {
1512f34eb496099507090f26dcf94bb780da8b3894e5sewardj         case VX_FP_CMP:
1513f34eb496099507090f26dcf94bb780da8b3894e5sewardj            strcpy(test_name, "xscmp");
1514f34eb496099507090f26dcf94bb780da8b3894e5sewardj            if (!repeat) {
1515f34eb496099507090f26dcf94bb780da8b3894e5sewardj               repeat = 1;
1516f34eb496099507090f26dcf94bb780da8b3894e5sewardj               strcat(test_name, "udp");
1517f34eb496099507090f26dcf94bb780da8b3894e5sewardj               do_cmpudp = 1;
1518f34eb496099507090f26dcf94bb780da8b3894e5sewardj            }
1519f34eb496099507090f26dcf94bb780da8b3894e5sewardj            break;
1520f34eb496099507090f26dcf94bb780da8b3894e5sewardj         case VX_FP_SMA:
1521f34eb496099507090f26dcf94bb780da8b3894e5sewardj         case VX_FP_SMS:
1522f34eb496099507090f26dcf94bb780da8b3894e5sewardj         case VX_FP_SNMA:
1523f34eb496099507090f26dcf94bb780da8b3894e5sewardj            if (test_type == VX_FP_SMA)
1524f34eb496099507090f26dcf94bb780da8b3894e5sewardj               strcpy(test_name, "xsmadd");
1525f34eb496099507090f26dcf94bb780da8b3894e5sewardj            else if (test_type == VX_FP_SMS)
1526f34eb496099507090f26dcf94bb780da8b3894e5sewardj               strcpy(test_name, "xsmsub");
1527f34eb496099507090f26dcf94bb780da8b3894e5sewardj            else
1528f34eb496099507090f26dcf94bb780da8b3894e5sewardj               strcpy(test_name, "xsnmadd");
1529f34eb496099507090f26dcf94bb780da8b3894e5sewardj            if (!repeat) {
1530f34eb496099507090f26dcf94bb780da8b3894e5sewardj               repeat = 1;
1531f34eb496099507090f26dcf94bb780da8b3894e5sewardj               strcat(test_name, "adp");
1532f34eb496099507090f26dcf94bb780da8b3894e5sewardj               do_adp = 1;
1533f34eb496099507090f26dcf94bb780da8b3894e5sewardj            }
1534f34eb496099507090f26dcf94bb780da8b3894e5sewardj            break;
1535f34eb496099507090f26dcf94bb780da8b3894e5sewardj         case VX_FP_OTHER:
1536f34eb496099507090f26dcf94bb780da8b3894e5sewardj            strcpy(test_name, test_group.name);
1537f34eb496099507090f26dcf94bb780da8b3894e5sewardj            break;
1538f34eb496099507090f26dcf94bb780da8b3894e5sewardj         default:
1539f34eb496099507090f26dcf94bb780da8b3894e5sewardj            printf("ERROR:  Invalid VX FP test type %d\n", test_type);
1540f34eb496099507090f26dcf94bb780da8b3894e5sewardj            exit(1);
1541f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1542f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1543f34eb496099507090f26dcf94bb780da8b3894e5sewardjagain:
1544f34eb496099507090f26dcf94bb780da8b3894e5sewardj      for (i = 0; i < test_group.num_tests; i++) {
1545f34eb496099507090f26dcf94bb780da8b3894e5sewardj         unsigned int * inA, * inB, * pv;
1546dd690bf8d81c9119a7228446be12e3366e202176carll         double * dpA = (double *)&vec_inA;
1547dd690bf8d81c9119a7228446be12e3366e202176carll         double * dpB = (double *)&vec_inB;
1548dd690bf8d81c9119a7228446be12e3366e202176carll         double * dpT = (double *)&vec_out;
1549f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1550f34eb496099507090f26dcf94bb780da8b3894e5sewardj         fp_test_args_t aTest = test_group.targs[i];
1551f34eb496099507090f26dcf94bb780da8b3894e5sewardj         inA = (unsigned int *)&spec_fargs[aTest.fra_idx];
1552f34eb496099507090f26dcf94bb780da8b3894e5sewardj         inB = (unsigned int *)&spec_fargs[aTest.frb_idx];
1553f34eb496099507090f26dcf94bb780da8b3894e5sewardj         frap = (unsigned long long *)&spec_fargs[aTest.fra_idx];
1554f34eb496099507090f26dcf94bb780da8b3894e5sewardj         frbp = (unsigned long long *)&spec_fargs[aTest.frb_idx];
1555f34eb496099507090f26dcf94bb780da8b3894e5sewardj         // Only need to copy one doubleword into each vector's element 0
1556dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE) {
1557dd690bf8d81c9119a7228446be12e3366e202176carll            // With LE, vector element 0 is the second doubleword from the left
1558dd690bf8d81c9119a7228446be12e3366e202176carll            memset(dpA, 0, 8);
1559dd690bf8d81c9119a7228446be12e3366e202176carll            memset(dpB, 0, 8);
1560dd690bf8d81c9119a7228446be12e3366e202176carll            dpA++;
1561dd690bf8d81c9119a7228446be12e3366e202176carll            dpB++;
1562dd690bf8d81c9119a7228446be12e3366e202176carll         }
1563dd690bf8d81c9119a7228446be12e3366e202176carll         memcpy(dpA, inA, 8);
1564dd690bf8d81c9119a7228446be12e3366e202176carll         memcpy(dpB, inB, 8);
1565f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1566f34eb496099507090f26dcf94bb780da8b3894e5sewardj         switch (test_type) {
1567f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_CMP:
1568f34eb496099507090f26dcf94bb780da8b3894e5sewardj               SET_FPSCR_ZERO;
1569f34eb496099507090f26dcf94bb780da8b3894e5sewardj               SET_CR_XER_ZERO;
1570f34eb496099507090f26dcf94bb780da8b3894e5sewardj               (*func)();
1571f34eb496099507090f26dcf94bb780da8b3894e5sewardj               GET_CR(flags);
1572f34eb496099507090f26dcf94bb780da8b3894e5sewardj               condreg = (flags & 0x0f000000) >> 24;
1573f34eb496099507090f26dcf94bb780da8b3894e5sewardj               printf("#%d: %s %016llx <=> %016llx ? %x (CRx)\n", i, test_name, *frap, *frbp, condreg);
1574f34eb496099507090f26dcf94bb780da8b3894e5sewardj              // printf("\tFRA: %e;  FRB: %e\n", spec_fargs[aTest.fra_idx], spec_fargs[aTest.frb_idx]);
1575f34eb496099507090f26dcf94bb780da8b3894e5sewardj               if ( condreg != aTest.cr_flags) {
1576f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  printf("Error: Expected CR flags 0x%x; actual flags: 0x%x\n", aTest.cr_flags, condreg);
1577f34eb496099507090f26dcf94bb780da8b3894e5sewardj               }
1578f34eb496099507090f26dcf94bb780da8b3894e5sewardj               break;
1579f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_SMA:
1580f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_SMS:
1581f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_SNMA:
1582f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_OTHER:
1583f34eb496099507090f26dcf94bb780da8b3894e5sewardj            {
1584f34eb496099507090f26dcf94bb780da8b3894e5sewardj               int idx;
1585f34eb496099507090f26dcf94bb780da8b3894e5sewardj               unsigned long long vsr_XT;
1586f34eb496099507090f26dcf94bb780da8b3894e5sewardj               pv = (unsigned int *)&vec_out;
1587f34eb496099507090f26dcf94bb780da8b3894e5sewardj               // clear vec_out
1588f34eb496099507090f26dcf94bb780da8b3894e5sewardj               for (idx = 0; idx < 4; idx++, pv++)
1589f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  *pv = 0;
1590f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1591f34eb496099507090f26dcf94bb780da8b3894e5sewardj               if (test_type != VX_FP_OTHER) {
1592f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  /* Then we need a third src argument, which is stored in element 0 of
1593f34eb496099507090f26dcf94bb780da8b3894e5sewardj                   * VSX[XT] -- i.e., vec_out.  For the xs<ZZZ>mdp cases, VSX[XT] holds
1594f34eb496099507090f26dcf94bb780da8b3894e5sewardj                   * src3 and VSX[XB] holds src2; for the xs<ZZZ>adp cases, VSX[XT] holds
1595f34eb496099507090f26dcf94bb780da8b3894e5sewardj                   * src2 and VSX[XB] holds src3.  The fp_test_args_t that holds the test
1596dd690bf8d81c9119a7228446be12e3366e202176carll                   * data (input args) contain only two inputs, so I arbitrarily
1597f34eb496099507090f26dcf94bb780da8b3894e5sewardj                   * use spec_fargs elements 4 and 14 (alternating) for the third source
1598f34eb496099507090f26dcf94bb780da8b3894e5sewardj                   * argument.  We can use the same input data for a given pair of
1599f34eb496099507090f26dcf94bb780da8b3894e5sewardj                   * adp/mdp-type instructions by swapping the src2 and src3 arguments; thus
1600f34eb496099507090f26dcf94bb780da8b3894e5sewardj                   * the expected result should be the same.
1601f34eb496099507090f26dcf94bb780da8b3894e5sewardj                   */
1602f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  int extra_arg_idx;
1603f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  if (i % 2)
1604f34eb496099507090f26dcf94bb780da8b3894e5sewardj                     extra_arg_idx = 4;
1605f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  else
1606f34eb496099507090f26dcf94bb780da8b3894e5sewardj                     extra_arg_idx = 14;
1607f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1608f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  if (repeat) {
1609f34eb496099507090f26dcf94bb780da8b3894e5sewardj                     /* We're on the first time through of one of the VX_FP_SMx
1610f34eb496099507090f26dcf94bb780da8b3894e5sewardj                      * test types, meaning we're testing a xs<ZZZ>adp case, thus we
1611f34eb496099507090f26dcf94bb780da8b3894e5sewardj                      * have to swap inputs as described above:
1612f34eb496099507090f26dcf94bb780da8b3894e5sewardj                      *    src2 <= VSX[XT]
1613f34eb496099507090f26dcf94bb780da8b3894e5sewardj                      *    src3 <= VSX[XB]
1614f34eb496099507090f26dcf94bb780da8b3894e5sewardj                      */
1615dd690bf8d81c9119a7228446be12e3366e202176carll                     if (isLE)
1616dd690bf8d81c9119a7228446be12e3366e202176carll                        dpT++;
1617dd690bf8d81c9119a7228446be12e3366e202176carll                     memcpy(dpT, inB, 8);  // src2
1618dd690bf8d81c9119a7228446be12e3366e202176carll                     memcpy(dpB, &spec_fargs[extra_arg_idx], 8);  //src3
1619f34eb496099507090f26dcf94bb780da8b3894e5sewardj                     frbp = (unsigned long long *)&spec_fargs[extra_arg_idx];
1620f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  } else {
1621f34eb496099507090f26dcf94bb780da8b3894e5sewardj                     // Don't need to init src2, as it's done before the switch()
1622dd690bf8d81c9119a7228446be12e3366e202176carll                     if (isLE)
1623dd690bf8d81c9119a7228446be12e3366e202176carll                        dpT++;
1624dd690bf8d81c9119a7228446be12e3366e202176carll                     memcpy(dpT, &spec_fargs[extra_arg_idx], 8);  //src3
1625f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  }
1626dd690bf8d81c9119a7228446be12e3366e202176carll                  memcpy(&vsr_XT, dpT, 8);
1627f34eb496099507090f26dcf94bb780da8b3894e5sewardj               }
1628f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1629f34eb496099507090f26dcf94bb780da8b3894e5sewardj               (*func)();
1630f34eb496099507090f26dcf94bb780da8b3894e5sewardj               dst = (unsigned long long *) &vec_out;
1631dd690bf8d81c9119a7228446be12e3366e202176carll               if (isLE)
1632dd690bf8d81c9119a7228446be12e3366e202176carll                  dst++;
1633f34eb496099507090f26dcf94bb780da8b3894e5sewardj               if (test_type == VX_FP_OTHER)
1634f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  printf("#%d: %s %016llx %016llx = %016llx\n", i, test_name, *frap, *frbp, *dst);
1635f34eb496099507090f26dcf94bb780da8b3894e5sewardj               else
1636f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  printf( "#%d: %s %016llx %016llx %016llx = %016llx\n", i,
1637f34eb496099507090f26dcf94bb780da8b3894e5sewardj                          test_name, vsr_XT, *frap, *frbp, *dst );
1638f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1639f34eb496099507090f26dcf94bb780da8b3894e5sewardj               /*
1640f34eb496099507090f26dcf94bb780da8b3894e5sewardj              {
1641f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  // Debug code.  Keep this block commented out except when debugging.
1642f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  double result, expected;
1643f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  memcpy(&result, dst, 8);
1644f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  memcpy(&expected, &aTest.dp_bin_result, 8);
1645f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  printf( "\tFRA + FRB: %e + %e: Expected = %e; Actual = %e\n",
1646f34eb496099507090f26dcf94bb780da8b3894e5sewardj                          spec_fargs[aTest.fra_idx], spec_fargs[aTest.frb_idx],
1647f34eb496099507090f26dcf94bb780da8b3894e5sewardj                          expected, result );
1648f34eb496099507090f26dcf94bb780da8b3894e5sewardj               }
1649f34eb496099507090f26dcf94bb780da8b3894e5sewardj              */
1650f34eb496099507090f26dcf94bb780da8b3894e5sewardj               break;
1651f34eb496099507090f26dcf94bb780da8b3894e5sewardj            }
1652f34eb496099507090f26dcf94bb780da8b3894e5sewardj         }
1653f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1654f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1655f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1656f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "\n" );
1657f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1658f34eb496099507090f26dcf94bb780da8b3894e5sewardj      if (repeat) {
1659f34eb496099507090f26dcf94bb780da8b3894e5sewardj         repeat = 0;
1660f34eb496099507090f26dcf94bb780da8b3894e5sewardj         switch (test_type) {
1661f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_CMP:
1662f34eb496099507090f26dcf94bb780da8b3894e5sewardj               strcpy(test_name, "xscmp");
1663f34eb496099507090f26dcf94bb780da8b3894e5sewardj               strcat(test_name, "odp");
1664f34eb496099507090f26dcf94bb780da8b3894e5sewardj               do_cmpudp = 0;
1665f34eb496099507090f26dcf94bb780da8b3894e5sewardj               break;
1666f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_SMA:
1667f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_SMS:
1668f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_SNMA:
1669f34eb496099507090f26dcf94bb780da8b3894e5sewardj               if (test_type == VX_FP_SMA)
1670f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  strcpy(test_name, "xsmadd");
1671f34eb496099507090f26dcf94bb780da8b3894e5sewardj               else if (test_type == VX_FP_SMS)
1672f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  strcpy(test_name, "xsmsub");
1673f34eb496099507090f26dcf94bb780da8b3894e5sewardj               else
1674f34eb496099507090f26dcf94bb780da8b3894e5sewardj                  strcpy(test_name, "xsnmadd");
1675f34eb496099507090f26dcf94bb780da8b3894e5sewardj               strcat(test_name, "mdp");
1676f34eb496099507090f26dcf94bb780da8b3894e5sewardj               do_adp = 0;
1677f34eb496099507090f26dcf94bb780da8b3894e5sewardj               break;
1678f34eb496099507090f26dcf94bb780da8b3894e5sewardj            case VX_FP_OTHER:
1679f34eb496099507090f26dcf94bb780da8b3894e5sewardj               break;
1680f34eb496099507090f26dcf94bb780da8b3894e5sewardj         }
1681f34eb496099507090f26dcf94bb780da8b3894e5sewardj         goto again;
1682f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1683f34eb496099507090f26dcf94bb780da8b3894e5sewardj      k++;
1684f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1685f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "\n" );
1686f34eb496099507090f26dcf94bb780da8b3894e5sewardj   free(test_name);
1687f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1688f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1689f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_xs_conv_ops(void)
1690f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1691f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1692f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t func;
1693f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int k = 0;
1694dd690bf8d81c9119a7228446be12e3366e202176carll   double * dpB = (double *)&vec_inB;
1695dd690bf8d81c9119a7228446be12e3366e202176carll   if (isLE) {
1696dd690bf8d81c9119a7228446be12e3366e202176carll      memset(dpB, 0, 8);
1697dd690bf8d81c9119a7228446be12e3366e202176carll      dpB++;
1698dd690bf8d81c9119a7228446be12e3366e202176carll   }
1699f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1700f34eb496099507090f26dcf94bb780da8b3894e5sewardj   build_special_fargs_table();
1701f34eb496099507090f26dcf94bb780da8b3894e5sewardj   while ((func = xs_conv_tests[k].test_func)) {
1702f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int i;
1703f34eb496099507090f26dcf94bb780da8b3894e5sewardj      unsigned long long * frbp, * dst;
1704f34eb496099507090f26dcf94bb780da8b3894e5sewardj      xs_conv_test_t test_group = xs_conv_tests[k];
1705f34eb496099507090f26dcf94bb780da8b3894e5sewardj      for (i = 0; i < test_group.num_tests; i++) {
1706f34eb496099507090f26dcf94bb780da8b3894e5sewardj         unsigned int * inB, * pv;
1707f34eb496099507090f26dcf94bb780da8b3894e5sewardj         int idx;
1708f34eb496099507090f26dcf94bb780da8b3894e5sewardj         inB = (unsigned int *)&spec_fargs[i];
1709f34eb496099507090f26dcf94bb780da8b3894e5sewardj         frbp = (unsigned long long *)&spec_fargs[i];
1710dd690bf8d81c9119a7228446be12e3366e202176carll
1711dd690bf8d81c9119a7228446be12e3366e202176carll         memcpy(dpB, inB, 8);
1712f34eb496099507090f26dcf94bb780da8b3894e5sewardj         pv = (unsigned int *)&vec_out;
1713f34eb496099507090f26dcf94bb780da8b3894e5sewardj         // clear vec_out
1714f34eb496099507090f26dcf94bb780da8b3894e5sewardj         for (idx = 0; idx < 4; idx++, pv++)
1715f34eb496099507090f26dcf94bb780da8b3894e5sewardj            *pv = 0;
1716f34eb496099507090f26dcf94bb780da8b3894e5sewardj         (*func)();
1717f34eb496099507090f26dcf94bb780da8b3894e5sewardj         dst = (unsigned long long *) &vec_out;
1718dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE)
1719dd690bf8d81c9119a7228446be12e3366e202176carll            dst++;
1720f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf("#%d: %s %016llx => %016llx\n", i, test_group.name, *frbp, *dst);
1721f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1722f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1723f34eb496099507090f26dcf94bb780da8b3894e5sewardj      k++;
1724f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf("\n");
1725f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1726f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "\n" );
1727f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1728f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1729f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void do_load_test(ldst_test_t loadTest)
1730f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1731f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t func;
1732f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned int *src, *dst;
1733f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int splat = loadTest.type == VSX_LOAD_SPLAT ? 1: 0;
1734dd690bf8d81c9119a7228446be12e3366e202176carll   int i, j, m, k;
1735f34eb496099507090f26dcf94bb780da8b3894e5sewardj   i = j = 0;
1736f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1737f34eb496099507090f26dcf94bb780da8b3894e5sewardj   func = loadTest.test_func;
1738f34eb496099507090f26dcf94bb780da8b3894e5sewardj   for (i = 0, r14 = (HWord_t) loadTest.base_addr; i < NUM_VIARGS_VECS; i++) {
1739f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int again;
1740f34eb496099507090f26dcf94bb780da8b3894e5sewardj      j = 0;
1741f34eb496099507090f26dcf94bb780da8b3894e5sewardj       r14 += i * 16;
1742f34eb496099507090f26dcf94bb780da8b3894e5sewardj      do {
1743f34eb496099507090f26dcf94bb780da8b3894e5sewardj         unsigned int * pv = (unsigned int *)&vec_out;
1744f34eb496099507090f26dcf94bb780da8b3894e5sewardj         int idx;
1745f34eb496099507090f26dcf94bb780da8b3894e5sewardj         // clear vec_out
1746f34eb496099507090f26dcf94bb780da8b3894e5sewardj         for (idx = 0; idx < 4; idx++, pv+=idx)
1747f34eb496099507090f26dcf94bb780da8b3894e5sewardj            *pv = 0;
1748f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1749f34eb496099507090f26dcf94bb780da8b3894e5sewardj         again = 0;
1750f34eb496099507090f26dcf94bb780da8b3894e5sewardj         r15 = j;
1751f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1752f34eb496099507090f26dcf94bb780da8b3894e5sewardj         // execute test insn
1753f34eb496099507090f26dcf94bb780da8b3894e5sewardj         (*func)();
1754f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1755f34eb496099507090f26dcf94bb780da8b3894e5sewardj         src = (unsigned int*) (((unsigned char *)r14) + j);
1756f34eb496099507090f26dcf94bb780da8b3894e5sewardj         dst = (unsigned int*) &vec_out;
1757f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1758f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf( "%s:", loadTest.name);
1759f34eb496099507090f26dcf94bb780da8b3894e5sewardj         for (m = 0; m < loadTest.num_words_to_process; m++) {
1760f34eb496099507090f26dcf94bb780da8b3894e5sewardj            printf( " %08x", src[splat ? m % 2 : m]);
1761f34eb496099507090f26dcf94bb780da8b3894e5sewardj         }
1762f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf( " =>");
1763dd690bf8d81c9119a7228446be12e3366e202176carll         m = 0;
1764dd690bf8d81c9119a7228446be12e3366e202176carll         k = loadTest.num_words_to_process;
1765dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE) {
1766dd690bf8d81c9119a7228446be12e3366e202176carll            if (loadTest.num_words_to_process == 2) {
1767dd690bf8d81c9119a7228446be12e3366e202176carll               m = 2;
1768dd690bf8d81c9119a7228446be12e3366e202176carll               k += 2;
1769dd690bf8d81c9119a7228446be12e3366e202176carll            }
1770f34eb496099507090f26dcf94bb780da8b3894e5sewardj         }
1771f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1772dd690bf8d81c9119a7228446be12e3366e202176carll         for (; m < k; m++) {
1773dd690bf8d81c9119a7228446be12e3366e202176carll            printf( " %08x", dst[m]);
1774f34eb496099507090f26dcf94bb780da8b3894e5sewardj         }
1775dd690bf8d81c9119a7228446be12e3366e202176carll         printf("\n");
1776f34eb496099507090f26dcf94bb780da8b3894e5sewardj         if (j == 0 && loadTest.offset) {
1777f34eb496099507090f26dcf94bb780da8b3894e5sewardj            again = 1;
1778f34eb496099507090f26dcf94bb780da8b3894e5sewardj            j += loadTest.offset;
1779f34eb496099507090f26dcf94bb780da8b3894e5sewardj         }
1780f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1781f34eb496099507090f26dcf94bb780da8b3894e5sewardj      while (again);
1782f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1783f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1784f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1785f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void
1786f34eb496099507090f26dcf94bb780da8b3894e5sewardjdo_store_test ( ldst_test_t storeTest )
1787f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1788f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t func;
1789f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned int *src, *dst;
1790dd690bf8d81c9119a7228446be12e3366e202176carll   int m;
1791f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1792f34eb496099507090f26dcf94bb780da8b3894e5sewardj   func = storeTest.test_func;
1793f34eb496099507090f26dcf94bb780da8b3894e5sewardj   r14 = (HWord_t) storeTest.base_addr;
1794f34eb496099507090f26dcf94bb780da8b3894e5sewardj   r15 = (HWord_t) storeTest.offset;
1795f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned int * pv = (unsigned int *) storeTest.base_addr;
1796f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int idx;
1797f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // clear out storage destination
1798f34eb496099507090f26dcf94bb780da8b3894e5sewardj   for (idx = 0; idx < 4; idx++, pv += idx)
1799f34eb496099507090f26dcf94bb780da8b3894e5sewardj      *pv = 0;
1800f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1801f34eb496099507090f26dcf94bb780da8b3894e5sewardj   memcpy(&vec_inA, &viargs[0], sizeof(vector unsigned char));
1802f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1803f34eb496099507090f26dcf94bb780da8b3894e5sewardj   // execute test insn
1804f34eb496099507090f26dcf94bb780da8b3894e5sewardj   (*func)();
1805f34eb496099507090f26dcf94bb780da8b3894e5sewardj   src = &viargs[0];
1806f34eb496099507090f26dcf94bb780da8b3894e5sewardj   dst = (unsigned int*) (((unsigned char *) r14) + storeTest.offset);
1807f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1808f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "%s:", storeTest.name );
1809f34eb496099507090f26dcf94bb780da8b3894e5sewardj   for (m = 0; m < storeTest.num_words_to_process; m++) {
1810f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( " %08x", src[m] );
1811f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1812f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( " =>" );
1813f34eb496099507090f26dcf94bb780da8b3894e5sewardj   for (m = 0; m < storeTest.num_words_to_process; m++) {
1814f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( " %08x", dst[m] );
1815f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1816f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "\n" );
1817f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1818f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1819f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1820f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_ldst(void)
1821f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1822f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int k = 0;
1823f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1824f34eb496099507090f26dcf94bb780da8b3894e5sewardj   while (ldst_tests[k].test_func) {
1825f34eb496099507090f26dcf94bb780da8b3894e5sewardj      if (ldst_tests[k].type == VSX_STORE)
1826f34eb496099507090f26dcf94bb780da8b3894e5sewardj         do_store_test(ldst_tests[k]);
1827f34eb496099507090f26dcf94bb780da8b3894e5sewardj      else
1828f34eb496099507090f26dcf94bb780da8b3894e5sewardj         do_load_test(ldst_tests[k]);
1829f34eb496099507090f26dcf94bb780da8b3894e5sewardj      k++;
1830f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf("\n");
1831f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1832f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1833f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1834f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_ftdiv(void)
1835f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1836f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int i, num_tests, crx;
1837f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned int flags;
1838f34eb496099507090f26dcf94bb780da8b3894e5sewardj   unsigned long long * frap, * frbp;
1839f34eb496099507090f26dcf94bb780da8b3894e5sewardj   build_special_fargs_table();
1840f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1841f34eb496099507090f26dcf94bb780da8b3894e5sewardj   num_tests = sizeof ftdiv_tests/sizeof ftdiv_tests[0];
1842f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1843f34eb496099507090f26dcf94bb780da8b3894e5sewardj   for (i = 0; i < num_tests; i++) {
1844dd690bf8d81c9119a7228446be12e3366e202176carll      fp_test_args_t aTest = ftdiv_tests[i];
1845f34eb496099507090f26dcf94bb780da8b3894e5sewardj      f14 = spec_fargs[aTest.fra_idx];
1846f34eb496099507090f26dcf94bb780da8b3894e5sewardj      f15 = spec_fargs[aTest.frb_idx];
1847f34eb496099507090f26dcf94bb780da8b3894e5sewardj      frap = (unsigned long long *)&spec_fargs[aTest.fra_idx];
1848f34eb496099507090f26dcf94bb780da8b3894e5sewardj      frbp = (unsigned long long *)&spec_fargs[aTest.frb_idx];
1849f34eb496099507090f26dcf94bb780da8b3894e5sewardj      SET_FPSCR_ZERO;
1850f34eb496099507090f26dcf94bb780da8b3894e5sewardj      SET_CR_XER_ZERO;
1851f34eb496099507090f26dcf94bb780da8b3894e5sewardj      __asm__ __volatile__ ("ftdiv           cr1, %0, %1" : : "d" (f14), "d" (f15));
1852f34eb496099507090f26dcf94bb780da8b3894e5sewardj      GET_CR(flags);
1853f34eb496099507090f26dcf94bb780da8b3894e5sewardj      crx = (flags & 0x0f000000) >> 24;
1854f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "ftdiv: %016llx <=> %016llx ? %x (CRx)\n", *frap, *frbp, crx);
1855f34eb496099507090f26dcf94bb780da8b3894e5sewardj//      printf("\tFRA: %e;  FRB: %e\n", f14, f15);
1856f34eb496099507090f26dcf94bb780da8b3894e5sewardj      if ( crx != aTest.cr_flags) {
1857f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf("Error: Expected CR flags 0x%x; actual flags: 0x%x\n", aTest.cr_flags, crx);
1858f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1859f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1860f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "\n" );
1861f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1862f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1863f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1864f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_p7_fpops ( void )
1865f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1866f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int k = 0;
1867f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t func;
1868f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1869f34eb496099507090f26dcf94bb780da8b3894e5sewardj   build_fargs_table();
1870f34eb496099507090f26dcf94bb780da8b3894e5sewardj   while ((func = fp_tests[k].test_func)) {
1871f34eb496099507090f26dcf94bb780da8b3894e5sewardj      float res;
1872f34eb496099507090f26dcf94bb780da8b3894e5sewardj      double resd;
1873f34eb496099507090f26dcf94bb780da8b3894e5sewardj      unsigned long long u0;
1874f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int i;
1875f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int res32 = strcmp(fp_tests[k].name, "fcfidu");
1876f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1877f34eb496099507090f26dcf94bb780da8b3894e5sewardj      for (i = 0; i < nb_fargs; i++) {
1878f34eb496099507090f26dcf94bb780da8b3894e5sewardj         u0 = *(unsigned long long *) (&fargs[i]);
1879f34eb496099507090f26dcf94bb780da8b3894e5sewardj         f14 = fargs[i];
1880f34eb496099507090f26dcf94bb780da8b3894e5sewardj         (*func)();
1881f34eb496099507090f26dcf94bb780da8b3894e5sewardj         if (res32) {
1882f34eb496099507090f26dcf94bb780da8b3894e5sewardj            res = f17;
1883f34eb496099507090f26dcf94bb780da8b3894e5sewardj            printf( "%s %016llx => (raw sp) %08x)",
1884f34eb496099507090f26dcf94bb780da8b3894e5sewardj                    fp_tests[k].name, u0, *((unsigned int *)&res));
1885f34eb496099507090f26dcf94bb780da8b3894e5sewardj         } else {
1886f34eb496099507090f26dcf94bb780da8b3894e5sewardj            resd = f17;
1887f34eb496099507090f26dcf94bb780da8b3894e5sewardj            printf( "%s %016llx => (raw sp) %016llx)",
1888f34eb496099507090f26dcf94bb780da8b3894e5sewardj                    fp_tests[k].name, u0, *(unsigned long long *)(&resd));
1889f34eb496099507090f26dcf94bb780da8b3894e5sewardj         }
1890f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf( "\n" );
1891f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1892f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1893f34eb496099507090f26dcf94bb780da8b3894e5sewardj      k++;
1894f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "\n" );
1895f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1896f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1897f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1898f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_vsx_logic(void)
1899f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1900f34eb496099507090f26dcf94bb780da8b3894e5sewardj   logic_test_t aTest;
1901f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t func;
1902dd690bf8d81c9119a7228446be12e3366e202176carll   int k;
1903f34eb496099507090f26dcf94bb780da8b3894e5sewardj   k = 0;
1904f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1905f34eb496099507090f26dcf94bb780da8b3894e5sewardj   while ((func = logic_tests[k].test_func)) {
1906f34eb496099507090f26dcf94bb780da8b3894e5sewardj      unsigned int * pv;
1907f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int startA, startB;
1908f34eb496099507090f26dcf94bb780da8b3894e5sewardj      unsigned int * inA, * inB, * dst;
1909f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int idx, i;
1910f34eb496099507090f26dcf94bb780da8b3894e5sewardj      startA = 0;
1911f34eb496099507090f26dcf94bb780da8b3894e5sewardj      aTest = logic_tests[k];
1912f34eb496099507090f26dcf94bb780da8b3894e5sewardj      for (i = 0; i <= (NUM_VIARGS_INTS - (NUM_VIARGS_VECS * sizeof(int))); i++, startA++) {
1913f34eb496099507090f26dcf94bb780da8b3894e5sewardj         startB = startA + 4;
1914f34eb496099507090f26dcf94bb780da8b3894e5sewardj         pv = (unsigned int *)&vec_out;
1915f34eb496099507090f26dcf94bb780da8b3894e5sewardj         inA = &viargs[startA];
1916f34eb496099507090f26dcf94bb780da8b3894e5sewardj         inB = &viargs[startB];
1917f34eb496099507090f26dcf94bb780da8b3894e5sewardj         memcpy(&vec_inA, inA, sizeof(vector unsigned char));
1918f34eb496099507090f26dcf94bb780da8b3894e5sewardj         memcpy(&vec_inB, inB, sizeof(vector unsigned char));
1919f34eb496099507090f26dcf94bb780da8b3894e5sewardj         // clear vec_out
1920f34eb496099507090f26dcf94bb780da8b3894e5sewardj         for (idx = 0; idx < 4; idx++, pv++)
1921f34eb496099507090f26dcf94bb780da8b3894e5sewardj            *pv = 0;
1922f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1923f34eb496099507090f26dcf94bb780da8b3894e5sewardj         // execute test insn
1924f34eb496099507090f26dcf94bb780da8b3894e5sewardj         (*func)();
1925f34eb496099507090f26dcf94bb780da8b3894e5sewardj         dst = (unsigned int*) &vec_out;
1926f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1927f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf( "%s:", aTest.name);
1928f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf( " %08x %08x %08x %08x %s", inA[0], inA[1], inA[2], inA[3], aTest.name);
1929f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf( " %08x %08x %08x %08x", inB[0], inB[1], inB[2], inB[3]);
1930f34eb496099507090f26dcf94bb780da8b3894e5sewardj         printf(" => %08x %08x %08x %08x\n", dst[0], dst[1], dst[2], dst[3]);
1931f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1932f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1933f34eb496099507090f26dcf94bb780da8b3894e5sewardj      k++;
1934f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1935f34eb496099507090f26dcf94bb780da8b3894e5sewardj   printf( "\n" );
1936f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1937f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1938dd690bf8d81c9119a7228446be12e3366e202176carllstatic vector unsigned long long vec_args[] __attribute__ ((aligned (16))) =
1939dd690bf8d81c9119a7228446be12e3366e202176carll{
1940dd690bf8d81c9119a7228446be12e3366e202176carll { 0x0123456789abcdefULL, 0x0011223344556677ULL},
1941dd690bf8d81c9119a7228446be12e3366e202176carll { 0x8899aabb19293942ULL, 0xa1a2a3a4b1b2b3b4ULL},
1942dd690bf8d81c9119a7228446be12e3366e202176carll { 0xc1c2c3c4d1d2d3d4ULL, 0x7a6b5d3efc032778ULL}
1943dd690bf8d81c9119a7228446be12e3366e202176carll};
1944dd690bf8d81c9119a7228446be12e3366e202176carll#define NUM_VEC_ARGS_LONGS (sizeof vec_args/sizeof vec_args[0])
1945dd690bf8d81c9119a7228446be12e3366e202176carll
1946f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_move_ops (void)
1947f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
1948f34eb496099507090f26dcf94bb780da8b3894e5sewardj   move_test_t aTest;
1949f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t func;
1950dd690bf8d81c9119a7228446be12e3366e202176carll   int k;
1951f34eb496099507090f26dcf94bb780da8b3894e5sewardj   k = 0;
1952f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1953f34eb496099507090f26dcf94bb780da8b3894e5sewardj   while ((func = move_tests[k].test_func)) {
1954f34eb496099507090f26dcf94bb780da8b3894e5sewardj      unsigned int * pv;
1955f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int startA, startB;
1956dd690bf8d81c9119a7228446be12e3366e202176carll      unsigned long long * inA, * inB, * dst;
1957dd690bf8d81c9119a7228446be12e3366e202176carll      int use_vecA = (strcmp(move_tests[k].name, "xscpsgndp") == 0);
1958f34eb496099507090f26dcf94bb780da8b3894e5sewardj      int idx;
1959dd690bf8d81c9119a7228446be12e3366e202176carll      inA = NULL;
1960f34eb496099507090f26dcf94bb780da8b3894e5sewardj      aTest = move_tests[k];
1961dd690bf8d81c9119a7228446be12e3366e202176carll      for (startB = 0; startB < NUM_VEC_ARGS_LONGS; startB++) {
1962dd690bf8d81c9119a7228446be12e3366e202176carll         inB = (unsigned long long *)&vec_args[startB];
1963dd690bf8d81c9119a7228446be12e3366e202176carll         memcpy(&vec_inB, inB, sizeof(vector unsigned char));
1964dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE)
1965dd690bf8d81c9119a7228446be12e3366e202176carll            inB++;
1966dd690bf8d81c9119a7228446be12e3366e202176carll         startA = 0;
1967dd690bf8d81c9119a7228446be12e3366e202176carllrepeat:
1968dd690bf8d81c9119a7228446be12e3366e202176carll         if (use_vecA) {
1969dd690bf8d81c9119a7228446be12e3366e202176carll            inA = (unsigned long long *)&vec_args[startA];
1970dd690bf8d81c9119a7228446be12e3366e202176carll            memcpy(&vec_inA, inA, sizeof(vector unsigned char));
1971dd690bf8d81c9119a7228446be12e3366e202176carll            startA++;
1972dd690bf8d81c9119a7228446be12e3366e202176carll         }
1973dd690bf8d81c9119a7228446be12e3366e202176carll         pv = (unsigned int *)&vec_out;
1974dd690bf8d81c9119a7228446be12e3366e202176carll         // clear vec_out
1975dd690bf8d81c9119a7228446be12e3366e202176carll         for (idx = 0; idx < 4; idx++, pv++)
1976dd690bf8d81c9119a7228446be12e3366e202176carll            *pv = 0;
1977f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1978dd690bf8d81c9119a7228446be12e3366e202176carll         // execute test insn
1979dd690bf8d81c9119a7228446be12e3366e202176carll         (*func)();
1980dd690bf8d81c9119a7228446be12e3366e202176carll         dst = (unsigned long long *) &vec_out;
1981dd690bf8d81c9119a7228446be12e3366e202176carll         if (isLE) {
1982dd690bf8d81c9119a7228446be12e3366e202176carll            dst++;
1983dd690bf8d81c9119a7228446be12e3366e202176carll            inA++;
1984dd690bf8d81c9119a7228446be12e3366e202176carll         }
1985f34eb496099507090f26dcf94bb780da8b3894e5sewardj
1986dd690bf8d81c9119a7228446be12e3366e202176carll         printf( "%s:", aTest.name);
1987dd690bf8d81c9119a7228446be12e3366e202176carll         if (use_vecA)
1988dd690bf8d81c9119a7228446be12e3366e202176carll            printf( " X[A]: %016llx ", *inA);
1989dd690bf8d81c9119a7228446be12e3366e202176carll         printf( " X[B]: %016llx", *inB);
1990dd690bf8d81c9119a7228446be12e3366e202176carll         printf(" => %016llx\n", *dst);
1991dd690bf8d81c9119a7228446be12e3366e202176carll
1992dd690bf8d81c9119a7228446be12e3366e202176carll         if (use_vecA && startA < NUM_VEC_ARGS_LONGS)
1993dd690bf8d81c9119a7228446be12e3366e202176carll            goto repeat;
1994f34eb496099507090f26dcf94bb780da8b3894e5sewardj      }
1995f34eb496099507090f26dcf94bb780da8b3894e5sewardj      k++;
1996f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "\n" );
1997f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
1998f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
1999f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2000f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic void test_permute_ops (void)
2001f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
2002f34eb496099507090f26dcf94bb780da8b3894e5sewardj  permute_test_t *aTest;
2003f34eb496099507090f26dcf94bb780da8b3894e5sewardj  unsigned int *dst = (unsigned int *) &vec_out;
2004f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2005f34eb496099507090f26dcf94bb780da8b3894e5sewardj  for (aTest = &(permute_tests[0]); aTest->test_func != NULL; aTest++)
2006f34eb496099507090f26dcf94bb780da8b3894e5sewardj    {
2007f34eb496099507090f26dcf94bb780da8b3894e5sewardj      /* Grab test input and clear output vector.  */
2008f34eb496099507090f26dcf94bb780da8b3894e5sewardj      memcpy(&vec_inA, aTest->xa, sizeof(vec_inA));
2009f34eb496099507090f26dcf94bb780da8b3894e5sewardj      memcpy(&vec_inB, aTest->xb, sizeof(vec_inB));
2010f34eb496099507090f26dcf94bb780da8b3894e5sewardj      memset(dst, 0, sizeof(vec_out));
2011f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2012f34eb496099507090f26dcf94bb780da8b3894e5sewardj      /* execute test insn */
2013f34eb496099507090f26dcf94bb780da8b3894e5sewardj      aTest->test_func();
2014f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2015f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "%s:\n", aTest->name);
2016f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "        XA[%08x,%08x,%08x,%08x]\n",
2017f34eb496099507090f26dcf94bb780da8b3894e5sewardj              aTest->xa[0], aTest->xa[1], aTest->xa[2], aTest->xa[3]);
2018f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "        XB[%08x,%08x,%08x,%08x]\n",
2019f34eb496099507090f26dcf94bb780da8b3894e5sewardj              aTest->xb[0], aTest->xb[1], aTest->xb[2], aTest->xb[3]);
2020f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "   =>   XT[%08x,%08x,%08x,%08x]\n",
2021f34eb496099507090f26dcf94bb780da8b3894e5sewardj              dst[0], dst[1], dst[2], dst[3]);
2022f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2023f34eb496099507090f26dcf94bb780da8b3894e5sewardj    }
2024f34eb496099507090f26dcf94bb780da8b3894e5sewardj  printf( "\n" );
2025f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
2026f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2027f34eb496099507090f26dcf94bb780da8b3894e5sewardjstatic test_table_t all_tests[] = { { &test_ldst,
2028f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test VSX load/store instructions" },
2029f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_vsx_logic,
2030f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test VSX logic instructions" },
2031f34eb496099507090f26dcf94bb780da8b3894e5sewardj#ifdef __powerpc64__
2032f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_ldbrx,
2033f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test ldbrx instruction" },
2034f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_popcntd,
2035f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test popcntd instruction" },
2036f34eb496099507090f26dcf94bb780da8b3894e5sewardj#endif
2037f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_lfiwzx,
2038f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test lfiwzx instruction" },
2039f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_p7_fpops,
2040f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test P7 floating point convert instructions"},
2041f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_ftdiv,
2042f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test ftdiv instruction" },
2043f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_move_ops,
2044f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test VSX move instructions"},
2045f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_permute_ops,
2046f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test VSX permute instructions"},
2047f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_vx_fp_ops,
2048f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test VSX floating point instructions"},
2049f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { &test_xs_conv_ops,
2050f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                       "Test VSX scalar integer conversion instructions" },
2051f34eb496099507090f26dcf94bb780da8b3894e5sewardj                                     { NULL, NULL }
2052f34eb496099507090f26dcf94bb780da8b3894e5sewardj};
2053f34eb496099507090f26dcf94bb780da8b3894e5sewardj#endif // HAS_VSX
2054f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2055f34eb496099507090f26dcf94bb780da8b3894e5sewardjint main(int argc, char *argv[])
2056f34eb496099507090f26dcf94bb780da8b3894e5sewardj{
2057f34eb496099507090f26dcf94bb780da8b3894e5sewardj#ifdef HAS_VSX
2058f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2059f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_table_t aTest;
2060f34eb496099507090f26dcf94bb780da8b3894e5sewardj   test_func_t func;
2061f34eb496099507090f26dcf94bb780da8b3894e5sewardj   int i = 0;
2062f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2063f34eb496099507090f26dcf94bb780da8b3894e5sewardj   while ((func = all_tests[i].test_category)) {
2064f34eb496099507090f26dcf94bb780da8b3894e5sewardj      aTest = all_tests[i];
2065f34eb496099507090f26dcf94bb780da8b3894e5sewardj      printf( "%s\n", aTest.name );
2066f34eb496099507090f26dcf94bb780da8b3894e5sewardj      (*func)();
2067f34eb496099507090f26dcf94bb780da8b3894e5sewardj      i++;
2068f34eb496099507090f26dcf94bb780da8b3894e5sewardj   }
2069f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2070f34eb496099507090f26dcf94bb780da8b3894e5sewardj#endif // HAS _VSX
2071f34eb496099507090f26dcf94bb780da8b3894e5sewardj
2072f34eb496099507090f26dcf94bb780da8b3894e5sewardj   return 0;
2073f34eb496099507090f26dcf94bb780da8b3894e5sewardj}
2074