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