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