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