1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*  Copyright (C) 2011 IBM
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Author: Maynard Johnson <maynardj@us.ibm.com>
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This program is free software; you can redistribute it and/or
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng modify it under the terms of the GNU General Public License as
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng published by the Free Software Foundation; either version 2 of the
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng License, or (at your option) any later version.
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This program is distributed in the hope that it will be useful, but
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng WITHOUT ANY WARRANTY; without even the implied warranty of
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng General Public License for more details.
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng You should have received a copy of the GNU General Public License
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng along with this program; if not, write to the Free Software
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 02111-1307, USA.
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The GNU General Public License is contained in the file COPYING.
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef HAS_VSX
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h>
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h>
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdlib.h>
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <string.h>
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <malloc.h>
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <altivec.h>
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <math.h>
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifndef __powerpc64__
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef uint32_t HWord_t;
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#else
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef uint64_t HWord_t;
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif /* __powerpc64__ */
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef unsigned char Bool;
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define True 1
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define False 0
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister HWord_t r14 __asm__ ("r14");
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister HWord_t r15 __asm__ ("r15");
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister HWord_t r16 __asm__ ("r16");
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister HWord_t r17 __asm__ ("r17");
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f14 __asm__ ("fr14");
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f15 __asm__ ("fr15");
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f16 __asm__ ("fr16");
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f17 __asm__ ("fr17");
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic volatile unsigned int div_flags, div_xer;
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_CR(_arg) \
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("mtcr  %0" : : "b"(_arg) : ALLCR );
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_XER(_arg) \
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" );
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GET_CR(_lval) \
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("mfcr %0"  : "=b"(_lval) )
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GET_XER(_lval) \
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) )
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GET_CR_XER(_lval_cr,_lval_xer) \
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0)
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_CR_ZERO \
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      SET_CR(0)
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_XER_ZERO \
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      SET_XER(0)
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_CR_XER_ZERO \
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do { SET_CR_ZERO; SET_XER_ZERO; } while (0)
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_FPSCR_ZERO \
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do { double _d = 0.0; \
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } while (0)
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef void (*test_func_t)(void);
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct test_table test_table_t;
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* These functions below that construct a table of floating point
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * values were lifted from none/tests/ppc32/jm-insns.c.
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (DEBUG_ARGS_BUILD)
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#else
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define AB_DPRINTF(fmt, args...) do { } while (0)
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic inline void register_farg (void *farg,
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  int s, uint16_t _exp, uint64_t mant)
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint64_t tmp;
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant;
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *(uint64_t *)farg = tmp;
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   AB_DPRINTF("%d %03x %013llx => %016llx %0e\n",
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              s, _exp, mant, *(uint64_t *)farg, *(double *)farg);
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline void register_sp_farg (void *farg,
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     int s, uint16_t _exp, uint32_t mant)
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   uint32_t tmp;
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   tmp = ((uint32_t)s << 31) | ((uint32_t)_exp << 23) | mant;
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *(uint32_t *)farg = tmp;
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct fp_test_args {
119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int fra_idx;
120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int frb_idx;
121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} fp_test_args_t;
122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengfp_test_args_t fp_cmp_tests[] = {
125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {8, 8},
126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {8, 14},
127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {8, 6},
128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {8, 5},
129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {8, 4},
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {8, 7},
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {8, 9},
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {8, 11},
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {14, 8},
134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {14, 14},
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {14, 6},
136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {14, 5},
137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {14, 4},
138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {14, 7},
139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {14, 9},
140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {14, 11},
141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {6, 8},
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {6, 14},
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {6, 6},
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {6, 5},
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {6, 4},
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {6, 7},
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {6, 9},
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {6, 11},
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {5, 8},
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {5, 14},
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {5, 6},
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {5, 5},
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {5, 4},
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {5, 7},
155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {5, 9},
156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {5, 11},
157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 8},
158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 14},
159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 6},
160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 5},
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 1},
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 7},
163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 9},
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 11},
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {7, 8},
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {7, 14},
167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {7, 6},
168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {7, 5},
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {7, 4},
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {7, 7},
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {7, 9},
172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {7, 11},
173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {10, 8},
174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {10, 14},
175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {10, 6},
176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {10, 5},
177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {10, 4},
178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {10, 7},
179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {10, 9},
180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {10, 10},
181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {12, 8},
182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {12, 14},
183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {12, 6},
184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {12, 5},
185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {1, 1},
186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {2, 2},
187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {3, 3},
188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   {4, 4},
189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengfp_test_args_t two_arg_fp_tests[] = {
193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {8, 8},
194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {8, 14},
195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {15, 16},
196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {8, 5},
197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {8, 4},
198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {8, 7},
199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {8, 9},
200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {8, 11},
201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {14, 8},
202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {14, 14},
203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {14, 6},
204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {14, 5},
205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {14, 4},
206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {14, 7},
207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {14, 9},
208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {14, 11},
209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {6, 8},
210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {6, 14},
211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {6, 6},
212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {6, 5},
213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {6, 4},
214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {6, 7},
215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {6, 9},
216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {6, 11},
217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {5, 8},
218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {5, 14},
219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {5, 6},
220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {5, 5},
221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {5, 4},
222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {5, 7},
223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {5, 9},
224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {5, 11},
225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {4, 8},
226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {4, 14},
227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {4, 6},
228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {4, 5},
229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {4, 1},
230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {4, 7},
231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {4, 9},
232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {4, 11},
233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {7, 8},
234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {7, 14},
235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {7, 6},
236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {7, 5},
237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {7, 4},
238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {7, 7},
239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {7, 9},
240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {7, 11},
241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {10, 8},
242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {10, 14},
243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {12, 6},
244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {12, 5},
245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {10, 4},
246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {10, 7},
247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {10, 9},
248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {10, 11},
249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {12, 8 },
250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {12, 14},
251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {12, 6},
252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {15, 16},
253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {15, 16},
254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {9, 11},
255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {11, 11},
256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     {11, 12}
257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic int nb_special_fargs;
261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic double * spec_fargs;
262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic float * spec_sp_fargs;
263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void build_special_fargs_table(void)
265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*
267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  Entry  Sign Exp   fraction                  Special value
268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   0      0   3fd   0x8000000000000ULL         Positive finite number
269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   1      0   404   0xf000000000000ULL         ...
270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   2      0   001   0x8000000b77501ULL         ...
271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   3      0   7fe   0x800000000051bULL         ...
272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   4      0   012   0x3214569900000ULL         ...
273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   5      0   000   0x0000000000000ULL         +0.0 (+zero)
274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   6      1   000   0x0000000000000ULL         -0.0 (-zero)
275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   7      0   7ff   0x0000000000000ULL         +infinity
276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   8      1   7ff   0x0000000000000ULL         -infinity
277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   9      0   7ff   0x7FFFFFFFFFFFFULL         +SNaN
278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   10     1   7ff   0x7FFFFFFFFFFFFULL         -SNaN
279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   11     0   7ff   0x8000000000000ULL         +QNaN
280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   12     1   7ff   0x8000000000000ULL         -QNaN
281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   13     1   000   0x8340000078000ULL         Denormalized val (zero exp and non-zero fraction)
282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   14     1   40d   0x0650f5a07b353ULL         Negative finite number
283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   15     0   412   0x32585a9900000ULL         A couple more positive finite numbers
284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   16     0   413   0x82511a2000000ULL         ...
285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/
286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint64_t mant;
288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   uint32_t mant_sp;
289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint16_t _exp;
290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int s;
291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int j, i = 0;
292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (spec_fargs)
294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   spec_fargs = malloc( 17 * sizeof(double) );
297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   spec_sp_fargs = malloc( 17 * sizeof(float) );
298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #0
300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x3fd;
302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x8000000000000ULL;
303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #1
306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x404;
308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0xf000000000000ULL;
309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* None of the ftdiv tests succeed.
312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * FRA = value #0; FRB = value #1
313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * ea_ = -2; e_b = 5
314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 100
315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /*************************************************
318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *     fe_flag tests
319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *
320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *************************************************/
321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fe_flag <- 1 if FRA is a NaN
323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * FRA = value #9; FRB = value #1
324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = 1024; e_b = 5
325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 101
326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fe_flag <- 1 if FRB is a NaN
329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * FRA = value #1; FRB = value #12
330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = 5; e_b = 1024
331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 101
332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fe_flag <- 1 if e_b <= -1022
335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * FRA = value #0; FRB = value #2
336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = -2; e_b = -1022
337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 101
338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *
339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #2
341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x001;
343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x8000000b77501ULL;
344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fe_flag <- 1 if e_b >= 1021
347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * FRA = value #1; FRB = value #3
348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = 5; e_b = 1023
349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 101
350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #3
352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x7fe;
354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x800000000051bULL;
355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fe_flag <- 1 if FRA != 0 && e_a - e_b >= 1023
358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Let FRA = value #3 and FRB be value #0.
359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = 1023; e_b = -2
360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 101
361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fe_flag <- 1 if FRA != 0 && e_a - e_b <= -1023
364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Let FRA = value #0 above and FRB be value #3 above
365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = -2; e_b = 1023
366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 101
367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fe_flag <- 1 if FRA != 0 && e_a <= -970
370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Let FRA = value #4 and FRB be value #0
371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = -1005; e_b = -2
372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 101
373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #4
375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x012;
377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x3214569900000ULL;
378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /*************************************************
381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *     fg_flag tests
382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *
383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *************************************************/
384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fg_flag <- 1 if FRA is an Infinity
385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * NOTE: FRA = Inf also sets fe_flag
386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Do two tests, using values #7 and #8 (+/- Inf) for FRA.
387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Test 1:
388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *   Let FRA be value #7 and FRB be value #1
389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *   e_a = 1024; e_b = 5
390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *   fl_flag || fg_flag || fe_flag = 111
391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *
392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Test 2:
393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *   Let FRA be value #8 and FRB be value #1
394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *   e_a = 1024; e_b = 5
395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *   fl_flag || fg_flag || fe_flag = 111
396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *
397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fg_flag <- 1 if FRB is an Infinity
400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * NOTE: FRB = Inf also sets fe_flag
401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Let FRA be value #1 and FRB be value #7
402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = 5; e_b = 1024
403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 111
404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fg_flag <- 1 if FRB is denormalized
407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * NOTE: e_b < -1022 ==> fe_flag <- 1
408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Let FRA be value #0 and FRB be value #13
409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * e_a = -2; e_b = -1023
410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 111
411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fg_flag <- 1 if FRB is +zero
414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * NOTE: FRA = Inf also sets fe_flag
415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Let FRA = val #5; FRB = val #5
416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * ea_ = -1023; e_b = -1023
417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 111
418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* fg_flag <- 1 if FRB is -zero
421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * NOTE: FRA = Inf also sets fe_flag
422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Let FRA = val #5; FRB = val #6
423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * ea_ = -1023; e_b = -1023
424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * fl_flag || fg_flag || fe_flag = 111
425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Special values */
428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* +0.0      : 0 0x000 0x0000000000000 */
429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #5
430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x000;
432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x0000000000000ULL;
433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* -0.0      : 1 0x000 0x0000000000000 */
436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #6
437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 1;
438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x000;
439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x0000000000000ULL;
440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* +infinity : 0 0x7FF 0x0000000000000  */
443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #7
444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x7FF;
446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x0000000000000ULL;
447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* -infinity : 1 0x7FF 0x0000000000000 */
450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #8
451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 1;
452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x7FF;
453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x0000000000000ULL;
454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /*
457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    * This comment applies to values #9 and #10 below:
458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    * When src is a SNaN, it's converted to a QNaN first before rounding to single-precision,
459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    * so we can't just copy the double-precision value to the corresponding slot in the
460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    * single-precision array (i.e., in the loop at the end of this function).  Instead, we
461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    * have to manually set the bits using register_sp_farg().
462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    */
463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* +SNaN     : 0 0x7FF 0x7FFFFFFFFFFFF */
465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #9
466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x7FF;
468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x7FFFFFFFFFFFFULL;
469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   _exp = 0xff;
471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   mant_sp = 0x3FFFFF;
472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   register_sp_farg(&spec_sp_fargs[i-1], s, _exp, mant_sp);
473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* -SNaN     : 1 0x7FF 0x7FFFFFFFFFFFF */
475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #10
476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 1;
477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x7FF;
478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x7FFFFFFFFFFFFULL;
479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   _exp = 0xff;
481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   mant_sp = 0x3FFFFF;
482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   register_sp_farg(&spec_sp_fargs[i-1], s, _exp, mant_sp);
483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* +QNaN     : 0 0x7FF 0x8000000000000 */
485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #11
486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x7FF;
488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x8000000000000ULL;
489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* -QNaN     : 1 0x7FF 0x8000000000000 */
492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #12
493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 1;
494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x7FF;
495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x8000000000000ULL;
496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* denormalized value */
499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #13
500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 1;
501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x000;
502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x8340000078000ULL;
503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Negative finite number */
506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #14
507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 1;
508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x40d;
509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x0650f5a07b353ULL;
510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* A couple positive finite numbers ... */
513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #15
514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x412;
516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x32585a9900000ULL;
517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // #16
520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s = 0;
521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   _exp = 0x413;
522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mant = 0x82511a2000000ULL;
523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register_farg(&spec_fargs[i++], s, _exp, mant);
524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   nb_special_fargs = i;
526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (j = 0; j < i; j++) {
527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!(j == 9 || j == 10))
528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         spec_sp_fargs[j] = spec_fargs[j];
529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstruct test_table
534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t test_category;
536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   char * name;
537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum {
540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   SINGLE_TEST,
541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   DOUBLE_TEST
542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} precision_type_t;
543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum {
545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VX_SCALAR_FP_NMSUB = 0,
546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // ALL VECTOR-TYPE OPS SHOULD BE ADDED AFTER THIS LINE
547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VX_VECTOR_FP_MULT_AND_OP2 = 10,
548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // and before this line
549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VX_BASIC_CMP = 30,
550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VX_CONV_WORD,
551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VX_DEFAULT
552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} vx_fp_test_type;
553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct vx_fp_test
555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t test_func;
557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   const char * name;
558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fp_test_args_t * targs;
559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int num_tests;
560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   precision_type_t precision;
561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vx_fp_test_type type;
562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   const char * op;
563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} vx_fp_test_t;
564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vector unsigned int vec_out, vec_inA, vec_inB, vec_inC;
566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool do_dot;
568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpeqdp(void)
569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpeqdp.          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpeqdp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpgedp(void)
577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpgedp.          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpgedp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpgtdp(void)
585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpgtdp.          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpgtdp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpeqsp(void)
593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpeqsp.          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpeqsp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpgesp(void)
601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpgesp.          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpgesp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpgtsp(void)
609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpgtsp.          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xvcmpgtsp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool do_aXp;
617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool do_dp;
618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsnmsub(void)
619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_aXp)
621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xsnmsubadp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("xsnmsubmdp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmadd(void)
627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_aXp)
629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (do_dp)
630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvmaddadp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvmaddasp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (do_dp)
635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvmaddmdp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvmaddmsp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvnmadd(void)
641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_aXp)
643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (do_dp)
644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvnmaddadp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvnmaddasp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (do_dp)
649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvnmaddmdp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvnmaddmsp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvnmsub(void)
655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_aXp)
657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (do_dp)
658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvnmsubadp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvnmsubasp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (do_dp)
663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvnmsubmdp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvnmsubmsp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmsub(void)
669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_aXp)
671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (do_dp)
672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvmsubadp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvmsubasp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (do_dp)
677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvmsubmdp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("xvmsubmsp          %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xssqrtdp(void)
683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xssqrtdp   %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsrdpim(void)
688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xsrdpim   %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsrdpip(void)
693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xsrdpip   %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xstdivdp(void)
698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xstdivdp   6, %x0, %x1" : : "wa" (vec_inA), "wa" (vec_inB));
700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsmaxdp(void)
703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xsmaxdp   %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsmindp(void)
708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xsmindp   %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvadddp(void)
713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvadddp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvaddsp(void)
718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvaddsp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvdivdp(void)
723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvdivdp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvdivsp(void)
728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvdivsp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmuldp(void)
733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvmuldp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmulsp(void)
738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvmulsp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvsubdp(void)
743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvsubdp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmaxdp(void)
748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvmaxdp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmindp(void)
753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvmindp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmaxsp(void)
758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvmaxsp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvminsp(void)
763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvminsp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvsubsp(void)
768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvsubsp          %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvresp(void)
773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvresp   %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xxsel(void)
778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long * dst;
780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long xa[] =  { 0xa12bc37de56f9708ULL, 0x3894c1fddeadbeefULL};
781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long xb[] =  { 0xfedc432124681235ULL, 0xf1e2d3c4e0057708ULL};
782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long xc[] =  { 0xffffffff01020304ULL, 0x128934bd00000000ULL};
783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   memcpy(&vec_inA, xa, 16);
785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   memcpy(&vec_inB, xb, 16);
786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   memcpy(&vec_inC, xc, 16);
787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xxsel   %x0, %x1, %x2, %x3" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB),"wa" (vec_inC));
790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dst = (unsigned long long *) &vec_out;
791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("xxsel %016llx,%016llx,%016llx => %016llx\n", xa[0], xb[0], xc[0], *dst);
792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dst++;
793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("xxsel %016llx,%016llx,%016llx => %016llx\n", xa[1], xb[1], xc[1], *dst);
794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("\n");
795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xxspltw(void)
798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int uim;
800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long * dst = NULL;
801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long xb[] =  { 0xfedc432124681235ULL, 0xf1e2d3c4e0057708ULL};
802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   memcpy(&vec_inB, xb, 16);
803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (uim = 0; uim < 4; uim++) {
805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (uim) {
806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case 0:
807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            __asm__ __volatile__ ("xxspltw   %x0, %x1, 0" : "=wa" (vec_out): "wa" (vec_inB));
808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case 1:
810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            __asm__ __volatile__ ("xxspltw   %x0, %x1, 1" : "=wa" (vec_out): "wa" (vec_inB));
811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case 2:
813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            __asm__ __volatile__ ("xxspltw   %x0, %x1, 2" : "=wa" (vec_out): "wa" (vec_inB));
814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case 3:
816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            __asm__ __volatile__ ("xxspltw   %x0, %x1, 3" : "=wa" (vec_out): "wa" (vec_inB));
817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dst = (unsigned long long *) &vec_out;
820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf("xxspltw 0x%016llx%016llx %d=> 0x%016llx",  xb[0], xb[1], uim, *dst);
821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dst++;
822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf("%016llx\n", *dst);
823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("\n");
825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xscvdpsxws(void)
828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xscvdpsxws  %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xscvdpuxds(void)
833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xscvdpuxds  %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB));
835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcpsgndp(void)
838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__  ("xvcpsgndp  %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcpsgnsp(void)
843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__  ("xvcpsgnsp  %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB));
845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcvdpsxws(void)
848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvcvdpsxws  %x0, %x1 " : "=wa" (vec_out): "wa" (vec_inB));
850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcvspsxws(void)
853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("xvcvspsxws  %x0, %x1 " : "=wa" (vec_out): "wa" (vec_inB));
855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vx_fp_test_t
858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvx_vector_one_fp_arg_tests[] = {
859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                { &test_xvresp, "xvresp", NULL, 16, SINGLE_TEST, VX_BASIC_CMP, "1/x"},
860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                { &test_xvcvdpsxws, "xvcvdpsxws", NULL, 16, DOUBLE_TEST, VX_CONV_WORD, "conv"},
861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                { &test_xvcvspsxws, "xvcvspsxws", NULL, 16, SINGLE_TEST, VX_CONV_WORD, "conv"},
862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                { NULL, NULL, NULL, 0 , 0, 0, NULL}
863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vx_fp_test_t
866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvx_vector_fp_tests[] = {
867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvcmpeqdp, "xvcmpeqdp", fp_cmp_tests, 64, DOUBLE_TEST, VX_BASIC_CMP, "eq"},
868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvcmpgedp, "xvcmpgedp", fp_cmp_tests, 64, DOUBLE_TEST, VX_BASIC_CMP, "ge"},
869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvcmpgtdp, "xvcmpgtdp", fp_cmp_tests, 64, DOUBLE_TEST, VX_BASIC_CMP, "gt"},
870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvcmpeqsp, "xvcmpeqsp", fp_cmp_tests, 64, SINGLE_TEST, VX_BASIC_CMP, "eq"},
871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvcmpgesp, "xvcmpgesp", fp_cmp_tests, 64, SINGLE_TEST, VX_BASIC_CMP, "ge"},
872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvcmpgtsp, "xvcmpgtsp", fp_cmp_tests, 64, SINGLE_TEST, VX_BASIC_CMP, "gt"},
873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvadddp, "xvadddp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "+" },
874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvaddsp, "xvaddsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "+" },
875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvdivdp, "xvdivdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "/" },
876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvdivsp, "xvdivsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "/" },
877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvmuldp, "xvmuldp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "*" },
878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvmulsp, "xvmulsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "*" },
879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvsubdp, "xvsubdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "-" },
880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvsubsp, "xvsubsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "-" },
881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvmaxdp, "xvmaxdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "@max@" },
882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvmindp, "xvmindp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "@min@" },
883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvmaxsp, "xvmaxsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "@max@" },
884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvminsp, "xvminsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "@min@" },
885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvcpsgndp, "xvcpsgndp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "+-cp"},
886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { &test_xvcpsgnsp, "xvcpsgnsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "+-cp"},
887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        { NULL, NULL, NULL, 0 , 0, 0, NULL}
888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vx_fp_test_t
892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvx_aORm_fp_tests[] = {
893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xsnmsub, "xsnmsub", two_arg_fp_tests, 64, DOUBLE_TEST, VX_SCALAR_FP_NMSUB, "!*-"},
894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xvmadd, "xvmadd", two_arg_fp_tests, 64, DOUBLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "*+"},
895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xvmadd, "xvmadd", two_arg_fp_tests, 64, SINGLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "*+"},
896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xvnmadd, "xvnmadd", two_arg_fp_tests, 64, DOUBLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "!*+"},
897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xvnmadd, "xvnmadd", two_arg_fp_tests, 64, SINGLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "!*+"},
898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xvmsub, "xvmsub", two_arg_fp_tests, 64, DOUBLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "*-"},
899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xvmsub, "xvmsub", two_arg_fp_tests, 64, SINGLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "*-"},
900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xvnmsub, "xvnmsub", two_arg_fp_tests, 64, DOUBLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "!*-"},
901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &test_xvnmsub, "xvnmsub", two_arg_fp_tests, 64, SINGLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "!*-"},
902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { NULL, NULL, NULL, 0, 0, 0,  NULL }
903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vx_fp_test_t
906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvx_simple_scalar_fp_tests[] = {
907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { &test_xssqrtdp, "xssqrtdp", NULL, 17, DOUBLE_TEST, VX_DEFAULT, NULL},
908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { &test_xsrdpim, "xsrdpim", NULL, 17, DOUBLE_TEST, VX_DEFAULT, NULL},
909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { &test_xsrdpip, "xsrdpip", NULL, 17, DOUBLE_TEST, VX_DEFAULT, NULL},
910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { &test_xstdivdp, "xstdivdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, NULL},
911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { &test_xsmaxdp, "xsmaxdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, NULL},
912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { &test_xsmindp, "xsmindp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, NULL},
913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { &test_xscvdpsxws, "xscvdpsxws", NULL, 17, DOUBLE_TEST, VX_CONV_WORD, NULL},
914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { &test_xscvdpuxds, "xscvdpuxds", NULL, 17, DOUBLE_TEST, VX_DEFAULT, NULL},
915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               { NULL, NULL, NULL, 0, 0, 0, NULL }
916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__
920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_bpermd(void)
921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* NOTE: Bit number is '0 . . . 63'
923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *
924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Permuted bits are generated bit 0 -7 as follows:
925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *    index = (r14)8*i:8*i+7
926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *    perm[i] = (r15)index
927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *
928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * So, for i = 0, index is (r14)8*0:8*0+7, or (r14)0:7, which is the MSB
929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * byte of r14, 0x1b(27/base 10).  This identifies bit 27 of r15, which is '1'.
930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * For i = 1, index is 0x2c, identifying bit 44 of r15, which is '1'.
931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * So the result of the first two iterations of i are:
932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *   perm = 0b01xxxxxx
933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    *
934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   r15 = 0xa12bc37de56f9708ULL;
936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   r14 = 0x1b2c31f030000001ULL;
937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("bpermd %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("bpermd: 0x%016llx : 0x%016llx => 0x%llx\n", (unsigned long long)r14,
939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          (unsigned long long)r15, (unsigned long long)r17);
940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("\n");
941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool do_OE;
945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum {
946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   DIV_BASE = 1,
947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   DIV_OE = 2,
948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   DIV_DOT = 4,
949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} div_type_t;
950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Possible divde type combinations are:
951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *   - base
952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *   - base+dot
953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *   - base+OE
954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *   - base+OE+dot
955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */
956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__
957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_divde(void)
958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int divde_type = DIV_BASE;
960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_OE)
961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      divde_type |= DIV_OE;
962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      divde_type |= DIV_DOT;
964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch (divde_type) {
966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 1:
967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        SET_CR_XER_ZERO;
968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("divde %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR_XER(div_flags, div_xer);
970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 3:
972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        SET_CR_XER_ZERO;
973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("divdeo %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR_XER(div_flags, div_xer);
975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 5:
977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        SET_CR_XER_ZERO;
978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("divde. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR_XER(div_flags, div_xer);
980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 7:
982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        SET_CR_XER_ZERO;
983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("divdeo. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR_XER(div_flags, div_xer);
985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         fprintf(stderr, "Invalid divde type. Exiting\n");
988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         exit(1);
989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_divweu(void)
994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int divweu_type = DIV_BASE;
996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_OE)
997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      divweu_type |= DIV_OE;
998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      divweu_type |= DIV_DOT;
1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch (divweu_type) {
1002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 1:
1003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        SET_CR_XER_ZERO;
1004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("divweu %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
1005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR_XER(div_flags, div_xer);
1006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
1007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 3:
1008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        SET_CR_XER_ZERO;
1009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("divweuo %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
1010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR_XER(div_flags, div_xer);
1011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
1012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 5:
1013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        SET_CR_XER_ZERO;
1014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("divweu. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
1015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR_XER(div_flags, div_xer);
1016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
1017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 7:
1018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        SET_CR_XER_ZERO;
1019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         __asm__ __volatile__ ("divweuo. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15));
1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR_XER(div_flags, div_xer);
1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
1022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
1023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         fprintf(stderr, "Invalid divweu type. Exiting\n");
1024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         exit(1);
1025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fctiduz(void)
1029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
1031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("fctiduz. %0, %1" : "=d" (f17) : "d" (f14));
1032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
1033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("fctiduz %0, %1" : "=d" (f17) : "d" (f14));
1034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fctidu(void)
1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("fctidu. %0, %1" : "=d" (f17) : "d" (f14));
1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
1041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("fctidu %0, %1" : "=d" (f17) : "d" (f14));
1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fctiwuz(void)
1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("fctiwuz. %0, %1" : "=d" (f17) : "d" (f14));
1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("fctiwuz %0, %1" : "=d" (f17) : "d" (f14));
1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fctiwu(void)
1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_dot)
1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("fctiwu. %0, %1" : "=d" (f17) : "d" (f14));
1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("fctiwu %0, %1" : "=d" (f17) : "d" (f14));
1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct simple_test {
1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t test_func;
1062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   char * name;
1063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   precision_type_t precision;
1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} simple_test_t;
1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic simple_test_t fct_tests[] = {
1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    { &test_fctiduz, "fctiduz", DOUBLE_TEST },
1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    { &test_fctidu, "fctidu", DOUBLE_TEST },
1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    { &test_fctiwuz, "fctiwuz", SINGLE_TEST },
1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    { &test_fctiwu, "fctiwu", SINGLE_TEST },
1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   { NULL, NULL }
1072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void setup_sp_fp_args(fp_test_args_t * targs, Bool swap_inputs)
1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int a_idx, b_idx, i;
1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   void * inA, * inB;
1078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   void * vec_src = swap_inputs ? &vec_out : &vec_inB;
1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 0; i < 4; i++) {
1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      a_idx = targs->fra_idx;
1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      b_idx = targs->frb_idx;
1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      inA = (void *)&spec_sp_fargs[a_idx];
1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      inB = (void *)&spec_sp_fargs[b_idx];
1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // copy single precision FP  into vector element i
1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      memcpy(((void *)&vec_inA) + (i * 4), inA, 4);
1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      memcpy(vec_src + (i * 4), inB, 4);
1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      targs++;
1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void setup_dp_fp_args(fp_test_args_t * targs, Bool swap_inputs)
1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int a_idx, b_idx, i;
1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   void * inA, * inB;
1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   void * vec_src = swap_inputs ? (void *)&vec_out : (void *)&vec_inB;
1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 0; i < 2; i++) {
1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      a_idx = targs->fra_idx;
1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      b_idx = targs->frb_idx;
1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      inA = (void *)&spec_fargs[a_idx];
1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      inB = (void *)&spec_fargs[b_idx];
1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // copy double precision FP  into vector element i
1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      memcpy(((void *)&vec_inA) + (i * 8), inA, 8);
1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      memcpy(vec_src + (i * 8), inB, 8);
1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      targs++;
1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define VX_NOT_CMP_OP 0xffffffff
1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void print_vector_fp_result(unsigned int cc, vx_fp_test_t * test_group, int i)
1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int a_idx, b_idx, k;
1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   char * name = malloc(20);
1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int dp = test_group->precision == DOUBLE_TEST ? 1 : 0;
1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int loops = dp ? 2 : 4;
1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fp_test_args_t * targs = &test_group->targs[i];
1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long * frA_dp, * frB_dp, * dst_dp;
1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned int * frA_sp, *frB_sp, * dst_sp;
1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   strcpy(name, test_group->name);
1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("#%d: %s%s ", dp? i/2 : i/4, name, (do_dot ? "." : ""));
1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (k = 0; k < loops; k++) {
1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      a_idx = targs->fra_idx;
1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      b_idx = targs->frb_idx;
1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (k)
1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf(" AND ");
1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (dp) {
1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         frA_dp = (unsigned long long *)&spec_fargs[a_idx];
1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         frB_dp = (unsigned long long *)&spec_fargs[b_idx];
1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("%016llx %s %016llx", *frA_dp, test_group->op, *frB_dp);
1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
1132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         frA_sp = (unsigned int *)&spec_sp_fargs[a_idx];
1133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         frB_sp = (unsigned int *)&spec_sp_fargs[b_idx];
1134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("%08x %s %08x", *frA_sp, test_group->op, *frB_sp);
1135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      targs++;
1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (cc != VX_NOT_CMP_OP)
1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" ? cc=%x", cc);
1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (dp) {
1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dst_dp = (unsigned long long *) &vec_out;
1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" => %016llx %016llx\n", dst_dp[0], dst_dp[1]);
1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dst_sp = (unsigned int *) &vec_out;
1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" => %08x %08x %08x %08x\n", dst_sp[0], dst_sp[1], dst_sp[2], dst_sp[3]);
1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   free(name);
1149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void print_vx_aORm_fp_result(unsigned long long * XT_arg, unsigned long long * XB_arg,
1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    vx_fp_test_t * test_group, int i)
1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int a_idx, k;
1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   char * name = malloc(20);
1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int dp = test_group->precision == DOUBLE_TEST ? 1 : 0;
1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int loops = dp ? 2 : 4;
1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fp_test_args_t * targs = &test_group->targs[i];
1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long frA_dp, * dst_dp;
1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned int frA_sp, * dst_sp;
1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   strcpy(name, test_group->name);
1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (do_aXp)
1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (dp)
1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         strcat(name, "adp");
1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         strcat(name, "asp");
1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (dp)
1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         strcat(name, "mdp");
1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      else
1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         strcat(name, "msp");
1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("#%d: %s ", dp? i/2 : i/4, name);
1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (k = 0; k < loops; k++) {
1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      a_idx = targs->fra_idx;
1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (k)
1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf(" AND ");
1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (dp) {
1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         frA_dp = *((unsigned long long *)&spec_fargs[a_idx]);
1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("%s(%016llx,%016llx,%016llx)", test_group->op, XT_arg[k], frA_dp, XB_arg[k]);
1183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
1184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned int * xt_sp = (unsigned int *)XT_arg;
1185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned int * xb_sp = (unsigned int *)XB_arg;
1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         frA_sp = *((unsigned int *)&spec_sp_fargs[a_idx]);
1187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("%s(%08x,%08x,%08x)", test_group->op, xt_sp[k], frA_sp, xb_sp[k]);
1188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      targs++;
1190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (dp) {
1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dst_dp = (unsigned long long *) &vec_out;
1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" => %016llx %016llx\n", dst_dp[0], dst_dp[1]);
1195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
1196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dst_sp = (unsigned int *) &vec_out;
1197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" => %08x %08x %08x %08x\n", dst_sp[0], dst_sp[1], dst_sp[2], dst_sp[3]);
1198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   free(name);
1200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* This function currently only supports double precision input arguments. */
1203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_vx_simple_scalar_fp_ops(void)
1204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
1206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k = 0;
1207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   build_special_fargs_table();
1209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = vx_simple_scalar_fp_tests[k].test_func)) {
1210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      unsigned long long * frap, * frbp, * dst;
1211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      unsigned int * pv;
1212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int idx;
1213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vx_fp_test_t test_group = vx_simple_scalar_fp_tests[k];
1214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Bool convToWord = (test_group.type == VX_CONV_WORD);
1215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (test_group.precision != DOUBLE_TEST) {
1216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         fprintf(stderr, "Unsupported single precision for scalar op in test_vx_aORm_fp_ops\n");
1217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         exit(1);
1218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      pv = (unsigned int *)&vec_out;
1220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // clear vec_out
1221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (idx = 0; idx < 4; idx++, pv++)
1222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         *pv = 0;
1223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* If num_tests is exactly equal to nb_special_fargs, this implies the
1225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * instruction being tested only requires one floating point argument
1226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * (e.g. xssqrtdp).
1227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
1228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (test_group.num_tests == nb_special_fargs && !test_group.targs) {
1229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         void * inB;
1230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         int i;
1231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (i = 0; i < nb_special_fargs; i++) {
1232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            inB = (void *)&spec_fargs[i];
1233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            frbp = (unsigned long long *)&spec_fargs[i];
1234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            memcpy(&vec_inB, inB, 8);
1235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            (*func)();
1236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dst = (unsigned long long *) &vec_out;
1237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("#%d: %s %016llx => %016llx\n", i, test_group.name, *frbp,
1238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   convToWord ? (*dst & 0x00000000ffffffffULL) : *dst);
1239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
1241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         void * inA, * inB;
1242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned int condreg, flags;
1243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         int isTdiv = (strstr(test_group.name, "xstdivdp") != NULL) ? 1 : 0;
1244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         int i;
1245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (i = 0; i < test_group.num_tests; i++) {
1246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            fp_test_args_t aTest = test_group.targs[i];
1247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            inA = (void *)&spec_fargs[aTest.fra_idx];
1248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            inB = (void *)&spec_fargs[aTest.frb_idx];
1249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            frap = (unsigned long long *)&spec_fargs[aTest.fra_idx];
1250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            frbp = (unsigned long long *)&spec_fargs[aTest.frb_idx];
1251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            // Only need to copy one doubleword into each vector's element 0
1252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            memcpy(&vec_inA, inA, 8);
1253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            memcpy(&vec_inB, inB, 8);
1254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            SET_FPSCR_ZERO;
1255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            SET_CR_XER_ZERO;
1256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            (*func)();
1257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            GET_CR(flags);
1258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (isTdiv) {
1259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               condreg = (flags & 0x000000f0) >> 4;
1260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf("#%d: %s %016llx,%016llx => cr %x\n", i, test_group.name, *frap, *frbp, condreg);
1261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else {
1262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               dst = (unsigned long long *) &vec_out;
1263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf("#%d: %s %016llx,%016llx => %016llx\n", i, test_group.name,
1264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      *frap, *frbp, *dst);
1265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
1269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
1270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_vx_aORm_fp_ops(void)
1274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* These ops need a third src argument, which is stored in element 0 of
1276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * VSX[XT] -- i.e., vec_out.  For the xs<ZZZ>m{d|s}p cases, VSX[XT] holds
1277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * src3 and VSX[XB] holds src2; for the xs<ZZZ>a{d|s}p cases, VSX[XT] holds
1278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * src2 and VSX[XB] holds src3.  The fp_test_args_t that holds the test
1279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * data (input args, result) contain only two inputs, so I arbitrarily
1280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * choose some spec_fargs elements for the third source argument.
1281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * Note that that by using the same input data for a given pair of
1282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * a{d|s}p/m{d|s}p-type instructions (by swapping the src2 and src3
1283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * arguments), the expected result should be the same.
1284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
1285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
1287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k;
1288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   char * test_name = (char *)malloc(20);
1289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   k = 0;
1290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_dot = False;
1291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   build_special_fargs_table();
1293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = vx_aORm_fp_tests[k].test_func)) {
1294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int i, stride;
1295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Bool repeat = False;
1296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Bool scalar = False;
1297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      unsigned long long * frap, * frbp, * dst;
1298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vx_fp_test_t test_group = vx_aORm_fp_tests[k];
1299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vx_fp_test_type test_type = test_group.type;
1300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      do_dp = test_group.precision == DOUBLE_TEST ? True : False;
1301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      frap = frbp = NULL;
1302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (test_type < VX_VECTOR_FP_MULT_AND_OP2) {
1304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            scalar = True;
1305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            strcpy(test_name, test_group.name);
1306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (!repeat) {
1307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               repeat = 1;
1308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               stride = 1;
1309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               // Only support double precision scalar ops in this function
1310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               if (do_dp) {
1311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  strcat(test_name, "adp");
1312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               } else {
1313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  fprintf(stderr, "Unsupported single precision for scalar op in test_vx_aORm_fp_ops\n");
1314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  exit(1);
1315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
1316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               do_aXp = True;
1317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else if (test_type < VX_BASIC_CMP) {
1319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         // Then it must be a VX_VECTOR_xxx type
1320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            stride = do_dp ? 2 : 4;
1321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (!repeat) {
1322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               // No need to work up the testcase name here, since that will be done in
1323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               // the print_vx_aORm_fp_result() function we'll call for vector-type ops.
1324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               repeat = 1;
1325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               do_aXp = True;
1326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
1328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("ERROR:  Invalid VX FP test type %d\n", test_type);
1329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            exit(1);
1330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengagain:
1333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < test_group.num_tests; i+=stride) {
1334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         void  * inA, * inB;
1335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         int m, fp_idx[4];
1336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned long long vsr_XT[2];
1337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned long long vsr_XB[2];
1338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         fp_test_args_t aTest = test_group.targs[i];
1339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (m = 0; m < stride; m++)
1340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            fp_idx[m] = i % (nb_special_fargs - stride) + m;
1341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* When repeat == True, we're on the first time through of one of the VX_FP_SMx
1343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * test types, meaning we're testing a xs<ZZZ>adp case, thus we have to swap
1344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * inputs as described above:
1345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          *    src2 <= VSX[XT]
1346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          *    src3 <= VSX[XB]
1347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
1348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (scalar) {
1349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            // For scalar op, only need to copy one doubleword into each vector's element 0
1350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            inA = (void *)&spec_fargs[aTest.fra_idx];
1351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            inB = (void *)&spec_fargs[aTest.frb_idx];
1352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            frap = (unsigned long long *)&spec_fargs[aTest.fra_idx];
1353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            memcpy(&vec_inA, inA, 8);
1354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (repeat) {
1355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               memcpy(&vec_out, inB, 8);  // src2
1356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               memcpy(&vec_inB, &spec_fargs[fp_idx[0]], 8);  //src3
1357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               frbp = (unsigned long long *)&spec_fargs[fp_idx[0]];
1358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else {
1359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               frbp = (unsigned long long *)&spec_fargs[aTest.frb_idx];
1360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               memcpy(&vec_inB, inB, 8);  // src2
1361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               memcpy(&vec_out, &spec_fargs[fp_idx[0]], 8);  //src3
1362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            memcpy(vsr_XT, &vec_out, 8);
1364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } else {
1365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            int j, loops = do_dp ? 2 : 4;
1366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            size_t len = do_dp ? 8 : 4;
1367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            void * vec_src = repeat ? (void *)&vec_inB : (void *)&vec_out;
1368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            for (j = 0; j < loops; j++) {
1369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               if (do_dp)
1370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  memcpy(vec_src + (j * len), &spec_fargs[fp_idx[j]], len);
1371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               else
1372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  memcpy(vec_src + (j * len), &spec_sp_fargs[fp_idx[j]], len);
1373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (do_dp)
1375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               setup_dp_fp_args(&test_group.targs[i], repeat);
1376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            else
1377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               setup_sp_fp_args(&test_group.targs[i], repeat);
1378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            memcpy(vsr_XT, &vec_out, 16);
1380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            memcpy(vsr_XB, &vec_inB, 16);
1381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         (*func)();
1384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dst = (unsigned long long *) &vec_out;
1385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (test_type < VX_VECTOR_FP_MULT_AND_OP2)
1386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf( "#%d: %s %s(%016llx,%016llx,%016llx) = %016llx\n", i,
1387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    test_name, test_group.op, vsr_XT[0], *frap, *frbp, *dst );
1388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         else
1389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            print_vx_aORm_fp_result(vsr_XT, vsr_XB, &test_group, i);
1390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
1392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (repeat) {
1394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         repeat = 0;
1395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (test_type < VX_VECTOR_FP_MULT_AND_OP2) {
1396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               strcpy(test_name, test_group.name);
1397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               strcat(test_name, "mdp");
1398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         do_aXp = False;
1400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto again;
1401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
1403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf( "\n" );
1405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   free(test_name);
1406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_vx_vector_one_fp_arg(void)
1409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
1411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k;
1412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   k = 0;
1413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   build_special_fargs_table();
1414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = vx_vector_one_fp_arg_tests[k].test_func)) {
1416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int idx, i;
1417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vx_fp_test_t test_group = vx_vector_one_fp_arg_tests[k];
1418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Bool convToWord = (test_group.type == VX_CONV_WORD);
1419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Bool dp = (test_group.precision == DOUBLE_TEST) ? True : False;
1420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Bool xvrespTest = (strstr(test_group.name , "xvresp") != NULL) ? True: False;
1421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int stride = dp ? 2 : 4;
1422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < test_group.num_tests; i+=stride) {
1424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned int * pv;
1425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         void * inB;
1426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         pv = (unsigned int *)&vec_out;
1428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         // clear vec_out
1429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (idx = 0; idx < 4; idx++, pv++)
1430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            *pv = 0;
1431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (dp) {
1433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            int j;
1434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            unsigned long long * frB_dp, *dst_dp;
1435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            for (j = 0; j < 2; j++) {
1436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               inB = (void *)&spec_fargs[i + j];
1437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               // copy double precision FP into vector element i
1438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               memcpy(((void *)&vec_inB) + (j * 8), inB, 8);
1439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            // execute test insn
1441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            (*func)();
1442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dst_dp = (unsigned long long *) &vec_out;
1443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("#%d: %s ", i/2, test_group.name);
1444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            for (j = 0; j < 2; j++) {
1445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               if (j)
1446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  printf("; ");
1447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               frB_dp = (unsigned long long *)&spec_fargs[i + j];
1448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf("%s(%016llx)", test_group.op, *frB_dp);
1449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf(" = %016llx", convToWord ? (dst_dp[j] & 0x00000000ffffffffULL) : dst_dp[j]);
1450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("\n");
1452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } else {
1453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            int j;
1454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            unsigned int * frB_sp, * dst_sp;
1455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            for (j = 0; j < 4; j++) {
1457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               inB = (void *)&spec_sp_fargs[i + j];
1458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               // copy single precision FP into vector element i
1459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               memcpy(((void *)&vec_inB) + (j * 4), inB, 4);
1460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            // execute test insn
1462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            (*func)();
1463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dst_sp = (unsigned int *) &vec_out;
1464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            // print result
1465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("#%d: %s ", i/4, test_group.name);
1466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            for (j = 0; j < 4; j++) {
1467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               if (j)
1468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  printf("; ");
1469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               frB_sp = (unsigned int *)&spec_sp_fargs[i + j];
1470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf("%s(%08x)", test_group.op, *frB_sp);
1471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               if (xvrespTest) {
1472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  float calc_diff = fabs(spec_sp_fargs[i + j]/256);
1473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  float sp_res;
1474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  memcpy(&sp_res, &dst_sp[j], 4);
1475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  float div_result = 1/spec_sp_fargs[i + j];
1476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  float real_diff = fabs(sp_res - div_result);
1477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  printf( " ==> %s",
1478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          ( ( sp_res == div_result )
1479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   || ( isnan(sp_res) && isnan(div_result) )
1480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   || ( real_diff <= calc_diff ) ) ? "PASS"
1481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                                     : "FAIL");
1482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               } else {
1483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  printf(" = %08x", dst_sp[j]);
1484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
1485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
1486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("\n");
1487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
1490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
1491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* This function assumes the instruction being tested requires two args. */
1496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_vx_vector_fp_ops(void)
1497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
1499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k;
1500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   k = 0;
1501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   build_special_fargs_table();
1502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = vx_vector_fp_tests[k].test_func)) {
1504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int idx, i, repeat = 1;
1505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vx_fp_test_t test_group = vx_vector_fp_tests[k];
1506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int stride = test_group.precision == DOUBLE_TEST ? 2 : 4;
1507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      do_dot = False;
1508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengagain:
1510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < test_group.num_tests; i+=stride) {
1511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned int * pv, condreg;
1512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned int flags;
1513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         pv = (unsigned int *)&vec_out;
1515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (test_group.precision == DOUBLE_TEST)
1516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            setup_dp_fp_args(&test_group.targs[i], False);
1517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         else
1518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            setup_sp_fp_args(&test_group.targs[i], False);
1519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         // clear vec_out
1521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (idx = 0; idx < 4; idx++, pv++)
1522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            *pv = 0;
1523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         // execute test insn
1525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         SET_FPSCR_ZERO;
1526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         SET_CR_XER_ZERO;
1527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         (*func)();
1528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         GET_CR(flags);
1529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (test_group.type == VX_BASIC_CMP) {
1530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            condreg = (flags & 0x000000f0) >> 4;
1531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } else {
1532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            condreg = VX_NOT_CMP_OP;
1533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         print_vector_fp_result(condreg, &test_group, i);
1535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf("\n");
1537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (repeat && test_group.type == VX_BASIC_CMP) {
1538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         repeat = 0;
1539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         do_dot = True;
1540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto again;
1541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
1543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
1544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// The div doubleword test data
1549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengsigned long long div_dw_tdata[13][2] = {
1550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 4, -4 },
1551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 4, -3 },
1552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 4, 4 },
1553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 4, -5 },
1554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 3, 8 },
1555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 0x8000000000000000ULL, 0xa },
1556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 0x50c, -1 },
1557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 0x50c, -4096 },
1558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 0x1234fedc, 0x8000a873 },
1559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 0xabcd87651234fedcULL, 0xa123b893 },
1560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 0x123456789abdcULL, 0 },
1561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 0, 2 },
1562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       { 0x77, 0xa3499 }
1563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
1564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define dw_tdata_len (sizeof(div_dw_tdata)/sizeof(signed long long)/2)
1565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// The div word test data
1567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengunsigned int div_w_tdata[6][2] = {
1568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { 0, 2 },
1569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { 2, 0 },
1570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { 0x7abc1234, 0xf0000000 },
1571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { 0xfabc1234, 5 },
1572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { 77, 66 },
1573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { 5, 0xfabc1234 },
1574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
1575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define w_tdata_len (sizeof(div_w_tdata)/sizeof(unsigned int)/2)
1576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct div_ext_test
1578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t test_func;
1580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   const char *name;
1581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int num_tests;
1582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   div_type_t div_type;
1583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   precision_type_t precision;
1584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} div_ext_test_t;
1585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic div_ext_test_t div_tests[] = {
1587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__
1588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   { &test_divde, "divde", dw_tdata_len, DIV_BASE, DOUBLE_TEST },
1589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   { &test_divde, "divdeo", dw_tdata_len, DIV_OE, DOUBLE_TEST },
1590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
1591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   { &test_divweu, "divweu", w_tdata_len, DIV_BASE, SINGLE_TEST },
1592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   { &test_divweu, "divweuo", w_tdata_len, DIV_OE, SINGLE_TEST },
1593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   { NULL, NULL, 0, 0, 0 }
1594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
1595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_div_extensions(void)
1597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
1599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k;
1600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   k = 0;
1601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = div_tests[k].test_func)) {
1603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int i, repeat = 1;
1604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      div_ext_test_t test_group = div_tests[k];
1605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      do_dot = False;
1606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengagain:
1608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < test_group.num_tests; i++) {
1609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         unsigned int condreg;
1610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (test_group.div_type == DIV_OE)
1612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            do_OE = True;
1613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         else
1614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            do_OE = False;
1615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (test_group.precision == DOUBLE_TEST) {
1617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            r14 = div_dw_tdata[i][0];
1618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            r15 = div_dw_tdata[i][1];
1619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } else {
1620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            r14 = div_w_tdata[i][0];
1621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            r15 = div_w_tdata[i][1];
1622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         // execute test insn
1624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         (*func)();
1625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         condreg = (div_flags & 0xf0000000) >> 28;
1626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("#%d: %s%s: ", i, test_group.name, do_dot ? "." : "");
1627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (test_group.precision == DOUBLE_TEST) {
1628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("0x%016llx / 0x%016llx = 0x%016llx;",
1629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   div_dw_tdata[i][0], div_dw_tdata[i][1], (signed long long) r17);
1630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } else {
1631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("0x%08x / 0x%08x = 0x%08x;",
1632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   div_w_tdata[i][0], div_w_tdata[i][1], (unsigned int) r17);
1633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
1634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf(" CR=%x; XER=%x\n", condreg, div_xer);
1635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf("\n");
1637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (repeat) {
1638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         repeat = 0;
1639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         do_dot = True;
1640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto again;
1641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
1643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
1644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fct_ops(void)
1649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
1651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k;
1652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   k = 0;
1653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = fct_tests[k].test_func)) {
1655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int i, repeat = 1;
1656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      simple_test_t test_group = fct_tests[k];
1657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      do_dot = False;
1658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengagain:
1660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 0; i < nb_special_fargs; i++) {
1661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         double result;
1662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SINGLE_MASK 0x00000000FFFFFFFFULL
1663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         f14 = spec_fargs[i];
1665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         // execute test insn
1666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         SET_FPSCR_ZERO;
1667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         (*func)();
1668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         result = f17;
1669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("#%d: %s%s: ", i, test_group.name, do_dot ? "." : "");
1670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("0x%016llx (%e) ==> 0x%016llx\n",
1671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                *((unsigned long long *)(&spec_fargs[i])), spec_fargs[i],
1672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                test_group.precision == SINGLE_TEST ? (SINGLE_MASK &
1673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         *((unsigned long long *)(&result))) :
1674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         *((unsigned long long *)(&result)));
1675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf("\n");
1677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (repeat) {
1678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         repeat = 0;
1679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         do_dot = True;
1680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto again;
1681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
1682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
1683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
1684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__
1688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid test_stdbrx(void)
1689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long store, val = 0xdeadbacf12345678ULL;
1691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("stdbrx: 0x%llx ==> ", val);
1692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   r17 = (HWord_t)val;
1693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   r14 = (HWord_t)&store;
1694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("stdbrx %0, 0, %1" : : "r"(r17), "r"(r14));
1695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("0x%llx\n", store);
1696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf( "\n" );
1697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
1699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic test_table_t
1701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         all_tests[] =
1702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    { &test_vx_vector_one_fp_arg,
1704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      "Test VSX vector single arg instructions"},
1705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    { &test_vx_vector_fp_ops,
1706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      "Test VSX floating point compare and basic arithmetic instructions" },
1707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__
1708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { &test_bpermd,
1709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "Test bit permute double"},
1710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
1711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { &test_xxsel,
1712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         "Test xxsel instruction" },
1713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { &test_xxspltw,
1714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         "Test xxspltw instruction" },
1715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { &test_div_extensions,
1716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "Test div extensions" },
1717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { &test_fct_ops,
1718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "Test floating point convert [word | doubleword] unsigned, with round toward zero" },
1719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__
1720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { &test_stdbrx,
1721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      "Test stdbrx instruction"},
1722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
1723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { &test_vx_aORm_fp_ops,
1724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      "Test floating point arithmetic instructions -- with a{d|s}p or m{d|s}p"},
1725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { &test_vx_simple_scalar_fp_ops,
1726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      "Test scalar floating point arithmetic instructions"},
1727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     { NULL, NULL }
1728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
1729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif // HAS_VSX
1730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main(int argc, char *argv[])
1732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef HAS_VSX
1734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_table_t aTest;
1736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
1737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i = 0;
1738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = all_tests[i].test_category)) {
1740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      aTest = all_tests[i];
1741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "%s\n", aTest.name );
1742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      (*func)();
1743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      i++;
1744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (spec_fargs)
1746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     free(spec_fargs);
1747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (spec_sp_fargs)
1748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     free(spec_sp_fargs);
1749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif // HAS _VSX
1751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
1753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1754