1ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj/*  Copyright (C) 2012 IBM
2ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
3ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj Author: Maynard Johnson <maynardj@us.ibm.com>
4ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         Carl Love <carll@us.ibm.com>
5ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
6ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj This program is free software; you can redistribute it and/or
7ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj modify it under the terms of the GNU General Public License as
8ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj published by the Free Software Foundation; either version 2 of the
9ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj License, or (at your option) any later version.
10ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
11ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj This program is distributed in the hope that it will be useful, but
12ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj WITHOUT ANY WARRANTY; without even the implied warranty of
13ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj General Public License for more details.
15ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
16ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj You should have received a copy of the GNU General Public License
17ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj along with this program; if not, write to the Free Software
18ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj 02111-1307, USA.
20ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
21ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj The GNU General Public License is contained in the file COPYING.
22ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj */
23ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
24ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#include <stdio.h>
25ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#include <stdlib.h>
26ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#include <stdint.h>
27ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#include <string.h>
28ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#include <elf.h>
29ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#include <link.h>
30ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
31ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define PPC_FEATURE_HAS_VSX  0x00000080 /* Vector Scalar Extension. */
32ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
33ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#if defined(HAS_DFP)
34ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
35ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjregister double f14 __asm__ ("fr14");
36ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjregister double f15 __asm__ ("fr15");
37ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjregister double f16 __asm__ ("fr16");
38ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjregister double f17 __asm__ ("fr17");
39ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjregister double f18 __asm__ ("fr18");
40ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjregister double f19 __asm__ ("fr19");
41ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
42ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjtypedef unsigned char Bool;
43ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define True 1
44ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define False 0
45ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
46ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define SET_FPSCR_ZERO \
47ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj		do { double _d = 0.0;		                           \
48ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj		__asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
49ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj		} while (0)
50ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
51ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define GET_FPSCR(_arg) \
52ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj  __asm__ __volatile__ ("mffs %0"  : "=f"(_arg) )
53ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
54ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define SET_FPSCR_DRN \
55ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj  __asm__ __volatile__ ("mtfsf  1, %0, 0, 1" :  : "f"(f14) )
56ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
57ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define SH_0  0
58ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define SH_1  1
59ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define SH_2  15
60ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define SH_3  63
61ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
62ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define NUM_RND_MODES  8
63ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define CONDREG_MASK  0x0f000000
64ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#define CONDREG_SHIFT 24
65ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
66ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic char ** my_envp;
67ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic inline char** __auxv_find(void)
68ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
69ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   char **result = my_envp;
70ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   /* Scan over the env vector looking for the ending NULL */
71ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   for (; *result != NULL; ++result) {
72ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
73ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   /* Bump the pointer one more step, which should be the auxv. */
74ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   return ++result;
75ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
76ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
77ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic unsigned long fetch_at_hwcap(void)
78ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
79ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   static unsigned long auxv_hwcap = 0;
80ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   int i;
81ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   ElfW(auxv_t) * auxv_buf = NULL;
82ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
83ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   if (auxv_hwcap)
84ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      return auxv_hwcap;
85ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
86ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   auxv_buf = (ElfW(auxv_t)*) __auxv_find();
87ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   for (i = 0; auxv_buf[i].a_type != AT_NULL; i++)
88ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      if (auxv_buf[i].a_type == AT_HWCAP) {
89ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         auxv_hwcap = auxv_buf[i].a_un.a_val;
90ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         break;
91ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      }
92ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
93ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   return auxv_hwcap;
94ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
95ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
96ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjint get_vsx(void)
97ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
98ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   /* Check to see if the AUX vector has the bit set indicating the HW
99ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj    * supports the vsx instructions.  This implies the processor is
100ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj    * at least a POWER 7.
101ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj    */
102ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   unsigned long hwcap;
103ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
104ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   hwcap = fetch_at_hwcap();
105ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   if ((hwcap & PPC_FEATURE_HAS_VSX) == PPC_FEATURE_HAS_VSX)
106ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      return 1;
107ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
108ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   return 0;
109ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
110ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
111ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj/* The assembly-level instructions being tested */
112ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dscri (int shift)
113ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
114ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   switch(shift) {
115ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_0:
116ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscri  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_0));
117ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
118ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
119ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_1:
120ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscri  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_1));
121ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
122ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
123ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_2:
124ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscri  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_2));
125ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
126ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
127ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_3:
128ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscri  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_3));
129ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
130ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   default:
131ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      printf(" dscri, unsupported shift case %d\n", shift);
132ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
133ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
134ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
135ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dscli (int shift)
136ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
137ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   switch(shift) {
138ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_0:
139ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscli  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_0));
140ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
141ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
142ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_1:
143ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscli  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_1));
144ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
145ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
146ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_2:
147ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscli  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_2));
148ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
149ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
150ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_3:
151ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscli  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_3));
152ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
153ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   default:
154ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      printf(" dscli, unsupported shift case %d\n", shift);
155ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
156ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
157ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
158ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dctdp (void)
159ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
160ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("dctdp  %0, %1" : "=f" (f18) : "f" (f14));
161ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
162ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
163ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_drsp (void)
164ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
165ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("drsp  %0, %1" : "=f" (f18) : "f" (f14));
166ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
167ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
168ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dctfix (void)
169ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
170ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("dctfix  %0, %1" : "=f" (f18) : "f" (f14));
171ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
172ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
173ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj/* Power 7 and newer processors support this instruction */
174ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dcffix (void)
175ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
176ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("dcffix  %0, %1" : "=f" (f18) : "f" (f14));
177ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
178ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
179ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dscriq (int shift)
180ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
181ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   switch(shift) {
182ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_0:
183ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscriq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_0));
184ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
185ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_1:
186ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscriq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_1));
187ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
188ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_2:
189ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscriq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_2));
190ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
191ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_3:
192ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscriq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_3));
193ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
194ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   default:
195ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      printf(" dscriq, unsupported shift case %d\n", shift);
196ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
197ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
198ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
199ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dscliq (int shift)
200ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
201ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   switch(shift) {
202ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_0:
203ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscliq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_0));
204ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
205ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_1:
206ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscliq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_1));
207ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
208ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_2:
209ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscliq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_2));
210ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
211ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   case SH_3:
212ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      __asm__ __volatile__ ("dscliq  %0, %1, %2" : "=f" (f18) : "f" (f14), "i" (SH_3));
213ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      break;
214ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   default:
215ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      printf(" dscliq, unsupported shift case %d\n", shift);
216ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
217ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
218ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
219ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dctqpq (void)
220ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
221ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("dctqpq  %0, %1" : "=f" (f18) : "f" (f14));
222ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
223ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
224ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dctfixq (void)
225ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
226ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("dctfixq  %0, %1" : "=f" (f18) : "f" (f14));
227ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
228ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
229ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_drdpq (void)
230ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
231ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("drdpq  %0, %1" : "=f" (f18) : "f" (f14));
232ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
233ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
234ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void _test_dcffixq (void)
235ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
236ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("dcffixq  %0, %1" : "=f" (f18) : "f" (f14));
237ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
238ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
239ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjtypedef void (*test_func_t)();
240ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjtypedef void (*test_func_main_t)(int);
241ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjtypedef void (*test_func_shift_t)(int);
242ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjtypedef struct test_table
243ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
244ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   test_func_main_t test_category;
245ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   char * name;
246ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj} test_table_t;
247ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
248ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic unsigned long long dfp128_vals[] = {
249ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           // Some finite numbers
250ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x2207c00000000000ULL, 0x0000000000000e50ULL,
251ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x2f07c00000000000ULL, 0x000000000014c000ULL,  //large number
252ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0xa207c00000000000ULL, 0x00000000000000e0ULL,
253ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x2206c00000000000ULL, 0x00000000000000cfULL,
254ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0xa205c00000000000ULL, 0x000000010a395bcfULL,
255ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x6209400000fd0000ULL, 0x00253f1f534acdd4ULL, // a small number
256ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x000400000089b000ULL, 0x0a6000d000000049ULL, // very small number
257ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           // flavors of zero
258ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x2208000000000000ULL, 0x0000000000000000ULL,
259ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0xa208000000000000ULL, 0x0000000000000000ULL, // negative
260ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0xa248000000000000ULL, 0x0000000000000000ULL,
261ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           // flavors of NAN
262ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x7c00000000000000ULL, 0x0000000000000000ULL, // quiet
263ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0xfc00000000000000ULL, 0xc00100035b007700ULL,
264ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x7e00000000000000ULL, 0xfe000000d0e0a0d0ULL, // signaling
265ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           // flavors of Infinity
266ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0x7800000000000000ULL, 0x0000000000000000ULL,
267ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0xf800000000000000ULL, 0x0000000000000000ULL, // negative
268ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                           0xf900000000000000ULL, 0x0000000000000000ULL
269ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
270ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
271ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic unsigned long long int64_vals[] = {
272ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          // I64 values
273ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x0ULL,                // zero
274ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x1ULL,                // one
275ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xffffffffffffffffULL, // minus one
276ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x2386f26fc0ffffULL,   // 9999999999999999
277ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xffdc790d903f0001ULL, // -9999999999999999
278ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x462d53c8abac0ULL,    // 1234567890124567
279ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xfffb9d2ac3754540ULL, // -1234567890124567
280ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
281ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
282ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic unsigned long long dfp64_vals[] = {
283ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          // various finite numbers
284ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x2234000000000e50ULL,
285ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x223400000014c000ULL,
286ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xa2340000000000e0ULL,// negative
287ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x22240000000000cfULL,
288ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xa21400010a395bcfULL,// negative
289ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x6e4d3f1f534acdd4ULL,// large number
290ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x000400000089b000ULL,// very small number
291ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          // flavors of zero
292ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x2238000000000000ULL,
293ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xa238000000000000ULL,
294ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x4248000000000000ULL,
295ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          // flavors of NAN
296ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x7e34000000000111ULL,
297ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xfe000000d0e0a0d0ULL,//signaling
298ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xfc00000000000000ULL,//quiet
299ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          // flavors of Infinity
300ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x7800000000000000ULL,
301ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0xf800000000000000ULL,//negative
302ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          0x7a34000000000000ULL,
303ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
304ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
305ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
306ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjtypedef struct dfp_test_args {
307ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   int fra_idx;
308ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   int frb_idx;
309ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj} dfp_test_args_t;
310ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
311ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
312ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj/* Index pairs from dfp64_vals or dfp128_vals array to be used with
313ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj * dfp_two_arg_tests */
314ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic dfp_test_args_t int64_args_x1[] = {
315ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj  /*                        {int64 input val, unused } */
316ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          {0, 0},
317ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          {1, 0},
318ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          {2, 0},
319ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          {3, 0},
320ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          {4, 0},
321ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          {5, 0},
322ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                          {6, 0},
323ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
324ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
325ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic dfp_test_args_t dfp_2args_x1[] = {
326ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj  /*                               {dfp_arg, shift_arg} */
327ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {0, SH_0},
328ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {0, SH_1},
329ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {0, SH_2},
330ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {0, SH_3},
331ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {5, SH_0},
332ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {5, SH_1},
333ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {5, SH_2},
334ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {5, SH_3},
335ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {6, SH_0},
336ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {6, SH_1},
337ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {6, SH_2},
338ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {6, SH_3},
339ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {7, SH_0},
340ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {7, SH_1},
341ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {7, SH_2},
342ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {7, SH_3},
343ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {10, SH_0},
344ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {10, SH_1},
345ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {10, SH_2},
346ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {10, SH_3},
347ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {13, SH_0},
348ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {13, SH_1},
349ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {13, SH_2},
350ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {13, SH_3},
351ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
352ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
353ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj/* Index pairs from dfp64_vals array to be used with dfp_one_arg_tests */
354ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic dfp_test_args_t dfp_1args_x1[] = {
355ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj  /*                               {dfp_arg, unused} */
356ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {0, 0},
357ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {1, 0},
358ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {2, 0},
359ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {3, 0},
360ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {4, 0},
361ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {5, 0},
362ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {6, 0},
363ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {7, 0},
364ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {8, 0},
365ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {9, 0},
366ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {10, 0},
367ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {11, 0},
368ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {12, 0},
369ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {13, 0},
370ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                                         {14, 0},
371ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
372ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
373ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjtypedef enum {
374ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   LONG_TEST,
375ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   QUAD_TEST
376ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj} precision_type_t;
377ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
378ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjtypedef struct dfp_test
379ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
380ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   test_func_t test_func;
381ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   const char * name;
382ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   dfp_test_args_t * targs;
383ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   int num_tests;
384ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   precision_type_t precision;
385ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   const char * op;
386ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   Bool cr_supported;
387ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj} dfp_test_t;
388ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
389ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj/* The dcffix and dcffixq tests are a little different in that they both take
390ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj * an I64 input.
391ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj */
392ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic dfp_test_t
393ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjdfp_dcffix_dcffixq_tests[] = {
394ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                              { &_test_dcffixq,"dcffixq", int64_args_x1, 7, QUAD_TEST, "I64S->D128", True},
395ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                              /* Power 7 instruction */
396ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                              { &_test_dcffix, "dcffix",  int64_args_x1, 7, LONG_TEST, "I64S->D64", True},
397ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                              { NULL, NULL, NULL, 0, 0, NULL}
398ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
399ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
400ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic dfp_test_t
401ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjdfp_one_arg_tests[] = {
402ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_dctdp,  "dctdp",   dfp_1args_x1, 15, LONG_TEST, "D32->D64", True},
403ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_drsp,   "drsp",    dfp_1args_x1, 15, LONG_TEST, "D64->D32", True},
404ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_dctfix, "dctfix",  dfp_1args_x1, 15, LONG_TEST, "D64->I64S", True},
405ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_dctqpq, "dctqpq",  dfp_1args_x1, 15, QUAD_TEST, "D64->D128", True},
406ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_dctfixq,"dctfixq", dfp_1args_x1, 15, QUAD_TEST, "D128->I64S", True},
407ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_drdpq,  "drdpq",   dfp_1args_x1, 15, QUAD_TEST, "D128->D64", True},
408ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { NULL, NULL, NULL, 0, 0, NULL}
409ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
410ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
411ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
412ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic dfp_test_t
413ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjdfp_two_arg_tests[] = {
414ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_dscri,  "dscri",   dfp_2args_x1, 20, LONG_TEST, ">>", True},
415ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_dscli,  "dscli",   dfp_2args_x1, 20, LONG_TEST, "<<", True},
416ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_dscriq, "dscriq",  dfp_2args_x1, 20, QUAD_TEST, ">>", True},
417ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { &_test_dscliq, "dscliq",  dfp_2args_x1, 20, QUAD_TEST, "<<", True},
418ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                       { NULL, NULL, NULL, 0, 0, NULL}
419ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
420ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
421ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjvoid set_rounding_mode(unsigned long long rnd_mode)
422ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
423ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   double fpscr;
424ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   unsigned long long * hex_fpscr = (unsigned long long *)&fpscr;
425ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
426ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   *hex_fpscr = 0ULL;
427ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   __asm__ __volatile__ ("mffs %0"  : "=f"(f14));
428ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   fpscr = f14;
429ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   *hex_fpscr &= 0xFFFFFFF0FFFFFFFFULL;
430ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   *hex_fpscr |= (rnd_mode << 32);
431ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   f14 = fpscr;
432ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   SET_FPSCR_DRN;
433ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
434ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
435ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void test_dfp_one_arg_ops(int unused)
436ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
437ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   test_func_t func;
438ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   unsigned long long u0, u0x;
439ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   double res, d0, *d0p;
440ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   double d0x, *d0xp;
441ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   unsigned long round_mode;
442ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   int k = 0;
443ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
444ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   u0x = 0;
445ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   d0p = &d0;
446ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   d0xp = &d0x;
447ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
448ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   while ((func = dfp_one_arg_tests[k].test_func)) {
449ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      int i;
450ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
451ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      for (round_mode = 0; round_mode < NUM_RND_MODES; round_mode++) {
452ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         /* Do each test with each of the possible rounding modes */
453ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         dfp_test_t test_group = dfp_one_arg_tests[k];
454ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
455ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         printf("\ntest with rounding mode %lu \n", round_mode);
456ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         /* The set_rounding_mode() uses the global value f14. Call the
457ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          * function before setting up the test for the specific instruction
458ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          * to avoid avoid conflicts using f14.
459ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          */
460ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         set_rounding_mode(round_mode);
461ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
462ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         for (i = 0; i < test_group.num_tests; i++) {
463ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
464ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            if (test_group.precision == LONG_TEST) {
465ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               u0 = dfp64_vals[test_group.targs[i].fra_idx];
466ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            } else {
467ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               u0 = dfp128_vals[test_group.targs[i].fra_idx * 2];
468ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               u0x = dfp128_vals[(test_group.targs[i].fra_idx * 2) + 1];
469ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            }
470ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
471ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            *(unsigned long long *)d0p = u0;
472ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            f14 = d0;
473ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            if (test_group.precision == QUAD_TEST) {
474ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj	       *(unsigned long long *)d0xp = u0x;
475ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                f15 = d0x;
476ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            }
477ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
478ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            (*func)();
479ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            res = f18;
480ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
481ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            printf("%s %016llx", test_group.name, u0);
482ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
483ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            if (test_group.precision == LONG_TEST) {
484ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               printf(" %s  => %016llx",
485ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      test_group.op, *((unsigned long long *)(&res)));
486ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            } else {
487ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               double resx = f19;
488ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               printf(" %016llx %s ==> %016llx %016llx",
489ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      u0x, test_group.op,
490ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      *((unsigned long long *)(&res)),
491ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      *((unsigned long long *)(&resx)));
492ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            }
493ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            printf("\n");
494ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         }
495ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      }
496ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
497ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      k++;
498ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      printf( "\n" );
499ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
500ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
501ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
502ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void test_dfp_two_arg_ops(int unused)
503ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj/* Shift instructions: first argument is the DFP source, second argument
504ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj * is 6 bit shift amount.
505ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj */
506ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
507ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   test_func_shift_t func;
508ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   unsigned long long u0, u0x;
509ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   unsigned int shift_by;
510ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   double res, d0, *d0p;
511ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   double d0x, *d0xp;
512ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   unsigned long round_mode;
513ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   int k = 0;
514ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
515ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   u0x = 0;
516ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   d0p = &d0;
517ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   d0xp = &d0x;
518ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
519ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   while ((func = dfp_two_arg_tests[k].test_func)) {
520ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      int i;
521ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
522ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      for (round_mode = 0; round_mode < NUM_RND_MODES; round_mode++) {
523ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         /* Do each test with each of the possible rounding modes */
524ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         dfp_test_t test_group = dfp_two_arg_tests[k];
525ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
526ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         printf("\ntest with rounding mode %lu \n", round_mode);
527ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
528ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         /* The set_rounding_mode() uses the global value f14. Call the
529ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          * function before setting up the test for the specific instruction
530ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          * to avoid avoid conflicts using f14.
531ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          */
532ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         set_rounding_mode(round_mode);
533ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
534ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         for (i = 0; i < test_group.num_tests; i++) {
535ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
536ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            shift_by = test_group.targs[i].frb_idx;
537ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
538ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            if (test_group.precision == LONG_TEST) {
539ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               u0 = dfp64_vals[test_group.targs[i].fra_idx];
540ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            } else {
541ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               u0 = dfp128_vals[test_group.targs[i].fra_idx * 2];
542ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               u0x = dfp128_vals[(test_group.targs[i].fra_idx * 2) + 1];
543ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            }
544ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
545ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            *(unsigned long long *)d0p = u0;
546ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            f14 = d0;
547ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            if (test_group.precision == QUAD_TEST) {
548ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               *(unsigned long long *)d0xp = u0x;
549ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               f15 = d0x;
550ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            }
551ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
552ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            (*func)(shift_by);
553ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            res = f18;
554ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
555ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            printf("%s %016llx", test_group.name, u0);
556ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
557ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            if (test_group.precision) {
558ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               printf(" %s %-3d => %016llx",
559ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      test_group.op, shift_by, *((unsigned long long *)(&res)));
560ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            } else {
561ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               double resx = f19;
562ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               printf(" %016llx %s %-3d  ==> %016llx %016llx",
563ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      u0x, test_group.op, shift_by,
564ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      *((unsigned long long *)(&res)),
565ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      *((unsigned long long *)(&resx)));
566ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            }
567ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            printf("\n" );
568ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         }
569ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      }
570ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
571ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      k++;
572ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      printf( "\n" );
573ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
574ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
575ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
576ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic void test_dcffix_dcffixq(int has_vsx)
577ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
578ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   test_func_t func;
5797ea7aa23b433745c5ba163add38415aa79c92344bart   unsigned long long u0;
580ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   double res, d0, *d0p;
581ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   int k = 0, round_mode;
582ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
583ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   d0p = &d0;
5847ea7aa23b433745c5ba163add38415aa79c92344bart
585ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
586ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   while ((func = dfp_dcffix_dcffixq_tests[k].test_func)) {
587ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      int i;
588ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
589ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      if ((!has_vsx) && (!strcmp("dcffix", dfp_dcffix_dcffixq_tests[k].name))) {
590ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         k++;
591ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         /* The test instruction is dcffix it is supported on POWER 7
592ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          * and newer processors.  Skip if not POWER 7 or newer.
593ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          */
594ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         continue;
595ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      }
596ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
597ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      for (round_mode = 0; round_mode < NUM_RND_MODES; round_mode++) {
598ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         /* Do each test with each of the possible rounding modes */
599ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         dfp_test_t test_group = dfp_dcffix_dcffixq_tests[k];
600ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
601ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         printf("\ntest with rounding mode %u \n", round_mode);
602ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
603ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         /* The set_rounding_mode() uses the global value f14. Call the
604ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          * function before setting up the test for the specific instruction
605ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          * to avoid avoid conflicts using f14.
606ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj          */
607ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         set_rounding_mode(round_mode);
608ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
609ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         for (i = 0; i < test_group.num_tests; i++) {
610ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
611ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            /* The instructions take I64 inputs */
612ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            u0 = int64_vals[test_group.targs[i].fra_idx];
613ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
614ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            *(unsigned long long *)d0p = u0;
615ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            f14 = d0;
616ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
617ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            (*func)();
618ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            res = f18;
619ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
620ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            printf("%s %016llx", test_group.name, u0);
621ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
622ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            if (test_group.precision) {
623ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               printf(" %s  => %016llx",
624ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      test_group.op, *((unsigned long long *)(&res)));
625ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            } else {
626ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               double resx = f19;
627ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj               printf(" %s ==> %016llx %016llx",
628ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      test_group.op,
629ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      *((unsigned long long *)(&res)),
630ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj                      *((unsigned long long *)(&resx)));
631ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            }
632ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj            printf("\n" );
633ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj         }
634ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      }
635ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
636ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      k++;
637ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      printf( "\n" );
638ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
639ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
640ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
641ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjstatic test_table_t
642ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjall_tests[] =
643ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj{
644ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   { &test_dfp_one_arg_ops,
645ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   "Test DFP fomat conversion instructions" },
646ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   { &test_dfp_two_arg_ops,
647ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   "Test DFP shift instructions" },
648ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   { test_dcffix_dcffixq,
649ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   "Test DCFFIX and DCFFIXQ instructions" },
650ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   { NULL, NULL }
651ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj};
652ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#endif // HAS_DFP
653ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
654ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardjint main(int argc, char ** argv, char ** envp) {
655ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#if defined(HAS_DFP)
656ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   test_table_t aTest;
657ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   test_func_t func;
658ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   int i = 0, has_vsx;
659ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
660ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   /* If the processor has the VSX functionality then it is POWER 7
661ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj    * or newer.
662ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj    */
663ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   my_envp = envp;
664ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   has_vsx = get_vsx();
665ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
666ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   while ((func = all_tests[i].test_category)) {
667ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      aTest = all_tests[i];
668ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      printf( "%s\n", aTest.name );
669ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      (*func)(has_vsx);
670ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj      i++;
671ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   }
672ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj
673ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj#endif // HAS_DFP
674ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj   return 0;
675ea8b02f730f184b4edb9ebe1ad07a5d823ef8155sewardj}
676