1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*  Copyright (C) 2012 IBM
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Author: Maynard Johnson <maynardj@us.ibm.com>
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         Carl Love <carll@us.ibm.com>
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This program is free software; you can redistribute it and/or
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng modify it under the terms of the GNU General Public License as
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng published by the Free Software Foundation; either version 2 of the
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng License, or (at your option) any later version.
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This program is distributed in the hope that it will be useful, but
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng WITHOUT ANY WARRANTY; without even the implied warranty of
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng General Public License for more details.
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng You should have received a copy of the GNU General Public License
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng along with this program; if not, write to the Free Software
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 02111-1307, USA.
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The GNU General Public License is contained in the file COPYING.
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h>
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdlib.h>
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h>
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <string.h>
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <elf.h>
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <link.h>
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define PPC_FEATURE_HAS_VSX  0x00000080 /* Vector Scalar Extension. */
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(HAS_DFP)
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f14 __asm__ ("fr14");
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f15 __asm__ ("fr15");
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f16 __asm__ ("fr16");
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f17 __asm__ ("fr17");
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f18 __asm__ ("fr18");
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f19 __asm__ ("fr19");
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef unsigned char Bool;
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define True 1
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define False 0
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_FPSCR_ZERO \
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng		do { double _d = 0.0;		                           \
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng		__asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng		} while (0)
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GET_FPSCR(_arg) \
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  __asm__ __volatile__ ("mffs %0"  : "=f"(_arg) )
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_FPSCR_DRN \
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  __asm__ __volatile__ ("mtfsf  1, %0, 0, 1" :  : "f"(f14) )
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SH_0  0
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SH_1  1
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SH_2  15
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SH_3  63
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define NUM_RND_MODES  8
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define CONDREG_MASK  0x0f000000
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define CONDREG_SHIFT 24
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic char ** my_envp;
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic inline char** __auxv_find(void)
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   char **result = my_envp;
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Scan over the env vector looking for the ending NULL */
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (; *result != NULL; ++result) {
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Bump the pointer one more step, which should be the auxv. */
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return ++result;
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic unsigned long fetch_at_hwcap(void)
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   static unsigned long auxv_hwcap = 0;
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i;
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ElfW(auxv_t) * auxv_buf = NULL;
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (auxv_hwcap)
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return auxv_hwcap;
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   auxv_buf = (ElfW(auxv_t)*) __auxv_find();
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 0; auxv_buf[i].a_type != AT_NULL; i++)
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (auxv_buf[i].a_type == AT_HWCAP) {
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         auxv_hwcap = auxv_buf[i].a_un.a_val;
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return auxv_hwcap;
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint get_vsx(void)
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Check to see if the AUX vector has the bit set indicating the HW
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * supports the vsx instructions.  This implies the processor is
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * at least a POWER 7.
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long hwcap;
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   hwcap = fetch_at_hwcap();
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if ((hwcap & PPC_FEATURE_HAS_VSX) == PPC_FEATURE_HAS_VSX)
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return 1;
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* The assembly-level instructions being tested */
112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dscri (int shift)
113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch(shift) {
115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_0:
116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscri  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_0));
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_1:
120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscri  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_1));
121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_2:
124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscri  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_2));
125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_3:
128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscri  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_3));
129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   default:
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" dscri, unsupported shift case %d\n", shift);
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dscli (int shift)
136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch(shift) {
138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_0:
139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscli  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_0));
140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_1:
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscli  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_1));
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_2:
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscli  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_2));
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_3:
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscli  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_3));
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   default:
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" dscli, unsupported shift case %d\n", shift);
155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dctdp (void)
159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("dctdp  %0, %1" : "=f" (f18) : "f" (f14));
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_drsp (void)
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("drsp  %0, %1" : "=f" (f18) : "f" (f14));
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dctfix (void)
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("dctfix  %0, %1" : "=f" (f18) : "f" (f14));
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Power 7 and newer processors support this instruction */
174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dcffix (void)
175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("dcffix  %0, %1" : "=f" (f18) : "f" (f14));
177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dscriq (int shift)
180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch(shift) {
182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_0:
183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscriq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_0));
184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_1:
186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscriq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_1));
187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_2:
189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscriq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_2));
190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_3:
192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscriq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_3));
193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   default:
195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" dscriq, unsupported shift case %d\n", shift);
196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dscliq (int shift)
200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch(shift) {
202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_0:
203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscliq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_0));
204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_1:
206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscliq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_1));
207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_2:
209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscliq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_2));
210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case SH_3:
212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      __asm__ __volatile__ ("dscliq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_3));
213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   default:
215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf(" dscliq, unsupported shift case %d\n", shift);
216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dctqpq (void)
220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("dctqpq  %0, %1" : "=f" (f18) : "f" (f14));
222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dctfixq (void)
225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("dctfixq  %0, %1" : "=f" (f18) : "f" (f14));
227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_drdpq (void)
230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("drdpq  %0, %1" : "=f" (f18) : "f" (f14));
232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void _test_dcffixq (void)
235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("dcffixq  %0, %1" : "=f" (f18) : "f" (f14));
237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef void (*test_func_t)();
240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef void (*test_func_main_t)(int);
241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef void (*test_func_shift_t)(int);
242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct test_table
243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_main_t test_category;
245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   char * name;
246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} test_table_t;
247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic unsigned long long dfp128_vals[] = {
249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           // Some finite numbers
250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x2207c00000000000ULL, 0x0000000000000e50ULL,
251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x2f07c00000000000ULL, 0x000000000014c000ULL,  //large number
252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0xa207c00000000000ULL, 0x00000000000000e0ULL,
253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x2206c00000000000ULL, 0x00000000000000cfULL,
254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0xa205c00000000000ULL, 0x000000010a395bcfULL,
255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x6209400000fd0000ULL, 0x00253f1f534acdd4ULL, // a small number
256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x000400000089b000ULL, 0x0a6000d000000049ULL, // very small number
257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           // flavors of zero
258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x2208000000000000ULL, 0x0000000000000000ULL,
259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0xa208000000000000ULL, 0x0000000000000000ULL, // negative
260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0xa248000000000000ULL, 0x0000000000000000ULL,
261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           // flavors of NAN
262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x7c00000000000000ULL, 0x0000000000000000ULL, // quiet
263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0xfc00000000000000ULL, 0xc00100035b007700ULL,
264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x7e00000000000000ULL, 0xfe000000d0e0a0d0ULL, // signaling
265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           // flavors of Infinity
266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0x7800000000000000ULL, 0x0000000000000000ULL,
267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0xf800000000000000ULL, 0x0000000000000000ULL, // negative
268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           0xf900000000000000ULL, 0x0000000000000000ULL
269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic unsigned long long int64_vals[] = {
272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          // I64 values
273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x0ULL,                // zero
274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x1ULL,                // one
275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xffffffffffffffffULL, // minus one
276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x2386f26fc0ffffULL,   // 9999999999999999
277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xffdc790d903f0001ULL, // -9999999999999999
278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x462d53c8abac0ULL,    // 1234567890124567
279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xfffb9d2ac3754540ULL, // -1234567890124567
280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic unsigned long long dfp64_vals[] = {
283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          // various finite numbers
284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x2234000000000e50ULL,
285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x223400000014c000ULL,
286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xa2340000000000e0ULL,// negative
287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x22240000000000cfULL,
288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xa21400010a395bcfULL,// negative
289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x6e4d3f1f534acdd4ULL,// large number
290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x000400000089b000ULL,// very small number
291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          // flavors of zero
292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x2238000000000000ULL,
293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xa238000000000000ULL,
294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x4248000000000000ULL,
295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          // flavors of NAN
296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x7e34000000000111ULL,
297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xfe000000d0e0a0d0ULL,//signaling
298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xfc00000000000000ULL,//quiet
299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          // flavors of Infinity
300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x7800000000000000ULL,
301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0xf800000000000000ULL,//negative
302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          0x7a34000000000000ULL,
303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct dfp_test_args {
307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int fra_idx;
308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int frb_idx;
309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} dfp_test_args_t;
310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Index pairs from dfp64_vals or dfp128_vals array to be used with
313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * dfp_two_arg_tests */
314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic dfp_test_args_t int64_args_x1[] = {
315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  /*                        {int64 input val, unused } */
316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          {0, 0},
317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          {1, 0},
318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          {2, 0},
319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          {3, 0},
320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          {4, 0},
321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          {5, 0},
322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          {6, 0},
323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic dfp_test_args_t dfp_2args_x1[] = {
326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  /*                               {dfp_arg, shift_arg} */
327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {0, SH_0},
328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {0, SH_1},
329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {0, SH_2},
330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {0, SH_3},
331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {5, SH_0},
332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {5, SH_1},
333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {5, SH_2},
334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {5, SH_3},
335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {6, SH_0},
336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {6, SH_1},
337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {6, SH_2},
338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {6, SH_3},
339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {7, SH_0},
340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {7, SH_1},
341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {7, SH_2},
342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {7, SH_3},
343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {10, SH_0},
344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {10, SH_1},
345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {10, SH_2},
346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {10, SH_3},
347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {13, SH_0},
348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {13, SH_1},
349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {13, SH_2},
350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {13, SH_3},
351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Index pairs from dfp64_vals array to be used with dfp_one_arg_tests */
354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic dfp_test_args_t dfp_1args_x1[] = {
355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  /*                               {dfp_arg, unused} */
356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {0, 0},
357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {1, 0},
358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {2, 0},
359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {3, 0},
360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {4, 0},
361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {5, 0},
362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {6, 0},
363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {7, 0},
364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {8, 0},
365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {9, 0},
366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {10, 0},
367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {11, 0},
368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {12, 0},
369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {13, 0},
370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         {14, 0},
371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum {
374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   LONG_TEST,
375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   QUAD_TEST
376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} precision_type_t;
377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct dfp_test
379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t test_func;
381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   const char * name;
382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dfp_test_args_t * targs;
383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int num_tests;
384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   precision_type_t precision;
385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   const char * op;
386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Bool cr_supported;
387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} dfp_test_t;
388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* The dcffix and dcffixq tests are a little different in that they both take
390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * an I64 input.
391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */
392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic dfp_test_t
393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengdfp_dcffix_dcffixq_tests[] = {
394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { &_test_dcffixq,"dcffixq", int64_args_x1, 7, QUAD_TEST, "I64S->D128", True},
395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              /* Power 7 instruction */
396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { &_test_dcffix, "dcffix",  int64_args_x1, 7, LONG_TEST, "I64S->D64", True},
397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              { NULL, NULL, NULL, 0, 0, NULL}
398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic dfp_test_t
401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengdfp_one_arg_tests[] = {
402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_dctdp,  "dctdp",   dfp_1args_x1, 15, LONG_TEST, "D32->D64", True},
403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_drsp,   "drsp",    dfp_1args_x1, 15, LONG_TEST, "D64->D32", True},
404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_dctfix, "dctfix",  dfp_1args_x1, 15, LONG_TEST, "D64->I64S", True},
405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_dctqpq, "dctqpq",  dfp_1args_x1, 15, QUAD_TEST, "D64->D128", True},
406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_dctfixq,"dctfixq", dfp_1args_x1, 15, QUAD_TEST, "D128->I64S", True},
407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_drdpq,  "drdpq",   dfp_1args_x1, 15, QUAD_TEST, "D128->D64", True},
408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { NULL, NULL, NULL, 0, 0, NULL}
409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic dfp_test_t
413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengdfp_two_arg_tests[] = {
414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_dscri,  "dscri",   dfp_2args_x1, 20, LONG_TEST, ">>", True},
415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_dscli,  "dscli",   dfp_2args_x1, 20, LONG_TEST, "<<", True},
416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_dscriq, "dscriq",  dfp_2args_x1, 20, QUAD_TEST, ">>", True},
417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { &_test_dscliq, "dscliq",  dfp_2args_x1, 20, QUAD_TEST, "<<", True},
418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       { NULL, NULL, NULL, 0, 0, NULL}
419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid set_rounding_mode(unsigned long long rnd_mode)
422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   double fpscr;
424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long * hex_fpscr = (unsigned long long *)&fpscr;
425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *hex_fpscr = 0ULL;
427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ __volatile__ ("mffs %0"  : "=f"(f14));
428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fpscr = f14;
429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *hex_fpscr &= 0xFFFFFFF0FFFFFFFFULL;
430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   *hex_fpscr |= (rnd_mode << 32);
431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   f14 = fpscr;
432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   SET_FPSCR_DRN;
433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_dfp_one_arg_ops(int unused)
436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long u0, u0x;
439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   double res, d0, *d0p;
440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   double d0x, *d0xp;
441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long round_mode;
442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k = 0;
443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   u0x = 0;
445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d0p = &d0;
446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d0xp = &d0x;
447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = dfp_one_arg_tests[k].test_func)) {
449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int i;
450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (round_mode = 0; round_mode < NUM_RND_MODES; round_mode++) {
452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Do each test with each of the possible rounding modes */
453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dfp_test_t test_group = dfp_one_arg_tests[k];
454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("\ntest with rounding mode %lu \n", round_mode);
456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* The set_rounding_mode() uses the global value f14. Call the
457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * function before setting up the test for the specific instruction
458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * to avoid avoid conflicts using f14.
459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         set_rounding_mode(round_mode);
461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (i = 0; i < test_group.num_tests; i++) {
463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (test_group.precision == LONG_TEST) {
465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               u0 = dfp64_vals[test_group.targs[i].fra_idx];
466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else {
467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               u0 = dfp128_vals[test_group.targs[i].fra_idx * 2];
468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               u0x = dfp128_vals[(test_group.targs[i].fra_idx * 2) + 1];
469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            *(unsigned long long *)d0p = u0;
472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            f14 = d0;
473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (test_group.precision == QUAD_TEST) {
474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	       *(unsigned long long *)d0xp = u0x;
475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                f15 = d0x;
476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            (*func)();
479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            res = f18;
480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("%s %016llx", test_group.name, u0);
482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (test_group.precision == LONG_TEST) {
484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf(" %s  => %016llx",
485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      test_group.op, *((unsigned long long *)(&res)));
486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else {
487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               double resx = f19;
488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf(" %016llx %s ==> %016llx %016llx",
489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      u0x, test_group.op,
490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      *((unsigned long long *)(&res)),
491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      *((unsigned long long *)(&resx)));
492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("\n");
494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_dfp_two_arg_ops(int unused)
503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Shift instructions: first argument is the DFP source, second argument
504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * is 6 bit shift amount.
505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */
506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_shift_t func;
508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long u0, u0x;
509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned int shift_by;
510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   double res, d0, *d0p;
511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   double d0x, *d0xp;
512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long round_mode;
513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k = 0;
514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   u0x = 0;
516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d0p = &d0;
517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d0xp = &d0x;
518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = dfp_two_arg_tests[k].test_func)) {
520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int i;
521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (round_mode = 0; round_mode < NUM_RND_MODES; round_mode++) {
523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Do each test with each of the possible rounding modes */
524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dfp_test_t test_group = dfp_two_arg_tests[k];
525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("\ntest with rounding mode %lu \n", round_mode);
527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* The set_rounding_mode() uses the global value f14. Call the
529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * function before setting up the test for the specific instruction
530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * to avoid avoid conflicts using f14.
531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         set_rounding_mode(round_mode);
533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (i = 0; i < test_group.num_tests; i++) {
535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            shift_by = test_group.targs[i].frb_idx;
537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (test_group.precision == LONG_TEST) {
539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               u0 = dfp64_vals[test_group.targs[i].fra_idx];
540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else {
541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               u0 = dfp128_vals[test_group.targs[i].fra_idx * 2];
542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               u0x = dfp128_vals[(test_group.targs[i].fra_idx * 2) + 1];
543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            *(unsigned long long *)d0p = u0;
546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            f14 = d0;
547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (test_group.precision == QUAD_TEST) {
548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               *(unsigned long long *)d0xp = u0x;
549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               f15 = d0x;
550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            (*func)(shift_by);
553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            res = f18;
554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("%s %016llx", test_group.name, u0);
556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (test_group.precision) {
558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf(" %s %-3d => %016llx",
559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      test_group.op, shift_by, *((unsigned long long *)(&res)));
560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else {
561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               double resx = f19;
562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf(" %016llx %s %-3d  ==> %016llx %016llx",
563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      u0x, test_group.op, shift_by,
564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      *((unsigned long long *)(&res)),
565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      *((unsigned long long *)(&resx)));
566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("\n" );
568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_dcffix_dcffixq(int has_vsx)
577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   unsigned long long u0;
580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   double res, d0, *d0p;
581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int k = 0, round_mode;
582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d0p = &d0;
584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = dfp_dcffix_dcffixq_tests[k].test_func)) {
587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      int i;
588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if ((!has_vsx) && (!strcmp("dcffix", dfp_dcffix_dcffixq_tests[k].name))) {
590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         k++;
591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* The test instruction is dcffix it is supported on POWER 7
592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * and newer processors.  Skip if not POWER 7 or newer.
593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         continue;
595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (round_mode = 0; round_mode < NUM_RND_MODES; round_mode++) {
598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Do each test with each of the possible rounding modes */
599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dfp_test_t test_group = dfp_dcffix_dcffixq_tests[k];
600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         printf("\ntest with rounding mode %u \n", round_mode);
602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* The set_rounding_mode() uses the global value f14. Call the
604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * function before setting up the test for the specific instruction
605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * to avoid avoid conflicts using f14.
606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         set_rounding_mode(round_mode);
608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         for (i = 0; i < test_group.num_tests; i++) {
610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* The instructions take I64 inputs */
612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            u0 = int64_vals[test_group.targs[i].fra_idx];
613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            *(unsigned long long *)d0p = u0;
615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            f14 = d0;
616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            (*func)();
618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            res = f18;
619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("%s %016llx", test_group.name, u0);
621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (test_group.precision) {
623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf(" %s  => %016llx",
624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      test_group.op, *((unsigned long long *)(&res)));
625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else {
626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               double resx = f19;
627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               printf(" %s ==> %016llx %016llx",
628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      test_group.op,
629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      *((unsigned long long *)(&res)),
630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      *((unsigned long long *)(&resx)));
631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("\n" );
633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      k++;
637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "\n" );
638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic test_table_t
642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengall_tests[] =
643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   { &test_dfp_one_arg_ops,
645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "Test DFP fomat conversion instructions" },
646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   { &test_dfp_two_arg_ops,
647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "Test DFP shift instructions" },
648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   { test_dcffix_dcffixq,
649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "Test DCFFIX and DCFFIXQ instructions" },
650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   { NULL, NULL }
651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif // HAS_DFP
653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main(int argc, char ** argv, char ** envp) {
655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(HAS_DFP)
656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_table_t aTest;
657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_func_t func;
658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i = 0, has_vsx;
659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If the processor has the VSX functionality then it is POWER 7
661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    * or newer.
662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    */
663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   my_envp = envp;
664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   has_vsx = get_vsx();
665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   while ((func = all_tests[i].test_category)) {
667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      aTest = all_tests[i];
668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf( "%s\n", aTest.name );
669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      (*func)(has_vsx);
670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      i++;
671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif // HAS_DFP
674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
676