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