1a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes/* Copyright (C) 2012 IBM 2a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 3a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes Author: Maynard Johnson <maynardj@us.ibm.com> 4a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 5a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes This program is free software; you can redistribute it and/or 6a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes modify it under the terms of the GNU General Public License as 7a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes published by the Free Software Foundation; either version 2 of the 8a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes License, or (at your option) any later version. 9a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 10a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes This program is distributed in the hope that it will be useful, but 11a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes WITHOUT ANY WARRANTY; without even the implied warranty of 12a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes General Public License for more details. 14a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 15a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes You should have received a copy of the GNU General Public License 16a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes along with this program; if not, write to the Free Software 17a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 02111-1307, USA. 19a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 20a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes The GNU General Public License is contained in the file COPYING. 21a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 22a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 23a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdio.h> 24a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdlib.h> 25a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdint.h> 26a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 27a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#if defined(HAS_DFP) 28a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 29a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef union stuff { 30a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal64 dec_val; 31a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal128 dec_val128; 32a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long u64_val; 33a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes struct { 34a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#if defined(VGP_ppc64le_linux) 35a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long vall; 36a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long valu; 37a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#else 38a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long valu; 39a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long vall; 40a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#endif 41a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } u128; 42a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} dfp_val_t; 43a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 44a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 45a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef unsigned char Bool; 46a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define True 1 47a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define False 0 48a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 49a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 50a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7" 51a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 52a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_CR(_arg) \ 53a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mtcr %0" : : "b"(_arg) : ALLCR ); 54a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 55a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_XER(_arg) \ 56a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" ); 57a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 58a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define GET_CR(_lval) \ 59a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mfcr %0" : "=b"(_lval) ) 60a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 61a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define GET_XER(_lval) \ 62a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) ) 63a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 64a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define GET_CR_XER(_lval_cr,_lval_xer) \ 65a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0) 66a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 67a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_CR_ZERO \ 68a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_CR(0) 69a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 70a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_XER_ZERO \ 71a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_XER(0) 72a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 73a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_CR_XER_ZERO \ 74a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes do { SET_CR_ZERO; SET_XER_ZERO; } while (0) 75a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 76a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_FPSCR_ZERO \ 77a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes do { double _d = 0.0; \ 78a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \ 79a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } while (0) 80a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 81a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define GET_FPSCR(_arg) \ 82a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mffs %0" : "=f"(_arg) ) 83a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 84a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_FPSCR_DRN \ 85a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mtfsf 1, %0, 0, 1" : : "f"(f14) ) 86a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 87a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 88a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// The assembly-level instructions being tested 89a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 90a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes/* In _test_dtstdc[q], DCM can be one of 6 possible data classes, numbered 0-5. 91a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * In reality, DCM is a 6-bit mask field. We just test the individual values 92a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * and assume that masking multiple values would work OK. 93a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * BF is the condition register bit field which can range from 0-7. But for 94a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * testing purposes, we only use BF values of '0' and '5'. 95a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 96a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dtstdc(int BF, int DCM, dfp_val_t *val1, dfp_val_t *x1 __attribute__((unused))) 97a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 98a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal64 f14 = val1->dec_val; 99a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (DCM < 0 || DCM > 5 || !(BF == 0 || BF == 5)) { 100a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", BF, DCM); 101a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 102a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 103a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (DCM) { 104a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 105a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 106a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 5, %0, 1" : : "f" (f14)); 107a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 108a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 0, %0, 1" : : "f" (f14)); 109a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 110a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 111a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 112a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 5, %0, 2" : : "f" (f14)); 113a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 114a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 0, %0, 2" : : "f" (f14)); 115a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 116a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 117a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 118a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 5, %0, 4" : : "f" (f14)); 119a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 120a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 0, %0, 4" : : "f" (f14)); 121a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 122a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 123a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 124a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 5, %0, 8" : : "f" (f14)); 125a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 126a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 0, %0, 8" : : "f" (f14)); 127a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 128a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 129a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 130a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 5, %0, 16" : : "f" (f14)); 131a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 132a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 0, %0, 16" : : "f" (f14)); 133a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 134a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 135a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 136a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 5, %0, 32" : : "f" (f14)); 137a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 138a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdc 0, %0, 32" : : "f" (f14)); 139a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 140a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 141a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 142a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 143a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 144a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 145a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dtstdcq(int BF, int DCM, dfp_val_t *val1, dfp_val_t *x1 __attribute__((unused))) 146a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 147a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal128 f14 = val1->dec_val128; 148a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (DCM < 0 || DCM > 5 || !(BF == 0 || BF == 5)) { 149a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", BF, DCM); 150a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 151a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 152a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (DCM) { 153a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 154a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 155a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 5, %0, 1" : : "f" (f14)); 156a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 157a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 0, %0, 1" : : "f" (f14)); 158a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 159a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 160a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 161a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 5, %0, 2" : : "f" (f14)); 162a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 163a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 0, %0, 2" : : "f" (f14)); 164a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 165a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 166a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 167a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 5, %0, 4" : : "f" (f14)); 168a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 169a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 0, %0, 4" : : "f" (f14)); 170a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 171a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 172a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 173a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 5, %0, 8" : : "f" (f14)); 174a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 175a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 0, %0, 8" : : "f" (f14)); 176a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 177a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 178a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 179a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 5, %0, 16" : : "f" (f14)); 180a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 181a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 0, %0, 16" : : "f" (f14)); 182a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 183a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 184a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 185a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 5, %0, 32" : : "f" (f14)); 186a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 187a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdcq 0, %0, 32" : : "f" (f14)); 188a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 189a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 190a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 191a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 192a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 193a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 194a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes/* In _test_dtstdg[q], DGM can be one of 6 possible data groups, numbered 0-5. 195a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * In reality, DGM is a 6-bit mask field. We just test the individual values 196a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * and assume that masking multiple values would work OK. 197a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * BF is the condition register bit field which can range from 0-7. But for 198a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * testing purposes, we only use BF values of '0' and '5'. 199a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 200a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dtstdg(int BF, int DGM, dfp_val_t *val1, dfp_val_t *x1 __attribute__((unused))) 201a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 202a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal64 f14 = val1->dec_val; 203a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (DGM < 0 || DGM > 5 || !(BF == 0 || BF == 5)) { 204a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", BF, DGM); 205a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 206a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 207a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (DGM) { 208a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 209a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 210a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 5, %0, 1" : : "f" (f14)); 211a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 212a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 0, %0, 1" : : "f" (f14)); 213a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 214a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 215a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 216a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 5, %0, 2" : : "f" (f14)); 217a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 218a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 0, %0, 2" : : "f" (f14)); 219a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 220a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 221a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 222a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 5, %0, 4" : : "f" (f14)); 223a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 224a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 0, %0, 4" : : "f" (f14)); 225a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 226a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 227a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 228a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 5, %0, 8" : : "f" (f14)); 229a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 230a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 0, %0, 8" : : "f" (f14)); 231a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 232a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 233a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 234a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 5, %0, 16" : : "f" (f14)); 235a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 236a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 0, %0, 16" : : "f" (f14)); 237a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 238a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 239a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 240a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 5, %0, 32" : : "f" (f14)); 241a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 242a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdg 0, %0, 32" : : "f" (f14)); 243a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 244a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 245a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 246a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 247a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 248a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 249a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dtstdgq(int BF, int DGM, dfp_val_t *val1, dfp_val_t *x1 __attribute__((unused))) 250a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 251a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal128 f14 = val1->dec_val128; 252a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (DGM < 0 || DGM > 5 || !(BF == 0 || BF == 5)) { 253a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", BF, DGM); 254a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 255a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 256a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (DGM) { 257a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 258a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 259a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 5, %0, 1" : : "f" (f14)); 260a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 261a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 0, %0, 1" : : "f" (f14)); 262a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 263a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 264a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 265a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 5, %0, 2" : : "f" (f14)); 266a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 267a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 0, %0, 2" : : "f" (f14)); 268a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 269a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 270a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 271a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 5, %0, 4" : : "f" (f14)); 272a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 273a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 0, %0, 4" : : "f" (f14)); 274a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 275a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 276a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 277a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 5, %0, 8" : : "f" (f14)); 278a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 279a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 0, %0, 8" : : "f" (f14)); 280a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 281a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 282a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 283a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 5, %0, 16" : : "f" (f14)); 284a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 285a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 0, %0, 16" : : "f" (f14)); 286a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 287a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 288a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF) 289a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 5, %0, 32" : : "f" (f14)); 290a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 291a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstdgq 0, %0, 32" : : "f" (f14)); 292a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 293a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 294a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 295a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 296a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 297a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 298a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes/* In _test_dtstex[q], BF is the condition register bit field indicating the 299a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * CR field in which the result of the test should be placed. BF can range 300a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * from 0-7, but for testing purposes, we only use BF values of '4' and '7'. 301a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 302a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void 303a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes_test_dtstex(int BF, int x __attribute__((unused)), dfp_val_t *val1, dfp_val_t *val2) 304a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 305a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal64 f14 = val1->dec_val; 306a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal64 f16 = val2->dec_val; 307a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (!(BF == 4 || BF == 7)) { 308a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", BF); 309a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 310a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 311a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (BF) { 312a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 313a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstex 4, %0, %1" : : "f" (f14),"f" (f16)); 314a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 315a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 7: 316a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstex 7, %0, %1" : : "f" (f14),"f" (f16)); 317a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 318a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 319a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 320a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 321a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 322a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 323a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dtstexq(int BF, int x __attribute__((unused)), dfp_val_t *val1, dfp_val_t *val2) 324a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 325a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal128 f14 = val1->dec_val128; 326a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes _Decimal128 f16 = val2->dec_val128; 327a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (!(BF == 4 || BF == 7)) { 328a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", BF); 329a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 330a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 331a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (BF) { 332a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 333a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstexq 4, %0, %1" : : "f" (f14),"f" (f16)); 334a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 335a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 7: 336a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dtstexq 7, %0, %1" : : "f" (f14),"f" (f16)); 337a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 338a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 339a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 340a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 341a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 342a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 343a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 344a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 345a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef void (*test_funcp_t)(int a, int b, dfp_val_t *val1, dfp_val_t *val2); 346a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef void (*test_driver_func_t)(void); 347a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef struct test_table 348a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 349a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_driver_func_t test_category; 350a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes char * name; 351a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} test_table_t; 352a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 353a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes/* 354a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 345.0DD (0x2207c00000000000 0xe50) 355a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 1.2300e+5DD (0x2207c00000000000 0x14c000) 356a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * -16.0DD (0xa207c00000000000 0xe0) 357a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 0.00189DD (0x2206c00000000000 0xcf) 358a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * -4.1235DD (0xa205c00000000000 0x10a395bcf) 359a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 9.8399e+20DD (0x2209400000000000 0x253f1f534acdd4) 360a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 0DD (0x2208000000000000 0x0) 361a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 0DD (0x2208000000000000 0x0) 362a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * infDD (0x7800000000000000 0x0) 363a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * nanDD (0x7c00000000000000 0x0 364a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 365a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic unsigned long long dfp128_vals[] = { 366a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // Some finite numbers 367a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2207c00000000000ULL, 0x0000000000000e50ULL, 368a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2207c00000000000ULL, 0x000000000014c000ULL, 369a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa207c00000000000ULL, 0x00000000000000e0ULL, 370a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2206c00000000000ULL, 0x00000000000000cfULL, 371a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa205c00000000000ULL, 0x000000010a395bcfULL, 372a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x6209400000fd0000ULL, 0x00253f1f534acdd4ULL, // huge number 373a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x000400000089b000ULL, 0x0a6000d000000049ULL, // very small number 374a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of zero 375a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2208000000000000ULL, 0x0000000000000000ULL, 376a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa208000000000000ULL, 0x0000000000000000ULL, // negative 377a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa248000000000000ULL, 0x0000000000000000ULL, 378a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of NAN 379a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7c00000000000000ULL, 0x0000000000000000ULL, // quiet 380a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xfc00000000000000ULL, 0xc00100035b007700ULL, 381a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7e00000000000000ULL, 0xfe000000d0e0a0d0ULL, // signaling 382a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of Infinity 383a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7800000000000000ULL, 0x0000000000000000ULL, 384a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xf800000000000000ULL, 0x0000000000000000ULL, // negative 385a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xf900000000000000ULL, 0x0000000000000000ULL 386a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 387a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 388a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic unsigned long long dfp64_vals[] = { 389a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // various finite numbers 390a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2234000000000e50ULL, 391a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x223400000014c000ULL, 392a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa2340000000000e0ULL,// negative 393a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x22240000000000cfULL, 394a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa21400010a395bcfULL,// negative 395a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x6e4d3f1f534acdd4ULL,// huge number 396a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x000400000089b000ULL,// very small number 397a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of zero 398a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2238000000000000ULL, 399a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa238000000000000ULL, 400a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x4248000000000000ULL, 401a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of NAN 402a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7e34000000000111ULL, 403a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xfe000000d0e0a0d0ULL,//signaling 404a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xfc00000000000000ULL,//quiet 405a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of Infinity 406a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7800000000000000ULL, 407a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xf800000000000000ULL,//negative 408a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7a34000000000000ULL, 409a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 410a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 411a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// Both Long and Quad arrays of DFP values should have the same length, so it 412a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// doesn't matter which array I use for calculating the following #define. 413a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define NUM_DFP_VALS (sizeof(dfp64_vals)/8) 414a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 415a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef struct dfp_test_args { 416a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int fra_idx; 417a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int frb_idx; 418a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} dfp_test_args_t; 419a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 420a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 421a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// Index pairs from dfp64_vals array to be used with dfp_two_arg_tests 422a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_test_args_t dfp_2args_x1[] = { 423a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {0, 1}, 424a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {2, 1}, 425a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {4, 3}, 426a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {6, 0}, 427a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {2, 4}, 428a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {5, 1}, 429a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {5, 2}, 430a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {7, 1}, 431a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {7, 2}, 432a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {8, 0}, 433a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {8, 1}, 434a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {8, 2}, 435a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {7, 8}, 436a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 14}, 437a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 1}, 438a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 13}, 439a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 12}, 440a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 11}, 441a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {11, 14}, 442a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {11, 0}, 443a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {11, 13}, 444a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {11, 11}, 445a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {14, 14}, 446a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {14, 3}, 447a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {14, 15}, 448a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 449a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 450a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef enum { 451a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes LONG_TEST, 452a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes QUAD_TEST 453a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} precision_type_t; 454a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 455a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef struct dfp_test 456a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 457a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_funcp_t test_func; 458a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes const char * name; 459a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_test_args_t * targs; 460a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int num_tests; 461a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes precision_type_t precision; 462a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes const char * op; 463a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} dfp_test_t; 464a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 465a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef struct dfp_one_arg_test 466a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 467a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_funcp_t test_func; 468a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes const char * name; 469a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes precision_type_t precision; 470a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes const char * op; 471a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} dfp_one_arg_test_t; 472a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 473a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 474a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 475a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_one_arg_test_t 476a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesdfp_ClassAndGroupTest_tests[] = { 477a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dtstdc, "dtstdc", LONG_TEST, "[tCls]"}, 478a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dtstdcq, "dtstdcq", QUAD_TEST, "[tCls]"}, 479a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dtstdg, "dtstdg", LONG_TEST, "[tGrp]"}, 480a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dtstdgq, "dtstdgq", QUAD_TEST, "[tGrp]"}, 481a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL, 0, NULL} 482a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 483a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 484a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void test_dfp_ClassAndGroupTest_ops(void) 485a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 486a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_funcp_t func; 487a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_val_t test_val, dummy; 488a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 489a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int k = 0; 490a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 491a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = dfp_ClassAndGroupTest_tests[k].test_func)) { 492a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i; 493a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_one_arg_test_t test_def = dfp_ClassAndGroupTest_tests[k]; 494a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 495a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NUM_DFP_VALS; i++) { 496a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int data_class_OR_group, BF = 0; 497a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes Bool repeat = True; 498a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 499a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 500a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val.u64_val = dfp64_vals[i]; 501a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 502a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val.u128.valu = dfp128_vals[i * 2]; 503a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val.u128.vall = dfp128_vals[(i * 2) + 1]; 504a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 505a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 506a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesagain: 507a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (data_class_OR_group = 0; data_class_OR_group < 6; data_class_OR_group++) { 508a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned int condreg; 509a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned int flags; 510a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_FPSCR_ZERO; 511a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_CR_XER_ZERO; 512a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 513a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* There is an ABI change in how 128 bit arguments are aligned 514a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * with GCC 5.0. The compiler generates a "note" about this 515a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * starting with GCC 4.8. To avoid generating the "note", pass 516a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * the address of the 128-bit arguments rather then the value. 517a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 518a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(BF, data_class_OR_group, &test_val, &dummy); 519a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes GET_CR(flags); 520a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 521a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes condreg = ((flags >> (4 * (7-BF)))) & 0xf; 522a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s (DC/DG=%d) %s", test_def.name, data_class_OR_group, 523a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_def.op); 524a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 525a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%016llx %016llx", test_val.u128.valu, test_val.u128.vall); 526a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 527a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%016llx", test_val.u64_val); 528a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 529a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 530a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes //%016llx 531a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" => %x (BF=%d)\n", condreg, BF); 532a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 533a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (repeat) { 534a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes repeat = False; 535a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes BF = 5; 536a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes goto again; 537a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 538a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 539a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes k++; 540a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "\n" ); 541a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 542a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 543a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 544a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 545a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_test_t 546a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesdfp_ExpTest_tests[] = { 547a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dtstex, "dtstex", dfp_2args_x1, 25, LONG_TEST, "[tExp]"}, 548a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dtstexq, "dtstexq", dfp_2args_x1, 25, QUAD_TEST, "[tExp]"}, 549a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL, NULL, 0, 0, NULL} 550a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 551a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 552a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 553a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void test_dfp_ExpTest_ops(void) 554a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 555a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_val_t test_val1, test_val2; 556a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_funcp_t func; 557a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int k = 0; 558a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 559a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = dfp_ExpTest_tests[k].test_func)) { 560a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* BF is a 3-bit instruction field that indicates the CR field in which the 561a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * result of the test should be placed. We won't iterate through all 562a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 8 possible BF values since storing compare results to a given field is 563a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * a well-tested mechanism in VEX. But we will test two BF values, just as 564a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * a sniff-test. 565a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 566a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i, repeat = 1, BF = 4; 567a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_test_t test_def = dfp_ExpTest_tests[k]; 568a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 569a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesagain: 570a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < test_def.num_tests; i++) { 571a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned int condreg; 572a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned int flags; 573a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 574a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 575a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val1.u64_val = dfp64_vals[test_def.targs[i].fra_idx]; 576a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val2.u64_val = dfp64_vals[test_def.targs[i].frb_idx]; 577a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 578a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val1.u128.valu = dfp128_vals[test_def.targs[i].fra_idx * 2]; 579a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val1.u128.vall = dfp128_vals[(test_def.targs[i].fra_idx * 2) + 1]; 580a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val2.u128.valu = dfp128_vals[test_def.targs[i].frb_idx * 2]; 581a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val2.u128.vall = dfp128_vals[(test_def.targs[i].frb_idx * 2) + 1]; 582a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 583a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 584a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_FPSCR_ZERO; 585a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_CR_XER_ZERO; 586a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* There is an ABI change in how 128 bit arguments are aligned 587a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * with GCC 5.0. The compiler generates a "note" about this 588a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * starting with GCC 4.8. To avoid generating the "note", pass 589a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * the address of the 128-bit arguments rather then the value. 590a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 591a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(BF, 0, &test_val1, &test_val2); 592a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes GET_CR(flags); 593a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 594a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes condreg = ((flags >> (4 * (7-BF)))) & 0xf; 595a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s ", test_def.name); 596a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 597a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%016llx %s %016llx ", 598a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val1.u64_val, test_def.op, test_val2.u64_val); 599a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 600a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%016llx %016llx %s %016llx %016llx ", 601a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_val1.u128.valu, test_val1.u128.vall, test_def.op, test_val2.u128.valu, test_val2.u128.vall); 602a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 603a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" => %x (BF=%d)\n", condreg, BF); 604a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 605a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (repeat) { 606a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes repeat = 0; 607a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes BF = 7; 608a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes goto again; 609a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 610a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes k++; 611a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "\n" ); 612a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 613a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 614a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 615a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 616a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic test_table_t 617a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes all_tests[] = 618a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 619a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &test_dfp_ExpTest_ops, 620a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes "Test DFP exponent test instructions"}, 621a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &test_dfp_ClassAndGroupTest_ops, 622a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes "Test DFP class and group test instructions"}, 623a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL } 624a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 625a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#endif // HAS_DFP 626a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 627a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesint main() { 628a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#if defined(HAS_DFP) 629a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 630a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_table_t aTest; 631a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_driver_func_t func; 632a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i = 0; 633a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 634a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = all_tests[i].test_category)) { 635a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes aTest = all_tests[i]; 636a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "%s\n", aTest.name ); 637a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(); 638a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes i++; 639a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 640a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 641a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#endif // HAS_DFP 642a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return 0; 643a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 644