1b0ccb4d09a74c94a712b2edf9894b408f270493asewardj/*  Copyright (C) 2012 IBM
2b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
3b0ccb4d09a74c94a712b2edf9894b408f270493asewardj Author: Maynard Johnson <maynardj@us.ibm.com>
4b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
5b0ccb4d09a74c94a712b2edf9894b408f270493asewardj This program is free software; you can redistribute it and/or
6b0ccb4d09a74c94a712b2edf9894b408f270493asewardj modify it under the terms of the GNU General Public License as
7b0ccb4d09a74c94a712b2edf9894b408f270493asewardj published by the Free Software Foundation; either version 2 of the
8b0ccb4d09a74c94a712b2edf9894b408f270493asewardj License, or (at your option) any later version.
9b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
10b0ccb4d09a74c94a712b2edf9894b408f270493asewardj This program is distributed in the hope that it will be useful, but
11b0ccb4d09a74c94a712b2edf9894b408f270493asewardj WITHOUT ANY WARRANTY; without even the implied warranty of
12b0ccb4d09a74c94a712b2edf9894b408f270493asewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13b0ccb4d09a74c94a712b2edf9894b408f270493asewardj General Public License for more details.
14b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
15b0ccb4d09a74c94a712b2edf9894b408f270493asewardj You should have received a copy of the GNU General Public License
16b0ccb4d09a74c94a712b2edf9894b408f270493asewardj along with this program; if not, write to the Free Software
17b0ccb4d09a74c94a712b2edf9894b408f270493asewardj Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18b0ccb4d09a74c94a712b2edf9894b408f270493asewardj 02111-1307, USA.
19b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
20b0ccb4d09a74c94a712b2edf9894b408f270493asewardj The GNU General Public License is contained in the file COPYING.
21b0ccb4d09a74c94a712b2edf9894b408f270493asewardj */
22b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
23b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#include <stdio.h>
24b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#include <stdlib.h>
25b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#include <stdint.h>
26b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
27b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#if defined(HAS_DFP)
28b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
29b0ccb4d09a74c94a712b2edf9894b408f270493asewardjregister double f14 __asm__ ("fr14");
30b0ccb4d09a74c94a712b2edf9894b408f270493asewardjregister double f15 __asm__ ("fr15");
31b0ccb4d09a74c94a712b2edf9894b408f270493asewardjregister double f16 __asm__ ("fr16");
32b0ccb4d09a74c94a712b2edf9894b408f270493asewardjregister double f17 __asm__ ("fr17");
33b0ccb4d09a74c94a712b2edf9894b408f270493asewardjregister double f18 __asm__ ("fr18");
34b0ccb4d09a74c94a712b2edf9894b408f270493asewardjregister double f19 __asm__ ("fr19");
35b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
36b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
37b0ccb4d09a74c94a712b2edf9894b408f270493asewardjtypedef unsigned char Bool;
38b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define True 1
39b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define False 0
40b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
41b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
42b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
43b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
44b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define SET_CR(_arg) \
45b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("mtcr  %0" : : "b"(_arg) : ALLCR );
46b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
47b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define SET_XER(_arg) \
48b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" );
49b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
50b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define GET_CR(_lval) \
51b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("mfcr %0"  : "=b"(_lval) )
52b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
53b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define GET_XER(_lval) \
54b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) )
55b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
56b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define GET_CR_XER(_lval_cr,_lval_xer) \
57b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0)
58b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
59b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define SET_CR_ZERO \
60b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      SET_CR(0)
61b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
62b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define SET_XER_ZERO \
63b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      SET_XER(0)
64b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
65b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define SET_CR_XER_ZERO \
66b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   do { SET_CR_ZERO; SET_XER_ZERO; } while (0)
67b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
68b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define SET_FPSCR_ZERO \
69b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   do { double _d = 0.0; \
70b0ccb4d09a74c94a712b2edf9894b408f270493asewardj        __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
71b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   } while (0)
72b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
73b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define GET_FPSCR(_arg) \
74b0ccb4d09a74c94a712b2edf9894b408f270493asewardj    __asm__ __volatile__ ("mffs %0"  : "=f"(_arg) )
75b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
76b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define SET_FPSCR_DRN \
77b0ccb4d09a74c94a712b2edf9894b408f270493asewardj    __asm__ __volatile__ ("mtfsf  1, %0, 0, 1" :  : "f"(f14) )
78b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
79b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
80b0ccb4d09a74c94a712b2edf9894b408f270493asewardj// The assembly-level instructions being tested
81b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic Bool do_dot;
82b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_dadd (void)
83b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
84b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (do_dot)
85b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dadd. %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
86b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
87b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dadd %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
88b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
89b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
90b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_dsub (void)
91b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
92b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (do_dot)
93b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dsub. %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
94b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
95b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dsub %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
96b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
97b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
98b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_dmul (void)
99b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
100b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (do_dot)
101b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dmul. %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
102b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
103b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dmul %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
104b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
105b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
106b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_ddiv (void)
107b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
108b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (do_dot)
109b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("ddiv. %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
110b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
111b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("ddiv %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
112b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
113b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
114b0ccb4d09a74c94a712b2edf9894b408f270493asewardj// Quad DFP arith instructions
115b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_daddq (void)
116b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
117b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (do_dot)
118b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("daddq. %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
119b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
120b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("daddq %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
121b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
122b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
123b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_dsubq (void)
124b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
125b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (do_dot)
126b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dsubq. %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
127b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
128b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dsubq %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
129b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
130b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
131b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_dmulq (void)
132b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
133b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (do_dot)
134b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dmulq. %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
135b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
136b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("dmulq %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
137b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
138b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
139b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_ddivq (void)
140b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
141b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (do_dot)
142b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("ddivq. %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
143b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
144b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("ddivq %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16));
145b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
146b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
147b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_mffs (void)
148b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
149b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   __asm__ __volatile__ ("mffs %0"  : "=f"(f14));
150b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
151b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
152b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void _test_mtfsf (int upper)
153b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
154b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (upper)
155b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("mtfsf  1, %0, 0, 1" :  : "f"(f14) );
156b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   else
157b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      __asm__ __volatile__ ("mtfsf  1, %0, 0, 0" :  : "f"(f14) );
158b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
159b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
160b0ccb4d09a74c94a712b2edf9894b408f270493asewardjtypedef void (*test_func_t)(void);
161b0ccb4d09a74c94a712b2edf9894b408f270493asewardjtypedef struct test_table
162b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
163b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   test_func_t test_category;
164b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   char * name;
165b0ccb4d09a74c94a712b2edf9894b408f270493asewardj} test_table_t;
166b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
167b0ccb4d09a74c94a712b2edf9894b408f270493asewardj/*
168b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  345.0DD (0x2207c00000000000 0xe50)
169b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  1.2300e+5DD (0x2207c00000000000 0x14c000)
170b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  -16.0DD (0xa207c00000000000 0xe0)
171b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  0.00189DD (0x2206c00000000000 0xcf)
172b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  -4.1235DD (0xa205c00000000000 0x10a395bcf)
173b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  9.8399e+20DD (0x2209400000000000 0x253f1f534acdd4)
174b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  0DD (0x2208000000000000 0x0)
175b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  0DD (0x2208000000000000 0x0)
176b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  infDD (0x7800000000000000 0x0)
177b0ccb4d09a74c94a712b2edf9894b408f270493asewardj *  nanDD (0x7c00000000000000 0x0
178b0ccb4d09a74c94a712b2edf9894b408f270493asewardj */
179b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic unsigned long long dfp128_vals[] = {
180b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    // Some finite numbers
181b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x2207c00000000000ULL, 0x0000000000000e50ULL,
182b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x2207c00000000000ULL, 0x000000000014c000ULL,
183b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0xa207c00000000000ULL, 0x00000000000000e0ULL,
184b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x2206c00000000000ULL, 0x00000000000000cfULL,
185b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0xa205c00000000000ULL, 0x000000010a395bcfULL,
186b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x6209400000fd0000ULL, 0x00253f1f534acdd4ULL, // huge number
187b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x000400000089b000ULL, 0x0a6000d000000049ULL, // very small number
188b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    // flavors of zero
189b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x2208000000000000ULL, 0x0000000000000000ULL,
190b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0xa208000000000000ULL, 0x0000000000000000ULL, // negative
191b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0xa248000000000000ULL, 0x0000000000000000ULL,
192b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    // flavors of NAN
193b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x7c00000000000000ULL, 0x0000000000000000ULL, // quiet
194b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0xfc00000000000000ULL, 0xc00100035b007700ULL,
195b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x7e00000000000000ULL, 0xfe000000d0e0a0d0ULL, // signaling
196b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    // flavors of Infinity
197b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0x7800000000000000ULL, 0x0000000000000000ULL,
198b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0xf800000000000000ULL, 0x0000000000000000ULL, // negative
199b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    0xf900000000000000ULL, 0x0000000000000000ULL
200b0ccb4d09a74c94a712b2edf9894b408f270493asewardj};
201b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
202b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic unsigned long long dfp64_vals[] = {
203b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 // various finite numbers
204b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x2234000000000e50ULL,
205b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x223400000014c000ULL,
206b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0xa2340000000000e0ULL,// negative
207b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x22240000000000cfULL,
208b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0xa21400010a395bcfULL,// negative
209b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x6e4d3f1f534acdd4ULL,// huge number
210b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x000400000089b000ULL,// very small number
211b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 // flavors of zero
212b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x2238000000000000ULL,
213b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0xa238000000000000ULL,
214b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x4248000000000000ULL,
215b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 // flavors of NAN
216b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x7e34000000000111ULL,
217b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0xfe000000d0e0a0d0ULL,//signaling
218b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0xfc00000000000000ULL,//quiet
219b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 // flavors of Infinity
220b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x7800000000000000ULL,
221b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0xf800000000000000ULL,//negative
222b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                 0x7a34000000000000ULL,
223b0ccb4d09a74c94a712b2edf9894b408f270493asewardj};
224b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
225b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
226b0ccb4d09a74c94a712b2edf9894b408f270493asewardjtypedef struct dfp_test_args {
227b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   int fra_idx;
228b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   int frb_idx;
229b0ccb4d09a74c94a712b2edf9894b408f270493asewardj} dfp_test_args_t;
230b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
231b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
232b0ccb4d09a74c94a712b2edf9894b408f270493asewardj// Index pairs from dfp64_vals or dfp128_vals array to be used with dfp_two_arg_tests
233b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic dfp_test_args_t dfp_2args_x2[] = {
234b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {0, 1},
235b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {2, 1},
236b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {3, 4},
237b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {0, 6},
238b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {2, 4},
239b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {5, 1},
240b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {5, 2},
241b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {7, 8},
242b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {7, 1},
243b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {9, 15},
244b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {8, 12},
245b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {7, 11},
246b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {13, 2},
247b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {13, 14},
248b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {15, 12},
249b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {14, 11},
250b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {12, 12},
251b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {12, 11},
252b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                  {11, 11}
253b0ccb4d09a74c94a712b2edf9894b408f270493asewardj};
254b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
255b0ccb4d09a74c94a712b2edf9894b408f270493asewardj// Index pairs from dfp64_vals array to be used with dfp_two_arg_tests
256b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic dfp_test_args_t dfp_2args_x1[] = {
257b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {0, 1},
258b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {2, 1},
259b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {3, 4},
260b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {0, 6},
261b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {2, 4},
262b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {5, 1},
263b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {5, 2},
264b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {7, 1},
265b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {7, 2},
266b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {8, 0},
267b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {8, 1},
268b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {8, 2},
269b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {7, 8},
270b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {12, 14},
271b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {12, 1},
272b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {12, 13},
273b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {12, 12},
274b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {12, 11},
275b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {11, 14},
276b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {11, 0},
277b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {11, 13},
278b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {11, 11},
279b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {14, 14},
280b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {14, 3},
281b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                                    {14, 15},
282b0ccb4d09a74c94a712b2edf9894b408f270493asewardj};
283b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
284b0ccb4d09a74c94a712b2edf9894b408f270493asewardjtypedef enum {
285b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   LONG_TEST,
286b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   QUAD_TEST
287b0ccb4d09a74c94a712b2edf9894b408f270493asewardj} precision_type_t;
288b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
289b0ccb4d09a74c94a712b2edf9894b408f270493asewardjtypedef struct dfp_test
290b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
291b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   test_func_t test_func;
292b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   const char * name;
293b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   dfp_test_args_t * targs;
294b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   int num_tests;
295b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   precision_type_t precision;
296b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   const char * op;
297b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   Bool cr_supported;
298b0ccb4d09a74c94a712b2edf9894b408f270493asewardj} dfp_test_t;
299b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
300b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
301b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic dfp_test_t
302b0ccb4d09a74c94a712b2edf9894b408f270493asewardjdfp_two_arg_tests[] = {
303b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { &_test_dadd, "dadd", dfp_2args_x1, 25, LONG_TEST, "+", False},
304b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { &_test_dsub, "dsub", dfp_2args_x1, 25, LONG_TEST, "-", False},
305b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { &_test_dmul, "dmul", dfp_2args_x2, 19, LONG_TEST, "*", False},
306b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { &_test_ddiv, "ddiv", dfp_2args_x2, 19, LONG_TEST, "/", False},
307b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { &_test_daddq, "daddq", dfp_2args_x1, 25, QUAD_TEST, "+", False},
308b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { &_test_dsubq, "dsubq", dfp_2args_x1, 25, QUAD_TEST, "-", False},
309b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { &_test_dmulq, "dmulq", dfp_2args_x2, 19, QUAD_TEST, "*", False},
310b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { &_test_ddivq, "ddivq", dfp_2args_x2, 19, QUAD_TEST, "/", False},
311b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                     { NULL, NULL, NULL, 0, 0, NULL}
312b0ccb4d09a74c94a712b2edf9894b408f270493asewardj};
313b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
314b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic void test_dfp_two_arg_ops(void)
315b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
316b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   test_func_t func;
317b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   unsigned long long u0, u0x, u1, u1x;
318b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   double res, d0, d1, *d0p, *d1p;
319b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   double d0x, d1x, *d0xp, *d1xp;
320b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   int k = 0;
321b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   u0x = u1x = 0;
322b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   d0p = &d0;
323b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   d0xp = &d0x;
324b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   d1p = &d1;
325b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   d1xp = &d1x;
326b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
327b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   while ((func = dfp_two_arg_tests[k].test_func)) {
328b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      int i, repeat = 1;
329b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      dfp_test_t test_group = dfp_two_arg_tests[k];
330b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      do_dot = False;
331b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
332b0ccb4d09a74c94a712b2edf9894b408f270493asewardjagain:
333b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      for (i = 0; i < test_group.num_tests; i++) {
334b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         unsigned int condreg;
335b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         unsigned int flags;
336b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
337b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         if (test_group.precision == LONG_TEST) {
338b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            u0 = dfp64_vals[test_group.targs[i].fra_idx];
339b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            u1 = dfp64_vals[test_group.targs[i].frb_idx];
340b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         } else {
341b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            u0 = dfp128_vals[test_group.targs[i].fra_idx * 2];
342b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            u0x = dfp128_vals[(test_group.targs[i].fra_idx * 2) + 1];
343b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            u1 = dfp128_vals[test_group.targs[i].frb_idx * 2];
344b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            u1x = dfp128_vals[(test_group.targs[i].frb_idx * 2) + 1];
345b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         }
346b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *(unsigned long long *)d0p = u0;
347b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *(unsigned long long *)d1p = u1;
348b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         f14 = d0;
349b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         f16 = d1;
350b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         if (test_group.precision == QUAD_TEST) {
351b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            *(unsigned long long *)d0xp = u0x;
352b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            *(unsigned long long *)d1xp = u1x;
353b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            f15 = d0x;
354b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            f17 = d1x;
355b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         }
356b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
357b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         SET_FPSCR_ZERO;
358b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         SET_CR_XER_ZERO;
359b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         (*func)();
360b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         GET_CR(flags);
361b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         res = f18;
362b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
363b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         condreg = (flags & 0x000000f0) >> 4;
364b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         printf("%s%s %016llx", test_group.name, do_dot? "." : "", u0);
365b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         if (test_group.precision == LONG_TEST) {
366b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            printf(" %s %016llx => %016llx",
367b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                   test_group.op, u1, *((unsigned long long *)(&res)));
368b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         } else {
369b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            double resx = f19;
370b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            printf(" %016llx %s %016llx %016llx ==> %016llx %016llx",
371b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                   u0x, test_group.op, u1, u1x,
372b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                   *((unsigned long long *)(&res)), *((unsigned long long *)(&resx)));
373b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         }
374b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         if (test_group.cr_supported)
375b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            printf(" (cr = %08x)\n", condreg);
376b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         else
377b0ccb4d09a74c94a712b2edf9894b408f270493asewardj            printf("\n");
378b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
379b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      }
380b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      printf("\n");
381b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      if (repeat) {
382b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         repeat = 0;
383b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         do_dot = True;
384b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         goto again;
385b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      }
386b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      k++;
387b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      printf( "\n" );
388b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   }
389b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
390b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
391b0ccb4d09a74c94a712b2edf9894b408f270493asewardjvoid test_move_toFrom_fpscr(void)
392b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
393b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#define BFP_MAX_RM 3
394b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   int shift = 0;
395b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   unsigned long long i, max_rm, expected_val;
396b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   double fpscr_in, fpscr_out;
397b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   unsigned long long * hex_fpscr_in = (unsigned long long *)&fpscr_in;
398b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   unsigned long long * hex_fpscr_out = (unsigned long long *)&fpscr_out;
399b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
400b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
401b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   max_rm = 4;
402b0ccb4d09a74c94a712b2edf9894b408f270493asewardjagain:
403b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   /* NOTE: The first time through this loop is for setting the binary
404b0ccb4d09a74c94a712b2edf9894b408f270493asewardj    * floating point rounding mode (bits 62:63 of FPSCR).  The second time
405b0ccb4d09a74c94a712b2edf9894b408f270493asewardj    * through is for setting the decimal floating point rounding mode
406b0ccb4d09a74c94a712b2edf9894b408f270493asewardj    * (bits 29:31 of FPSCR).  In the second time through this loop, the value
407b0ccb4d09a74c94a712b2edf9894b408f270493asewardj    * returned should include the final binary FP rounding mode, along with
408b0ccb4d09a74c94a712b2edf9894b408f270493asewardj    * the decimal FP rounding modes.
409b0ccb4d09a74c94a712b2edf9894b408f270493asewardj    */
410b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   for (i = 0; i < max_rm; i++) {
411b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      *hex_fpscr_in = (i << shift);
412b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      f14 = fpscr_in;
413b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      _test_mtfsf(max_rm/8);
414b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      *hex_fpscr_in = 0ULL;
415b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      f14= fpscr_in;
416b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      _test_mffs();
417b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      fpscr_out = f14;
418b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      if (max_rm == 4) {
419b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *hex_fpscr_out &= (max_rm - 1) << shift;
420b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         expected_val = i << shift;
421b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      } else {
422b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *hex_fpscr_out &= BFP_MAX_RM | ((max_rm - 1) << shift);
423b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         expected_val = (i << shift) | BFP_MAX_RM;
424b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      }
425b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
426b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      printf("FPSCR %s floating point rounding mode %016llx == %016llx? %s\n",
427b0ccb4d09a74c94a712b2edf9894b408f270493asewardj             (max_rm == 8) ? "decimal" : "binary",
428b0ccb4d09a74c94a712b2edf9894b408f270493asewardj             *hex_fpscr_out, expected_val,
429b0ccb4d09a74c94a712b2edf9894b408f270493asewardj             (expected_val == *hex_fpscr_out) ? "yes" : "no");
430b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   }
431b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   if (max_rm == 4) {
432b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      max_rm = 8;
433b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      shift = 32;
434b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      goto again;
435b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   }
436b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
437b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
438b0ccb4d09a74c94a712b2edf9894b408f270493asewardjvoid test_rounding_modes(void)
439b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
440b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   int j;
441b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   unsigned long long u0, u1, rm_idx;
442b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   double res, d0, d1, *d0p, *d1p, fpscr;
443b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   unsigned long long * hex_fpscr = (unsigned long long *)&fpscr;
444b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   u0 = 0x26cc3f1f534acdd4ULL;
445b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   u1 = 0x27feff197a42ba06ULL;
446b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   d0p = &d0;
447b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   d1p = &d1;
448b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
449b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   for (j = 0; j < 12; j++) {
450b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      for (rm_idx = 0; rm_idx < 8; rm_idx++) {
451b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *hex_fpscr = 0ULL;
452b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         __asm__ __volatile__ ("mffs %0"  : "=f"(f14));
453b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         fpscr = f14;
454b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *hex_fpscr &= 0xFFFFFFF0FFFFFFFFULL;
455b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *hex_fpscr |= (rm_idx << 32);
456b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         f14 = fpscr;
457b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         SET_FPSCR_DRN;
458b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *(unsigned long long *)d0p = u0;
459b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         *(unsigned long long *)d1p = u1;
460b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         f14 = d0;
461b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         f16 = d1;
462b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         _test_dmul();
463b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         res = f18;
464b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         printf("test #%d: dmul with rounding mode %d: %016llx * %016llx => %016llx\n",
465b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                j, (int)rm_idx, u0, u1, *((unsigned long long *)(&res)));
466b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         printf("\n");
467b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      }
468b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      // Changing the least significant bit of one of the dmul arguments give us more
469b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      // opportunities for different rounding modes to yield different results which
470b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      // can then be validated.
471b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      u0++;
472b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   }
473b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
474b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
475b0ccb4d09a74c94a712b2edf9894b408f270493asewardjstatic test_table_t
476b0ccb4d09a74c94a712b2edf9894b408f270493asewardj         all_tests[] =
477b0ccb4d09a74c94a712b2edf9894b408f270493asewardj{
478b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                    { &test_dfp_two_arg_ops,
479b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                      "Test DFP arithmetic instructions"},
480b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                    { &test_rounding_modes,
481b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                      "Test DFP rounding modes"},
482b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                    { &test_move_toFrom_fpscr,
483b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                    "Test move to/from FPSCR"},
484b0ccb4d09a74c94a712b2edf9894b408f270493asewardj                    { NULL, NULL }
485b0ccb4d09a74c94a712b2edf9894b408f270493asewardj};
486b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#endif // HAS_DFP
487b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
488b0ccb4d09a74c94a712b2edf9894b408f270493asewardjint main() {
489b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#if defined(HAS_DFP)
490b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
491b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   test_table_t aTest;
492b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   test_func_t func;
493b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   int i = 0;
494b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
495b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   while ((func = all_tests[i].test_category)) {
496b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      aTest = all_tests[i];
497b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      printf( "%s\n", aTest.name );
498b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      (*func)();
499b0ccb4d09a74c94a712b2edf9894b408f270493asewardj      i++;
500b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   }
501b0ccb4d09a74c94a712b2edf9894b408f270493asewardj
502b0ccb4d09a74c94a712b2edf9894b408f270493asewardj#endif // HAS_DFP
503b0ccb4d09a74c94a712b2edf9894b408f270493asewardj   return 0;
504b0ccb4d09a74c94a712b2edf9894b408f270493asewardj}
505