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